Merge branch 'master' into cyy_ops_test
This commit is contained in:
+17
-1
@@ -1,4 +1,10 @@
|
||||
stages:
|
||||
- sonar
|
||||
- unit_test
|
||||
- cleanup_packages
|
||||
- package
|
||||
sonarqube:
|
||||
stage: sonar
|
||||
variables:
|
||||
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
|
||||
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
|
||||
@@ -11,12 +17,21 @@ sonarqube:
|
||||
allow_failure: true
|
||||
only:
|
||||
- master # or the name of your main branch
|
||||
packages:
|
||||
package:
|
||||
stage: package
|
||||
script:
|
||||
- make cizip
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
unit_test:
|
||||
stage: unit_test
|
||||
script:
|
||||
- "/home/gitlab-runner/bin/zentao-unittest.sh ${CI_PROJECT_DIR}"
|
||||
allow_failure: true
|
||||
only:
|
||||
- master
|
||||
- merge_requests
|
||||
#notify:
|
||||
# script:
|
||||
# - 'curl --location --request POST ''http://api.lf.oop.cc/api/v1/xuan/chatMessage'' --header ''Content-Type: application/json'' --data-raw ''{"gid": "84be4c6e-02e3-4fdc-b081-318c0c1eca02", "title": "开源包下载地址", "content": "点击查看详情链接", "url": "http://10.0.7.242:8080/allpacks/"}'''
|
||||
@@ -24,6 +39,7 @@ packages:
|
||||
# only:
|
||||
# - master
|
||||
cleanup_packages:
|
||||
stage: cleanup_packages
|
||||
script:
|
||||
- make clean
|
||||
when: on_failure
|
||||
|
||||
@@ -20,9 +20,8 @@ class executionEntry extends Entry
|
||||
*/
|
||||
public function get($executionID)
|
||||
{
|
||||
$fields = $this->param('fields');
|
||||
$productID = $this->param('productID');
|
||||
$status = $this->param('status', 'all');
|
||||
$fields = $this->param('fields');
|
||||
$status = $this->param('status', 'all');
|
||||
|
||||
$control = $this->loadController('execution', 'view');
|
||||
$control->view($executionID);
|
||||
@@ -47,8 +46,8 @@ class executionEntry extends Entry
|
||||
foreach($executionProduct->plans as $planID)
|
||||
{
|
||||
$plan = new stdclass();
|
||||
$plan->id = $planID;
|
||||
$plan->name = $data->data->planGroups->{$productID}->{$planID};
|
||||
$plan->id = trim($planID, ',');
|
||||
$plan->name = $data->data->planGroups->{$productID}->{$plan->id};
|
||||
$product->plans[] = $plan;
|
||||
}
|
||||
$execution->products[] = $product;
|
||||
|
||||
@@ -24,7 +24,7 @@ class executionBugsEntry extends entry
|
||||
if(empty($executionID)) return $this->sendError(400, 'Need execution id.');
|
||||
|
||||
$control = $this->loadController('execution', 'bug');
|
||||
$control->bug($executionID, $this->param('product', 0), $this->param('order', 'status,id_desc'), $this->param('build', 0), $this->param('status', 'all'), 0, 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
$control->bug($executionID, $this->param('product', 0), $this->param('branch', 0), $this->param('order', 'status,id_desc'), $this->param('build', 0), $this->param('status', 'all'), 0, 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
|
||||
$data = $this->getData();
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ class executionCasesEntry extends entry
|
||||
if(empty($executionID)) return $this->sendError(400, 'Need execution id.');
|
||||
|
||||
$control = $this->loadController('execution', 'testcase');
|
||||
$control->testcase($executionID, $this->param('status', 'all'), $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
$control->testcase($executionID, $this->param('product', 0), $this->param('branch', 0), $this->param('status', 'all'), $this->param('module', 0), $this->param('order', 'id_desc'), 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
|
||||
$data = $this->getData();
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ class executionsEntry extends entry
|
||||
else
|
||||
{
|
||||
$control = $this->loadController('execution', 'all');
|
||||
$control->all($this->param('status', 'all'), $this->param('project', $projectID), $this->param('order', 'id_desc'), 0, 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
$control->all($this->param('status', 'all'), $this->param('order', 'id_desc'), 0, '', 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
$data = $this->getData();
|
||||
|
||||
if(!$data or !isset($data->status)) return $this->sendError(400, 'error');
|
||||
|
||||
@@ -120,7 +120,7 @@ class productEntry extends Entry
|
||||
if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message);
|
||||
|
||||
$product = $this->product->getByID($productID);
|
||||
$this->send(200, $this->format($product, 'createdDate:time'));
|
||||
$this->send(200, $this->format($product, 'createdDate:time,whitelist:userList,createdBy:user,PO:user,RD:user,QD:user'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -60,7 +60,7 @@ class programEntry extends Entry
|
||||
public function delete($programID)
|
||||
{
|
||||
$control = $this->loadController('program', 'delete');
|
||||
$control->delete(0, $programID, 'true');
|
||||
$control->delete($programID, 'true');
|
||||
|
||||
$data = $this->getData();
|
||||
if(isset($data->result) and $data->result == 'fail') return $this->sendError(400, $data->message);
|
||||
|
||||
@@ -24,7 +24,7 @@ class projectBugsEntry extends entry
|
||||
if(empty($projectID)) return $this->sendError(400, 'Need project id.');
|
||||
|
||||
$control = $this->loadController('project', 'bug');
|
||||
$control->bug($projectID, $this->param('product', 0), $this->param('order', 'status,id_desc'), $this->param('build', 0), $this->param('status', 'all'), 0, 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
$control->bug($projectID, $this->param('product', 0), $this->param('branch', 0), $this->param('order', 'status,id_desc'), $this->param('build', 0), $this->param('status', 'all'), 0, 0, $this->param('limit', 20), $this->param('page', 1));
|
||||
|
||||
$data = $this->getData();
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ class tabsEntry extends baseEntry
|
||||
foreach($tabs as $menuKey)
|
||||
{
|
||||
if(!isset($this->lang->my->$menuKey)) continue;
|
||||
if(!common::hasPriv('my', $menuKey)) continue;
|
||||
if(!common::hasPriv('my', 'work')) continue;
|
||||
$label = $this->lang->my->$menuKey;
|
||||
if($menuKey == 'calendar') $label = $this->lang->my->calendarAction;
|
||||
|
||||
|
||||
+22
-8
@@ -140,7 +140,8 @@ class userEntry extends Entry
|
||||
break;
|
||||
case 'execution':
|
||||
$info->execution = array('total' => 0, 'executions' => array());
|
||||
if(!common::hasPriv('my', 'execution')) break;
|
||||
if(!common::hasPriv('my', 'work')) break;
|
||||
$this->config->openMethods[] = 'my.execution';
|
||||
|
||||
$control = $this->loadController('my', 'execution');
|
||||
$control->execution($this->param('type', 'undone'), $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
@@ -193,6 +194,7 @@ class userEntry extends Entry
|
||||
case 'task':
|
||||
$info->task = array('total' => 0, 'tasks' => array());
|
||||
if(!common::hasPriv('my', 'work')) break;
|
||||
$this->config->openMethods[] = 'my.task';
|
||||
|
||||
$control = $this->loadController('my', 'task');
|
||||
$control->task($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
@@ -208,6 +210,7 @@ class userEntry extends Entry
|
||||
case 'bug':
|
||||
$info->bug = array('total' => 0, 'bugs' => array());
|
||||
if(!common::hasPriv('my', 'work')) break;
|
||||
$this->config->openMethods[] = 'my.bug';
|
||||
|
||||
$control = $this->loadController('my', 'bug');
|
||||
$control->bug($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
@@ -251,7 +254,7 @@ class userEntry extends Entry
|
||||
if(!common::hasPriv('my', 'todo')) break;
|
||||
|
||||
$control = $this->loadController('my', 'todo');
|
||||
$control->todo($this->param('date', 'all'), '', 'all', 'date_desc', 0, 0, $this->param('limit', 5), 1);
|
||||
$control->todo($this->param('date', 'before'), '', 'all', 'date_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -264,6 +267,7 @@ class userEntry extends Entry
|
||||
case 'story':
|
||||
$info->story = array('total' => 0, 'stories' => array());
|
||||
if(!common::hasPriv('my', 'work')) break;
|
||||
$this->config->openMethods[] = 'my.story';
|
||||
|
||||
$control = $this->loadController('my', 'story');
|
||||
$control->story($this->param('type', 'assignedTo'), 0, $this->param('order', 'id_desc'), $this->param('total', 0), $this->param('limit', 5), $this->param('page', 1));
|
||||
@@ -289,6 +293,7 @@ class userEntry extends Entry
|
||||
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$this->config->openMethods[] = 'my.issue';
|
||||
$control = $this->loadController('my', 'issue');
|
||||
$control->issue('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
@@ -306,8 +311,9 @@ class userEntry extends Entry
|
||||
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$this->config->openMethods[] = 'my.risk';
|
||||
$control = $this->loadController('my', 'risk');
|
||||
$control->risk('createdBy', 0, 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$control->risk('assignedTo', 0, 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -323,8 +329,9 @@ class userEntry extends Entry
|
||||
|
||||
if($this->config->edition == 'max')
|
||||
{
|
||||
$this->config->openMethods[] = 'my.myMeeting';
|
||||
$control = $this->loadController('my', 'myMeeting');
|
||||
$control->myMeeting('all', '', 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$control->myMeeting('futureMeeting', '', 'id_desc', 0, $this->param('limit', 5), 1);
|
||||
$data = $this->getData();
|
||||
|
||||
if($data->status == 'success')
|
||||
@@ -375,14 +382,21 @@ class userEntry extends Entry
|
||||
$oldUser = $this->loadModel('user')->getByID($userID, 'id');
|
||||
|
||||
/* Set $_POST variables. */
|
||||
$fields = 'dept,realname,email,commiter,gender,role,mobile,phone,visions,groups';
|
||||
$fields = 'dept,realname,role,join,type,visions,mobile,phone,qq,dingding,weixin,skype,whatsapp,slack,address,address,email,commiter,gender,groups,passwordStrength,locked,fails,birthday';
|
||||
$this->batchSetPost($fields, $oldUser);
|
||||
$this->setPost('account', $oldUser->account);
|
||||
|
||||
if($this->request('gender') and !in_array($this->request('gender'), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
|
||||
$userGroups = $this->dao->select('`group`')->from(TABLE_USERGROUP)->where('account')->eq($oldUser->account)->fetchPairs('group', 'group');
|
||||
$this->setPost('groups', $this->request('groups', zget($_POST, 'groups', array_values($userGroups))));
|
||||
|
||||
$this->setPost('password1', $this->request('password', ''));
|
||||
$this->setPost('password2', $this->request('password', ''));
|
||||
$gender = $this->request('gender', zget($_POST, 'gender', 'f'));
|
||||
if(!in_array($gender, array('f', 'm'))) return $this->sendError(400, "The value of gender must be 'f' or 'm'");
|
||||
if($this->request('gender') and !in_array($this->request('gender'), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
|
||||
$this->setPost('gender', $gender);
|
||||
|
||||
$password = $this->request('password', zget($_POST, 'password', ''));
|
||||
$this->setPost('password1', md5($password));
|
||||
$this->setPost('password2', md5($password));
|
||||
$this->setPost('verifyPassword', md5($this->app->user->password . $this->app->session->rand));
|
||||
|
||||
$control = $this->loadController('user', 'edit');
|
||||
|
||||
@@ -55,21 +55,23 @@ class usersEntry extends entry
|
||||
*/
|
||||
public function post()
|
||||
{
|
||||
$fields = 'account,dept,realname,email,commiter,gender';
|
||||
$fields = 'type,dept,account,password,visions,realname,join,role,email,commiter,gender,group,passwordStrength';
|
||||
$this->batchSetPost($fields);
|
||||
|
||||
if(!in_array($this->request('gendar', 'f'), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
|
||||
if(!in_array($this->request('gendar', zget($_POST, 'gendar', 'f')), array('f', 'm'))) return $this->sendError(400, "The value of gendar must be 'f' or 'm'");
|
||||
|
||||
$password = $this->request('password', '') ? md5($this->request('password')) : '';
|
||||
$password = $this->request('password', zget($_POST, 'password', '')) ? md5($this->request('password', zget($_POST, 'password', ''))) : '';
|
||||
|
||||
$visions = $this->request('visions', array('rnd'));
|
||||
if(!is_array($visions)) $visions = explode(',', $visions);
|
||||
|
||||
if($this->request('group')) $this->setPost('group', explode(',', $this->request('group')));
|
||||
$this->setPost('password1', $password);
|
||||
$this->setPost('password2', $password);
|
||||
$this->setPost('passwordStrength', 3);
|
||||
$this->setPost('visions', $visions);
|
||||
$this->setPost('verifyPassword', md5($this->app->user->password . $this->app->session->rand));
|
||||
unset($_POST['password']);
|
||||
|
||||
$control = $this->loadController('user', 'create');
|
||||
$this->requireFields('account,password1,realname');
|
||||
|
||||
@@ -50,7 +50,7 @@ if($config->requestType == 'PATH_INFO')
|
||||
{
|
||||
$_SERVER['PATH_INFO'] = $path['basename'];
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
/* url like http://pms.zentao.net/zentao/my/, PATH_INFO is 'my'. */
|
||||
if(is_dir('./module/' . $path['basename']))
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "easysoft/zentaopms",
|
||||
"description": "Zentao is an agile(scrum) project management system/tool, Free Upgrade Forever!",
|
||||
"type": "project",
|
||||
"license": "ZPL",
|
||||
"require": {
|
||||
"php": "~5.2||~7.0",
|
||||
"ext-json" : "*",
|
||||
"ext-mbstring" : "*",
|
||||
"ext-curl" : "*"
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
|
||||
if(!function_exists('getWebRoot')){function getWebRoot(){}}
|
||||
|
||||
/* 基本设置。Basic settings. */
|
||||
$config->version = '17.4'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->version = '17.6'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
|
||||
$config->liteVersion = '1.2'; // 迅捷版版本。 The version of Lite.
|
||||
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
|
||||
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
|
||||
|
||||
@@ -29,6 +29,7 @@ $filter->default->cookie['fingerprint'] = 'reg::word';
|
||||
$filter->default->cookie['hideMenu'] = 'equal::true';
|
||||
$filter->default->cookie['tab'] = 'reg::word';
|
||||
$filter->default->cookie['goback'] = 'reg::any';
|
||||
$filter->default->cookie['maxImport'] = 'reg::any';
|
||||
|
||||
$filter->index = new stdclass();
|
||||
$filter->my = new stdclass();
|
||||
|
||||
@@ -222,6 +222,8 @@ $config->openMethods[] = 'kanban.deleteobjectcard';
|
||||
$config->openMethods[] = 'admin.ignore';
|
||||
$config->openMethods[] = 'personnel.unbindwhitelist';
|
||||
$config->openMethods[] = 'tree.viewhistory';
|
||||
$config->openMethods[] = 'doc.createbasicinfo';
|
||||
$config->openMethods[] = 'project.createguide';
|
||||
|
||||
/* Define the tables. */
|
||||
define('TABLE_COMPANY', '`' . $config->db->prefix . 'company`');
|
||||
@@ -331,6 +333,10 @@ if(!defined('TABLE_PROJECTSPEC')) define('TABLE_PROJECTSPEC', '`' . $config->db-
|
||||
if(!defined('TABLE_SEARCHINDEX')) define('TABLE_SEARCHINDEX', $config->db->prefix . 'searchindex');
|
||||
if(!defined('TABLE_SEARCHDICT')) define('TABLE_SEARCHDICT', $config->db->prefix . 'searchdict');
|
||||
|
||||
define('TABLE_CHART', '`' . $config->db->prefix . 'chart`');
|
||||
define('TABLE_DASHBOARD', '`' . $config->db->prefix . 'dashboard`');
|
||||
define('TABLE_DATASET', '`' . $config->db->prefix . 'dataset`');
|
||||
|
||||
$config->objectTables['product'] = TABLE_PRODUCT;
|
||||
$config->objectTables['productplan'] = TABLE_PRODUCTPLAN;
|
||||
$config->objectTables['story'] = TABLE_STORY;
|
||||
@@ -392,3 +398,6 @@ $config->programPriv->waterfall = array_merge($config->programPriv->scrum, array
|
||||
$config->waterfallModules = array('workestimation', 'durationestimation', 'budget', 'programplan', 'review', 'reviewissue', 'weekly', 'cm', 'milestone', 'design', 'opportunity', 'auditplan', 'trainplan', 'gapanalysis', 'pssp', 'researchplan', 'researchreport');
|
||||
|
||||
$config->showMainMenu = true;
|
||||
$config->maxPriValue = '256';
|
||||
|
||||
$config->importWhiteList = array('user', 'task', 'story', 'bug', 'testcase', 'feedback');
|
||||
+4
-4
@@ -15,7 +15,7 @@ INSERT INTO `zt_action` (`id`, `objectType`, `objectID`, `product`, `project`, `
|
||||
(11, 'story', 1, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:09:49', '', '', '0'),
|
||||
(12, 'story', 2, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:16:37', '', '', '0'),
|
||||
(13, 'story', 3, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:18:10', '', '', '0'),
|
||||
(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changed', '2012-06-05 10:19:06', '', '', '0'),
|
||||
(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changing', '2012-06-05 10:19:06', '', '', '0'),
|
||||
(15, 'story', 4, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:20:16', '', '', '0'),
|
||||
(16, 'story', 5, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:21:39', '', '', '0'),
|
||||
(17, 'story', 6, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:23:11', '', '', '0'),
|
||||
@@ -589,9 +589,9 @@ INSERT INTO `zt_story` (`id`, `parent`, `product`, `branch`, `module`, `plan`, `
|
||||
(2, 0, 1, 0, 2, '1', 'po', '', 0, '新闻中心的设计和开发。', '', 'story', 1, 1, 'active', '', '', 'projected', '', '', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:25:33', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(3, 0, 1, 0, 3, '1', 'po', '', 0, '成果展示的设计和开发', '', 'story', 1, 0, 'active', '', '', 'developing', '', '', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:25:38', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 2, '0', '0'),
|
||||
(4, 0, 1, 0, 4, '1', 'po', '', 0, '售后服务的设计和开发', '', 'story', 1, 1, 'active', '', '', 'developed', '', '', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:25:42', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0');
|
||||
(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0');
|
||||
INSERT INTO `zt_storyspec` (`story`, `version`, `title`, `spec`, `verify`) VALUES
|
||||
(1, 1, '首页设计和开发', '作为一名本公司的用户,我希望可以在首页看到该公司网站的基本内容,例如最新动态、部分成果展示、联系信息、工商信息等。<br />', '开发并通过验收<br />'),
|
||||
(2, 1, '新闻中心的设计和开发。', '作为一名本公司的用户,我希望可以在新闻中心看到该公司网站的企业新闻,这样可以通过新闻了解企业的最新动态。<br />', ''),
|
||||
|
||||
+4
-4
@@ -15,7 +15,7 @@ INSERT INTO `zt_action` (`id`, `objectType`, `objectID`, `product`, `project`, `
|
||||
(11, 'story', 1, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:09:49', '', '', '0'),
|
||||
(12, 'story', 2, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:16:37', '', '', '0'),
|
||||
(13, 'story', 3, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:18:10', '', '', '0'),
|
||||
(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changed', '2012-06-05 10:19:06', '', '', '0'),
|
||||
(14, 'story', 3, ',1,', 0, 0, 'productManager', 'changing', '2012-06-05 10:19:06', '', '', '0'),
|
||||
(15, 'story', 4, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:20:16', '', '', '0'),
|
||||
(16, 'story', 5, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:21:39', '', '', '0'),
|
||||
(17, 'story', 6, ',1,', 0, 0, 'productManager', 'opened', '2012-06-05 10:23:11', '', '', '0'),
|
||||
@@ -589,9 +589,9 @@ INSERT INTO `zt_story` (`id`, `parent`, `product`, `branch`, `module`, `plan`, `
|
||||
(2, 0, 1, 0, 2, '1', 'po', '', 0, '新闻中心的设计和开发。', '', 'story', 1, 1, 'active', '', '', 'projected', '', '', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:16:37', 'productManager', '2012-06-05 10:25:33', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(3, 0, 1, 0, 3, '1', 'po', '', 0, '成果展示的设计和开发', '', 'story', 1, 0, 'active', '', '', 'developing', '', '', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:18:10', 'productManager', '2012-06-05 10:25:38', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 2, '0', '0'),
|
||||
(4, 0, 1, 0, 4, '1', 'po', '', 0, '售后服务的设计和开发', '', 'story', 1, 1, 'active', '', '', 'developed', '', '', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:20:16', 'productManager', '2012-06-05 10:25:42', 'productManager, ', '2012-06-05 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'draft', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0');
|
||||
(5, 0, 1, 0, 5, '1', 'po', '', 0, '诚聘英才的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:21:39', 'productManager', '2012-06-05 10:21:39', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(6, 0, 1, 0, 6, '1', 'po', '', 0, '合作洽谈的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:23:11', 'productManager', '2012-06-05 10:23:11', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0'),
|
||||
(7, 0, 1, 0, 7, '1', 'po', '', 0, '关于我们的设计和开发', '', 'story', 1, 1, 'reviewing', '', '', 'planned', '', '', 'productManager', '2012-06-05 10:24:19', 'productManager', '2012-06-05 10:24:19', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', '0000-00-00 00:00:00', '', 0, '', '', 0, 1, '0', '0');
|
||||
INSERT INTO `zt_storyspec` (`story`, `version`, `title`, `spec`, `verify`) VALUES
|
||||
(1, 1, '首页设计和开发', '作为一名本公司的用户,我希望可以在首页看到该公司网站的基本内容,例如最新动态、部分成果展示、联系信息、工商信息等。<br />', '开发并通过验收<br />'),
|
||||
(2, 1, '新闻中心的设计和开发。', '作为一名本公司的用户,我希望可以在新闻中心看到该公司网站的企业新闻,这样可以通过新闻了解企业的最新动态。<br />', ''),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,62 @@
|
||||
ALTER TABLE `zt_task` ADD `order` mediumint(8) NOT NULL DEFAULT 0 AFTER `activatedDate`;
|
||||
ALTER TABLE `zt_task` ADD INDEX `order` (`order`);
|
||||
ALTER TABLE `zt_story` ADD COLUMN `linkRequirements` varchar(255) NOT NULL AFTER `linkStories`;
|
||||
|
||||
ALTER TABLE `zt_productplan` ADD `createdBy` varchar(30) NOT NULL AFTER `closedReason`;
|
||||
ALTER TABLE `zt_productplan` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_release` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`;
|
||||
ALTER TABLE `zt_release` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_testtask` ADD `createdBy` varchar(30) NOT NULL AFTER `subStatus`;
|
||||
ALTER TABLE `zt_testtask` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
ALTER TABLE `zt_build` ADD `createdBy` varchar(30) NOT NULL AFTER `desc`;
|
||||
ALTER TABLE `zt_build` ADD `createdDate` datetime NOT NULL AFTER `createdBy`;
|
||||
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackType' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='type';
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackSolution' ORDER BY `id` DESC LIMIT 1) WHERE `module`='feedback' AND `field`='solution';
|
||||
UPDATE `zt_workflowfield` SET `options`=(SELECT id FROM `zt_workflowdatasource` WHERE `code`='feedbackclosedReason' ORDER BY `id` DESC LIMIT 1), `control`='select' WHERE `module`='feedback' AND `field`='closedReason';
|
||||
|
||||
UPDATE `zt_project` SET `closedDate`='' AND `closedBy`='' WHERE `status` != 'closed';
|
||||
UPDATE `zt_grouppriv` SET `method`='exportTemplate' WHERE `method` = 'exportTemplet';
|
||||
|
||||
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'reply' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
|
||||
INSERT INTO `zt_grouppriv` (SELECT `group`,`module`,'ask' FROM `zt_grouppriv` WHERE `module` = 'feedback' AND `method` = 'comment');
|
||||
|
||||
CREATE TABLE `zt_chart` (
|
||||
`id` mediumint NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`type` varchar(30) NOT NULL,
|
||||
`dataset` varchar(30) NOT NULL,
|
||||
`desc` mediumtext NOT NULL,
|
||||
`settings` mediumtext NOT NULL,
|
||||
`filters` mediumtext NOT NULL,
|
||||
`createdBy` char(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_dashboard` (
|
||||
`id` mediumint(8) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(255) NOT NULL,
|
||||
`module` mediumint NOT NULL,
|
||||
`desc` mediumtext NOT NULL,
|
||||
`layout` mediumtext NOT NULL,
|
||||
`filters` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
CREATE TABLE `zt_dataset` (
|
||||
`id` mediumint unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(155) NOT NULL,
|
||||
`sql` text NOT NULL,
|
||||
`fields` mediumtext NOT NULL,
|
||||
`objects` mediumtext NOT NULL,
|
||||
`createdBy` varchar(30) NOT NULL,
|
||||
`createdDate` datetime NOT NULL,
|
||||
`deleted` tinyint NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
@@ -0,0 +1,264 @@
|
||||
ALTER TABLE `zt_story` MODIFY `status` enum('','changed','active','draft','closed','reviewing') NOT NULL DEFAULT '' AFTER `estimate`;
|
||||
UPDATE `zt_story` SET `status` = 'reviewing' WHERE `status` = 'changed';
|
||||
ALTER TABLE `zt_story` MODIFY `status` enum('','changing','active','draft','closed','reviewing') NOT NULL DEFAULT '' AFTER `estimate`;
|
||||
|
||||
ALTER TABLE `zt_feedback` ADD `repeatFeedback` mediumint(8) NOT NULL DEFAULT 0 AFTER `feedbackBy`;
|
||||
|
||||
ALTER TABLE `zt_assetlib` ADD `order` SMALLINT UNSIGNED NOT NULL DEFAULT '0' AFTER `desc`;
|
||||
ALTER TABLE `zt_testsuite` ADD `order` SMALLINT UNSIGNED NOT NULL DEFAULT '0' AFTER `type`;
|
||||
|
||||
ALTER TABLE `zt_bug` MODIFY COLUMN `os` varchar(255) NOT NULL default '';
|
||||
ALTER TABLE `zt_bug` MODIFY COLUMN `browser` varchar(255) NOT NULL default '';
|
||||
|
||||
INSERT IGNORE INTO `zt_lang` (`lang`, `module`, `section`, `key`, `value`, `system`, `vision`) VALUES
|
||||
('zh-cn', 'bug', 'browserList', 'all', '全部', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'chrome', 'Chrome', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'edge', 'Edge', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie', 'IE系列', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie11', 'IE11', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie10', 'IE10', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie9', 'IE9', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie8', 'IE8', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie7', 'IE7', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'ie6', 'IE6', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'firefox', 'firefox系列', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'firefox4', 'firefox4', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'firefox3', 'firefox3', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'firefox2', 'firefox2', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'opera', 'Opera系列', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'opera11', 'opera11', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'opera10', 'opera10', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'opera9', 'opera9', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'safari', 'safari', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', '360', '360浏览器', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'qq', 'QQ浏览器', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'maxthon', '遨游', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'uc', 'UC', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'browserList', 'other', '其他', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'all', '全部', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'chrome', 'Chrome', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'edge', 'Edge', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie', 'IE系列', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie11', 'IE11', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie10', 'IE10', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie9', 'IE9', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie8', 'IE8', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie7', 'IE7', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'ie6', 'IE6', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'firefox', 'firefox系列', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'firefox4', 'firefox4', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'firefox3', 'firefox3', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'firefox2', 'firefox2', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'opera', 'Opera系列', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'opera11', 'opera11', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'opera10', 'opera10', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'opera9', 'opera9', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'safari', 'safari', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', '360', '360瀏覽器', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'qq', 'QQ瀏覽器', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'maxthon', '遨游', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'uc', 'UC', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'browserList', 'other', '其他', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'all', 'All', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'chrome', 'Chrome', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'edge', 'Edge', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie', 'IE series', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie11', 'IE11', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie10', 'IE10', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie9', 'IE9', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie8', 'IE8', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie7', 'IE7', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'ie6', 'IE6', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'firefox', 'Firefox series', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'firefox4', 'Firefox4', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'firefox3', 'Firefox3', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'firefox2', 'Firefox2', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'opera', 'Opera series', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'opera11', 'Opera11', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'opera10', 'Opera10', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'opera9', 'Opera9', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'safari', 'Safari', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', '360', '360', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'qq', 'QQ', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'maxthon', 'Maxthon', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'uc', 'UC', '1', 'rnd'),
|
||||
('en', 'bug', 'browserList', 'other', 'Others', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'all', 'Tous', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'chrome', 'Chrome', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'edge', 'Edge', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie', 'IE series', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie11', 'IE11', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie10', 'IE10', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie9', 'IE9', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie8', 'IE8', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie7', 'IE7', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'ie6', 'IE6', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'firefox', 'Firefox series', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'firefox4', 'Firefox4', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'firefox3', 'Firefox3', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'firefox2', 'Firefox2', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'opera', 'Opera series', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'opera11', 'Opera11', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'opera10', 'Opera10', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'opera9', 'Opera9', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'safari', 'Safari', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', '360', '360', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'qq', 'QQ', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'maxthon', 'Maxthon', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'uc', 'UC', '1', 'rnd'),
|
||||
('fr', 'bug', 'browserList', 'other', 'Autres', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'all', 'Alle', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'chrome', 'Chrome', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'edge', 'Edge', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie', 'IE series', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie11', 'IE11', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie10', 'IE10', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie9', 'IE9', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie8', 'IE8', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie7', 'IE7', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'ie6', 'IE6', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'firefox', 'Firefox series', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'firefox4', 'Firefox4', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'firefox3', 'Firefox3', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'firefox2', 'Firefox2', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'opera', 'Opera series', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'opera11', 'Opera11', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'opera10', 'Opera10', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'opera9', 'Opera9', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'safari', 'Safari', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', '360', '360', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'qq', 'QQ', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'maxthon', 'Maxthon', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'uc', 'UC', '1', 'rnd'),
|
||||
('de', 'bug', 'browserList', 'other', 'Andere', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'all', '全部', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'windows', 'Windows', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win11', 'Windows 11', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win10', 'Windows 10', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win8', 'Windows 8', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win7', 'Windows 7', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'winxp', 'Windows XP', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'osx', 'Mac OS', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'android', 'Android', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'ios', 'IOS', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'linux', 'Linux', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'ubuntu', 'Ubuntu', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'chromeos', 'Chrome OS', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'fedora', 'Fedora', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'vista', 'Windows Vista', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win2012', 'Windows 2012', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win2008', 'Windows 2008', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win2003', 'Windows 2003', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'win2000', 'Windows 2000', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'wp8', 'WP8', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'wp7', 'WP7', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'symbian', 'Symbian', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'freebsd', 'FreeBSD', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'unix', 'Unix', '1', 'rnd'),
|
||||
('zh-cn', 'bug', 'osList', 'others', '其他', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'all', '全部', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'windows', 'Windows', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win11', 'Windows 11', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win10', 'Windows 10', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win8', 'Windows 8', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win7', 'Windows 7', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'winxp', 'Windows XP', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'osx', 'Mac OS', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'android', 'Android', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'ios', 'IOS', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'linux', 'Linux', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'ubuntu', 'Ubuntu', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'chromeos', 'Chrome OS', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'fedora', 'Fedora', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'vista', 'Windows Vista', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win2012', 'Windows 2012', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win2008', 'Windows 2008', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win2003', 'Windows 2003', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'win2000', 'Windows 2000', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'wp8', 'WP8', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'wp7', 'WP7', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'symbian', 'Symbian', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'freebsd', 'FreeBSD', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'unix', 'Unix', '1', 'rnd'),
|
||||
('zh-tw', 'bug', 'osList', 'others', '其他', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'all', 'All', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'windows', 'Windows', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win11', 'Windows 11', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win10', 'Windows 10', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win8', 'Windows 8', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win7', 'Windows 7', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'winxp', 'Windows XP', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'osx', 'Mac OS', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'android', 'Android', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'ios', 'IOS', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'linux', 'Linux', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'ubuntu', 'Ubuntu', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'chromeos', 'Chrome OS', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'fedora', 'Fedora', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'vista', 'Windows Vista', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win2012', 'Windows 2012', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win2008', 'Windows 2008', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win2003', 'Windows 2003', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'win2000', 'Windows 2000', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'wp8', 'WP8', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'wp7', 'WP7', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'symbian', 'Symbian', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'freebsd', 'FreeBSD', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'unix', 'Unix', '1', 'rnd'),
|
||||
('en', 'bug', 'osList', 'others', 'Others', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'all', 'Tous', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'windows', 'Windows', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win11', 'Windows 11', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win10', 'Windows 10', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win8', 'Windows 8', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win7', 'Windows 7', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'winxp', 'Windows XP', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'osx', 'Mac OS', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'android', 'Android', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'ios', 'IOS', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'linux', 'Linux', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'ubuntu', 'Ubuntu', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'chromeos', 'Chrome OS', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'fedora', 'Fedora', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'vista', 'Windows Vista', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win2012', 'Windows 2012', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win2008', 'Windows 2008', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win2003', 'Windows 2003', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'win2000', 'Windows 2000', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'wp8', 'WP8', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'wp7', 'WP7', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'symbian', 'Symbian', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'freebsd', 'FreeBSD', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'unix', 'Unix', '1', 'rnd'),
|
||||
('fr', 'bug', 'osList', 'others', 'Autres', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'all', 'Alle', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'windows', 'Windows', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win11', 'Windows 11', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win10', 'Windows 10', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win8', 'Windows 8', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win7', 'Windows 7', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'winxp', 'Windows XP', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'osx', 'Mac OS', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'android', 'Android', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'ios', 'IOS', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'linux', 'Linux', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'ubuntu', 'Ubuntu', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'chromeos', 'Chrome OS', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'fedora', 'Fedora', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'vista', 'Windows Vista', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win2012', 'Windows 2012', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win2008', 'Windows 2008', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win2003', 'Windows 2003', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'win2000', 'Windows 2000', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'wp8', 'WP8', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'wp7', 'WP7', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'symbian', 'Symbian', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'freebsd', 'FreeBSD', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'unix', 'Unix', '1', 'rnd'),
|
||||
('de', 'bug', 'osList', 'others', 'Andere', '1', 'rnd');
|
||||
|
||||
UPDATE `zt_grouppriv` SET `module` = 'testcase' WHERE `module` = 'story' and `method` = 'zeroCase';
|
||||
UPDATE `zt_grouppriv` SET `module` = 'product' WHERE `module` = 'story' and `method` = 'track';
|
||||
|
||||
ALTER TABLE `zt_job` ADD `lastSyncDate` datetime DEFAULT NULL AFTER `lastTag`;
|
||||
INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type`, `buildin`, `status`, `lastTime`) VALUES ('*/5', '*', '*', '*', '*', 'moduleName=compile&methodName=syncCompile', '定时同步构建记录', 'zentao', 1, 'normal', '0000-00-00 00:00:00');
|
||||
+397
-245
File diff suppressed because it is too large
Load Diff
+288
@@ -1,3 +1,277 @@
|
||||
2022-08-25 17.6
|
||||
完成的需求
|
||||
开源版:
|
||||
30520 用户需求和研发需求权限区分
|
||||
30718 我的地盘软件需求列表区块软件需求列表中将草稿状态调整为评审中,新增草稿状态的需求展示
|
||||
30721 贡献列表中用户需求和软件需求列表中将草稿状态调整为评审中
|
||||
30722 提软件需求和提用户需求页面中增加存为草稿按钮
|
||||
30724 草稿状态的需求详情中增加提交评审操作
|
||||
30725 软件需求和用户需求列表筛选标签中将草稿标签调整为评审中
|
||||
30726 软件需求和用户需求列表筛选标签中增加草稿标签
|
||||
30727 计划关联需求时搜索列表中将草稿调整为评审中
|
||||
30729 需求报表中按状态进行统计表中将草稿调整为评审中,新增草稿状态的统计
|
||||
30730 release关联需求时过滤掉草稿和评审中状态的需求
|
||||
30731 项目关联需求时过滤掉草稿和评审中状态的需求
|
||||
30732 项目需求列表中通过新增需求,可以展示草稿和评审中的需求
|
||||
30733 执行关联需求时过滤掉草稿和评审中状态的需求
|
||||
30734 执行需求列表中通过新增需求后可以展示草稿和评审中状态的需求
|
||||
30735 Scrum看板的需求类泳道中通过新增需求可以展示草稿和评审中状态的需求
|
||||
30736 专业研发看板的需求类泳道中通过新增需求可以展示草稿和评审中状态的需求
|
||||
30737 build关联需求时过滤掉草稿和评审中状态的需求
|
||||
30738 年度总结报表中需求状态分布中将草稿状态调整为评审中,新增草稿状态
|
||||
30739 产品统计报表中产品汇总表中将草稿状态调整为评审中,新增草稿状态
|
||||
30740 产品统计报表中产品需求状态分布表中将草稿状态调整为评审中,新增草稿状态
|
||||
30741 项目统计报表中项目需求状态分布表中将草稿状态调整为评审中,新增草稿状态
|
||||
30743 草稿状态对应需求阶段的规则
|
||||
31134 新增的草稿状态需求不受强制评审流程控制
|
||||
31251 实现草稿状态需求的提交评审功能
|
||||
34650 产品列表中用户需求和研发需求增加评审中状态
|
||||
34651 产品概况中其他信息模块软需维度优化
|
||||
34896 软件需求状态“已变更”调整为“变更中”
|
||||
34897 用户需求状态“已变更”调整为“变更中”
|
||||
34898 已关闭的软件需求激活后状态可以选择“激活”或者关闭前的状态
|
||||
34899 已关闭的用户需求激活后状态可以选择“激活”或者关闭前的状态
|
||||
34900 软需从草稿提交评审,根据不同评审结果进行后续处理
|
||||
34901 用需从草稿提交评审,根据不同评审结果进行后续处理
|
||||
34902 软件需求草稿状态时按钮调整
|
||||
34903 软件需求评审中状态时按钮调整
|
||||
34904 软件需求变更中状态时按钮调整
|
||||
34922 软件需求激活状态时按钮调整
|
||||
34924 用户需求草稿状态时按钮调整
|
||||
34925 用户需求评审中状态时按钮调整
|
||||
34926 用户需求变更中状态时按钮调整
|
||||
34927 用户需求激活状态时按钮调整
|
||||
34931 Bug转需求时可以保存为草稿
|
||||
34933 已关闭的需求激活后指派人不能选择closed
|
||||
34934 需求变更评审时,系统根据需求不同评审结果进行后续处理
|
||||
34935 草稿需求评审时,评审人可选择确认通过、有待明确、拒绝
|
||||
35080 创建bug页面操作系统、浏览器支持多选
|
||||
35278 执行中转入任务页面增加分页展示
|
||||
35301 回收站的执行列表中增加所属项目字段
|
||||
35320 需求草稿状态时可以修改草稿内容
|
||||
35321 发起人对变更流程提交至”评审中“的需求选择撤销后需求根据状态回溯到不同内容
|
||||
35356 父阶段状态跟随子阶段状态自动更改
|
||||
35413 文档切换所属文档库时需要同步附件
|
||||
35821 回收站的任务列表中增加所属执行字段
|
||||
35887 关闭的bug指派人显示closed,不可编辑
|
||||
35908 在搜索表单中通过日期字段检索时去掉00:00:00的格式
|
||||
35935 修改零用例软需和矩阵的权限位置
|
||||
35998 更新bug中操作系统码值
|
||||
35999 更新bug中浏览器码值
|
||||
36111 bug编辑页面可以关联用例
|
||||
36184 测试单列表增加项目信息展示
|
||||
36188 需求按照优先级排序时,空值放最后
|
||||
36189 Bug按照优先级或严重程度排序时,空值放最后
|
||||
36190 用例关联bug和用例页增加分页
|
||||
36522 注册系统管理员的密码规则同系统中中级密码强度
|
||||
企业版:
|
||||
28045 反馈关闭原因为重复时,增加重复反馈输入的选项
|
||||
30523 反馈转Bug时取消选择项目弹窗直接进入提Bug页面
|
||||
30912 地盘日志列表新建日志时可以搜索该用户参与的所有执行
|
||||
31984 反馈增加批量导入功能
|
||||
33940 反馈增加导出模板功能
|
||||
34296 提交反馈默认公开
|
||||
34844 组织日志菜单下增加增加未填写日志成员的选项
|
||||
34998 反馈导出时的时间支持精确到分秒
|
||||
35024 用户需求和研发需求的导出数据增加类别字段
|
||||
35083 执行甘特图支持在图上用连接的方式维护任务关系
|
||||
35861 甘特图全屏样式优化
|
||||
36185 执行甘特图查看任务关系维护按钮、设置按钮、甘特图按钮优化
|
||||
36581 任务工时明细表的横向滚动条置顶显示
|
||||
36618 有编辑他人反馈权限,可以批量编辑他人反馈
|
||||
旗舰版:
|
||||
30432 瀑布项目设计功能类型支持自定义功能
|
||||
34682 资产库可以排序
|
||||
修复的Bug
|
||||
26232 执行软件需求列表简单表格下横向滚动条显示遮挡
|
||||
26272 地盘待处理/贡献研发需求列表中,子需求的名称和所属产品未显示title
|
||||
26380 复制项目时项目计划起止日期还是受项目集计划起止日期限制
|
||||
26448 列表设置弹窗界面高度需要优化
|
||||
26614 编辑项目页面计划起止日期/预算提示文案样式优化
|
||||
26618 创建测试任务时可以选择到已创建测试任务的需求
|
||||
26644 超出项目集计划起止日期提示换行
|
||||
26645 鼠标悬浮在附上时页面抖动
|
||||
25925 执行信息确认页面,日期选择后控件没有自动收起
|
||||
25929 敏捷项目和迭代设置中的白名单列表没有被复制
|
||||
25969 阶段信息确认页面没有显示已有的阶段负责人和阶段类型
|
||||
25974 阶段信息确认页面修改负责人后,没有按照修改后的负责人进行显示
|
||||
25989 英文下迭代信息确认页面表头显示优化
|
||||
25996 复制项目时,执行信息确认页面执行的状态默认设置应该为未开始
|
||||
25999 复制项目时,执行信息确认页面没有校验计划开始结束时间的先后
|
||||
26032 项目中发起评审,弹窗字段未居中
|
||||
26034 英文下项目中发起审批,文本换行
|
||||
26054 英德法下甘特图页面报错
|
||||
26057 英德法下甘特图页面没有显示分组选项
|
||||
26303 复制迭代时间控件一直显示
|
||||
26326 甘特图阶段工期计算错误
|
||||
26327 阶段甘特图中任务工期计算错误
|
||||
26365 项目计划评审页面自定义表单设置样式问题
|
||||
26580 评审项目计划页面甘特图切换为按指派给分组跳转到了阶段甘特图页面
|
||||
26638 甘特图拖动排序历史记录没有写中文语言项
|
||||
26655 瀑布项目设计三级导航不高亮了
|
||||
25961 迅捷页面用户授权异常
|
||||
26200 自定义库目录修改所属文档库到wiki库不能查看
|
||||
26221 导出数据的excel中,“抄送给”显示成了用户名
|
||||
26265 导入大数据测试用例页面有报错
|
||||
26278 导入文件超出PHP最大上传大小时没有提示
|
||||
26364 编辑项目页面有代码报错
|
||||
26371 导出的需求,用户名的显示不一致
|
||||
26424 导入用例页面无影响,提示PHPExcel原因
|
||||
26657 不能批量编辑他人反馈
|
||||
|
||||
2022-08-11 17.5
|
||||
完成的需求
|
||||
开源版:
|
||||
15665 可以设置用户查看的团队范围
|
||||
15666 增加部门维度查看团队
|
||||
31754 Scrum看板中任务看板按需求分组时需求列支持按条件排序
|
||||
34360 修改会议详情页面附件重命名样式
|
||||
34928 代理原因登录失败时,提醒用户检查代理服务
|
||||
34994 面板客户端下载菜单中增加移动端的下载功能
|
||||
35050 项目执行列表的筛选标签右侧增加编辑执行的设置
|
||||
35057 需求通过编辑或批量设置调整计划后,计划历史记录中增加关联或移除的记录
|
||||
35058 Bug通过编辑调整计划后,计划历史记录中增加关联或移除的记录
|
||||
35169 需求编辑页面增加关联相关需求功能
|
||||
35172 需求详情页面展示关联的相关需求
|
||||
35173 用户需求编辑页面增加关联相关用户需求功能
|
||||
35175 用户需求详情页面展示关联的相关用户需求
|
||||
35189 批量创建测试类型任务后子任务所属模块默认取需求所属模块
|
||||
35255 创建测试单页面中描述编辑器支持保存模板和应用模板功能
|
||||
35270 创建/编辑项目集时项目集同名提示优化
|
||||
35279 执行列表增加搜索功能
|
||||
35295 后台权限中将选择项目模板权限合并到创建项目权限中
|
||||
35357 LDAP原因登录失败时,提醒用户检查LDAP服务
|
||||
35362 用例搜索表单中搜索结果条件增加“未执行”选项
|
||||
35373 地盘待处理的任务列表中过滤掉已取消、已暂停、已关闭、已删除状态的任务
|
||||
35410 在文档库下创建文档时,第一步不默认创建空白文档,第二步保存后才创建成功
|
||||
35411 文档编辑页面中编辑基本信息后不保存,信息不保存
|
||||
35412 文档编辑页面中附件编辑后局部刷新
|
||||
35414 创建/编辑产品时产品同名提示优化
|
||||
35415 创建/编辑项目时项目同名提示优化
|
||||
35416 创建/编辑执行时执行同名提示优化
|
||||
35441 通用看板导入的执行卡片同步展示执行进度
|
||||
35442 通用看板导入的计划、发布、版本卡片不展示进度
|
||||
35444 Bug列表中所属执行、所属计划、创建者字段鼠标悬浮时支持显示全称
|
||||
35451 创建/编辑执行时执行同代号提示优化
|
||||
35453 创建/编辑项目时项目同代号提示优化
|
||||
35455 创建/编辑产品时产品同代号提示优化
|
||||
35468 文档创建页面中基本信息的抄送给用户列表维护弹窗样式优化
|
||||
35473 编辑项目时,允许项目预算超过父项目集
|
||||
35474 创建项目时,允许项目预算超过父项目集
|
||||
35476 编辑子项目集时,预算允许超过父项目集
|
||||
35477 创建子项目集时,预算允许超过父项目集的金额
|
||||
35478 创建项目时,计划开始日期允许小于父项目集
|
||||
35479 创建子项目集时,计划开始日期允许小于父项目集
|
||||
35480 编辑项目时,项目集的计划开始日期允许小于父项目集
|
||||
35481 编辑子项目集时,允许修改子项目集的计划开始时间小于父项目集的计划开始时间
|
||||
35482 创建项目时,项目的计划完成时间允许大于父项目集的计划完成时间
|
||||
35483 创建子项目集时,子项目集的计划完成时间允许大于父项目集的计划完成时间
|
||||
35484 编辑项目时,允许修改项目的计划完成时间大于父项目集的计划完成时间
|
||||
35485 编辑子项目集时,允许修改子项目集的计划完成时间大于父项目集的计划完成时间
|
||||
35490 优化修改密码的密码提示语
|
||||
35491 优化邮箱修改密码的密码提示语
|
||||
35493 全局搜索的搜索项优化排序
|
||||
35599 批量编辑项目时,允许修改项目的时间范围超出所属项目集的时间范围
|
||||
35600 创建和编辑项目时,计划起止日期超出父项目集日期范围,增加提示信息
|
||||
35601 创建和编辑项目时,预算金额超出父项目集时增加提示信息
|
||||
35602 创建和编辑子项目集时,计划起止日期超出父项目集的日期范围时,增加提示信息
|
||||
35603 创建和编辑子项目集时,预算金超出父项目集时,增加提示信息
|
||||
35624 累积流图时间周期优化
|
||||
35706 执行需求列表批量转任务时增加必填项判断
|
||||
35737 产品列表筛选标签的数量统计逻辑优化
|
||||
35771 编辑父项目集时,计划起止日期不包含子项目集的日期范围时,增加提示信息
|
||||
35799 地盘执行列表中角色字段修改为“我的角色”,鼠标悬浮展示全称
|
||||
35800 地盘贡献研发需求列表中,名称和所属产品字段支持鼠标悬浮显示全部内容
|
||||
35801 产品研发需求列表中版本号居中显示
|
||||
35816 用例关联多个测试单时,用例列表展示多条用例,分别对应不同测试单
|
||||
35817 修改发布中研发需求列表的子需求图标的圆角和颜色
|
||||
35818 发布中解决bug列表的解决日期没有定义时,显示为空
|
||||
35819 发布中研发需求列表预计字段的右侧内间距修改为16px
|
||||
35826 修改项目集列表预算字段表头右侧内边距为16px
|
||||
35834 产品研发需求列表中日期字段不定义时,显示为空
|
||||
35835 用例列表中最后修改者字段的宽度调整为92px
|
||||
35863 项目度量的统计项目汇总表的负责人、计划开始、计划完成和任务数量字段居中显示
|
||||
35865 执行列表中执行状态字段居中显示
|
||||
35867 项目发布列表中日期类字段居中显示
|
||||
35937 产品发布通知邮件中直接展示完成的需求、解决的Bug、遗留的Bug
|
||||
35939 密码难度规则优化
|
||||
企业版:
|
||||
6130 甘特图支持拖拽设置任务的起止日期
|
||||
7742 反馈模块动作设计增加回复和追问动作
|
||||
8252 动作界面只读字段设置默认值,创建的时候写入到数据库
|
||||
9004 数据校验取消校验按钮交互优化
|
||||
33993 甘特图样式优化
|
||||
34482 新增反馈编辑他人反馈的权限
|
||||
35082 执行甘特图,增加任务顺序的拖动排序功能
|
||||
35857 反馈列表转用户需求icon更换
|
||||
35933 执行甘特图的持续天数改成工期
|
||||
35236 在执行需求列表的搜索条件中可以搜索工作流的需求流程中新增的字段
|
||||
35699 bug模块动作设计增加批量激活的动作
|
||||
35802 工作流自定义流程,保存成功的提示交互优化
|
||||
旗舰版:
|
||||
35836 项目问题列表中优先级字段居中显示
|
||||
35837 项目问题列表“优先级”字段修改为“P”
|
||||
35838 项目风险列表中风险系数和优先级字段居中显示
|
||||
35868 瀑布项目培训能力差距分析列表各字段宽度调整
|
||||
35997 项目度量的项目工作量报表的右侧标题加粗显示
|
||||
32555 瀑布项目甘特图支持拖动调整起止日期
|
||||
33995 甘特图样式优化
|
||||
34893 项目计划甘特图,增加阶段/任务顺序的拖动排序功能
|
||||
34895 增加按指派分组功能
|
||||
35061 甘特图编辑权限
|
||||
35382 复制项目交互样式优化
|
||||
35393 甘特图升级到最近版本
|
||||
34372 新建项目增加复制项目信息入口
|
||||
34723 项目复制选择项目
|
||||
34724 项目复制信息
|
||||
34725 项目复制项目信息确认
|
||||
34726 项目复制阶段信息确认
|
||||
34727 项目复制迭代信息确认
|
||||
34728 项目复制弹窗提示
|
||||
35217 复制项目,阶段信息确认页面增加阶段选择弹窗
|
||||
35218 复制项目的交互样式优化
|
||||
35310 复制项目增加团队成员与权限复制
|
||||
36036 关闭审批后停用发起动作,再次开启审批未自动启用动作
|
||||
禅道客户端:
|
||||
34119 一键包集成喧喧网页端
|
||||
34460 优化会话中禅道链接卡片的跳转交互
|
||||
34667 完善XXD命令行应用给出的提示
|
||||
34668 修改docker入口脚本,确保owt中的rabbitmq正常启动
|
||||
34669 服务器地址不正确导致客户端登录失败后,尝试去掉路径后进行重试
|
||||
34670 完善音视频服务器端口配置和提示
|
||||
34671 优化音视频服务配置中“是否启用HTTPS”的设置
|
||||
34672 设计并增加离线部署SRS音视频的方案
|
||||
34673 没有麦克风时允许加入会议
|
||||
34848 解决服务器时间和客户端时间不一样的问题
|
||||
35087 研究喧喧和其他应用系统的多页面集成
|
||||
35088 删除服务器聊天记录的功能
|
||||
35268 通过服务端下载客户端后,登录时带入服务端地址
|
||||
35280 实现自动清理解散90天以上群数据的功能
|
||||
35294 后台检查XXC是否有新版时去掉XXB的版本判断
|
||||
35297 网络诊断时给出具体提示以引导用户
|
||||
修复的Bug
|
||||
22662 执行任务列表父子任务显示错乱
|
||||
24608 英文下批量编辑执行页面执行状态名称显示不全
|
||||
24743 测试单下所有用例页面执行状态排序按钮部分遮挡
|
||||
25416 产品列表分页逻辑问题
|
||||
25563 已设置颜色的任务名称,阶段列表显示任务名称的颜色
|
||||
25837 产品-计划的需求列表没有展示需求标题颜色
|
||||
25851 导入任务相关研发需求详情弹窗中样式问题
|
||||
25282 导入用户时,左右滚动条必须拖动到底部才显示
|
||||
25019 需要测试再进行详细确认:xxd以windows服务的形式启动(注意是在windows管理的服务里面点击启动),日志会存在C:\Windows\System32\log下
|
||||
25273 禅道卡片中的弹窗不展示
|
||||
25390 一张图片发送多人再撤回其中一张图,在其他窗口中图片显示已撤回
|
||||
25402 sendChatMessage返回值有问题
|
||||
25427 提示升级页面不显示了
|
||||
25526 后台没有被禁用的用户登录客户端时提示“账号被禁用”
|
||||
25603 喧喧一键安装包安装xxd错误
|
||||
25605 独立消息记录窗口中链接打不开
|
||||
25622 连续发送消息不给提示
|
||||
25628 客户端链接转任务跳转到地盘
|
||||
25630 消息记录点击两次喧喧直接崩溃了
|
||||
25644 产品计划卡片没显示内容
|
||||
25646 禅道客户端一、口、x遮挡成员按钮
|
||||
|
||||
2022-07-27 17.4
|
||||
完成的需求
|
||||
开源版:
|
||||
@@ -82,6 +356,19 @@
|
||||
33530 资产机会库机会列表页面审批字段居左显示
|
||||
33823 问题指派页面增加备注
|
||||
34097 修改执行QA不符合项详情页面中解决图标
|
||||
34729 QA质量保证计划可以批量编辑
|
||||
30071 项目甘特图中增加任务名称的显示
|
||||
28556 瀑布项目中计划的甘特图支持按日/周/月维度查看
|
||||
29700 项目甘特图中的任务支持点击查看详情
|
||||
29944 项目甘特图中支持显示阶段和任务的负责人
|
||||
34795 项目甘特图可以在阶段或任务前增加图标显示状态
|
||||
34742 项目甘特图中没有起止日期的任务的时间显示为所属阶段时间
|
||||
34729 QA质量保证计划可以批量编辑
|
||||
35424 产品计划增加审批设置
|
||||
35437 内置模块显示审批进度。
|
||||
35438 内置模块增加待我审批标签
|
||||
35596 产品发布增加审批设置
|
||||
35597 测试单增加审批设置
|
||||
禅道客户端:
|
||||
34124 XXD可以从XXB主动拉取配置
|
||||
34123 喧喧增加禅道的checktable.php以便自动修复数据库
|
||||
@@ -107,6 +394,7 @@
|
||||
23200 多人任务串行,可以操作出负的消耗工时
|
||||
24357 多人任务填写日志后把日志删除对应的消耗工时仍然存在
|
||||
25185 内置报表里,执行状态的下拉框里都没有已完成
|
||||
25603 修复新版一键安装包中XXD服务可能安装失败的问题。
|
||||
|
||||
2022-07-13 17.3
|
||||
完成的需求
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
<script>
|
||||
$('#assigntomeBlock>ul>li>a:not([href$="todo"]):not([href$="task"]:not[href$="feedback"])').parent().remove();
|
||||
</script>
|
||||
|
||||
@@ -51,6 +51,7 @@ else
|
||||
}
|
||||
|
||||
$lang->task->common = 'Task';
|
||||
$lang->dashboard = isset($lang->dashboard->common) ? $lang->dashboard->common : $lang->dashboard;
|
||||
|
||||
/* My menu. */
|
||||
$lang->my->menu = new stdclass();
|
||||
|
||||
@@ -51,6 +51,7 @@ else
|
||||
}
|
||||
|
||||
$lang->task->common = 'Task';
|
||||
$lang->dashboard = isset($lang->dashboard->common) ? $lang->dashboard->common : $lang->dashboard;
|
||||
|
||||
/* My menu. */
|
||||
$lang->my->menu = new stdclass();
|
||||
|
||||
@@ -51,6 +51,7 @@ else
|
||||
}
|
||||
|
||||
$lang->task->common = 'Task';
|
||||
$lang->dashboard = isset($lang->dashboard->common) ? $lang->dashboard->common : $lang->dashboard;
|
||||
|
||||
/* My menu. */
|
||||
$lang->my->menu = new stdclass();
|
||||
|
||||
@@ -51,6 +51,7 @@ else
|
||||
}
|
||||
|
||||
$lang->task->common = '任务';
|
||||
$lang->dashboard = isset($lang->dashboard->common) ? $lang->dashboard->common : $lang->dashboard;
|
||||
|
||||
/* My menu. */
|
||||
$lang->my->menu = new stdclass();
|
||||
@@ -197,7 +198,8 @@ $lang->admin->menu->dev['menuOrder'][15] = 'editor';
|
||||
$lang->admin->menu->dev['menuOrder'][20] = 'entry';
|
||||
|
||||
$lang->admin->menu->system['subMenu'] = new stdclass();
|
||||
$lang->admin->menu->system['subMenu']->data = array('link' => "{$lang->admin->data}|backup|index", 'subModule' => 'action');
|
||||
$lang->admin->menu->system['subMenu']->backup = array('link' => "{$lang->backup->common}|backup|index");
|
||||
$lang->admin->menu->system['subMenu']->trash = array('link' => "{$lang->action->trash}|action|trash");
|
||||
$lang->admin->menu->system['subMenu']->safe = array('link' => "$lang->security|admin|safe", 'alias' => 'checkweak');
|
||||
$lang->admin->menu->system['subMenu']->cron = array('link' => "{$lang->admin->cron}|cron|index", 'subModule' => 'cron');
|
||||
$lang->admin->menu->system['subMenu']->timezone = array('link' => "$lang->timezone|custom|timezone");
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
<script>
|
||||
$("#createCaseActionMenu").parent('.btn-group').remove();
|
||||
$("#actionbox .histories-list li").each(function()
|
||||
{
|
||||
var text = $(this).find('a').text();
|
||||
$(this).find('a').parent().text(text);
|
||||
});
|
||||
$(".histories-list li a").not("[href*='feedback']").attr('href','javascript:void(0)').attr('disabled',"true").css('color', '#3c4353');
|
||||
</script>
|
||||
|
||||
@@ -261,6 +261,7 @@ $lang->resource->story->delete = 'deleteAction';
|
||||
$lang->resource->story->view = 'view';
|
||||
$lang->resource->story->change = 'changeAction';
|
||||
$lang->resource->story->review = 'reviewAction';
|
||||
$lang->resource->story->submitReview = 'submitReview';
|
||||
$lang->resource->story->batchReview = 'batchReview';
|
||||
$lang->resource->story->recall = 'recall';
|
||||
$lang->resource->story->assignTo = 'assignAction';
|
||||
@@ -289,6 +290,7 @@ $lang->story->methodOrder[25] = 'delete';
|
||||
$lang->story->methodOrder[30] = 'view';
|
||||
$lang->story->methodOrder[35] = 'change';
|
||||
$lang->story->methodOrder[40] = 'review';
|
||||
$lang->story->methodOrder[44] = 'submitReview';
|
||||
$lang->story->methodOrder[45] = 'batchReview';
|
||||
$lang->story->methodOrder[50] = 'recall';
|
||||
$lang->story->methodOrder[55] = 'close';
|
||||
@@ -551,7 +553,7 @@ $lang->resource->task->recordEstimate = 'recordEstimateAction';
|
||||
$lang->resource->task->editEstimate = 'editEstimate';
|
||||
$lang->resource->task->deleteEstimate = 'deleteEstimate';
|
||||
$lang->resource->task->report = 'reportChart';
|
||||
if($config->edition != 'open') $lang->resource->task->exportTemplet = 'exportTemplet';
|
||||
if($config->edition != 'open') $lang->resource->task->exportTemplate = 'exportTemplate';
|
||||
if($config->edition != 'open') $lang->resource->task->import = 'import';
|
||||
|
||||
$lang->task->methodOrder[5] = 'create';
|
||||
@@ -577,7 +579,7 @@ $lang->task->methodOrder[100] = 'editEstimate';
|
||||
$lang->task->methodOrder[105] = 'deleteEstimate';
|
||||
$lang->task->methodOrder[110] = 'report';
|
||||
$lang->task->methodOrder[115] = 'batchChangeModule';
|
||||
$lang->task->methodOrder[120] = 'exportTemplet';
|
||||
$lang->task->methodOrder[120] = 'exportTemplate';
|
||||
$lang->task->methodOrder[125] = 'import';
|
||||
|
||||
/* Doc. */
|
||||
@@ -974,6 +976,7 @@ if($config->edition == 'biz' or $config->edition == 'max')
|
||||
$lang->resource->feedback->delete = 'delete';
|
||||
$lang->resource->feedback->close = 'closeAction';
|
||||
$lang->resource->feedback->export = 'exportAction';
|
||||
$lang->resource->feedback->assignTo = 'assignAction';
|
||||
|
||||
if($config->visions == ',lite,') unset($lang->resource->feedback);
|
||||
|
||||
|
||||
@@ -95,7 +95,9 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', '', $task->project), $task->name, null, "style='color: $task->color'");
|
||||
$onlybody = $task->executionType == 'kanban' ? true : '';
|
||||
$class = $task->executionType == 'kanban' ? 'iframe' : '';
|
||||
echo html::a($this->createLink('task', 'view', "taskID=$task->id", '', $onlybody, $task->project), $task->name, null, "class='$class' data-width='80%' style='color: $task->color'");
|
||||
}
|
||||
?>
|
||||
<?php if(!empty($task->children)) echo '<a class="task-toggle" data-id="' . $task->id . '"><i class="icon icon-angle-double-right"></i></a>';?>
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<div class='clearfix' id='mainMenu'>
|
||||
<div class='btn-toolbar pull-left'>
|
||||
<?php
|
||||
foreach($lang->project->featureBar as $label => $labelName)
|
||||
foreach($lang->project->featureBar['browse'] as $label => $labelName)
|
||||
{
|
||||
$active = $status == $label ? 'btn-active-text' : '';
|
||||
echo html::a($this->createLink('project', 'execution', "status=$label&projectID=$projectID"), '<span class="text">' . $labelName . '</span> ' . ($status == $label ? "<span class='label label-light label-badge'>" . (int)count($kanbanList) . '</span>' : ''), '', "class='btn btn-link $active'");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?php
|
||||
$config->story->list->exportFields = '
|
||||
$config->story->exportFields = '
|
||||
id, module, title, spec, keywords,
|
||||
pri, estimate, status,
|
||||
openedBy, openedDate, assignedTo, assignedDate, mailto,
|
||||
|
||||
@@ -85,7 +85,8 @@
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="7" class="text-center form-actions">
|
||||
<?php echo html::submitButton($lang->save);?>
|
||||
<?php echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide');?>
|
||||
<?php echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?>
|
||||
<?php echo html::backButton();?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -24,13 +24,21 @@
|
||||
<div class="center-block">
|
||||
<div class="main-header">
|
||||
<h2><?php echo $lang->story->create;?></h2>
|
||||
<?php if(!$this->story->checkForceReview()):?>
|
||||
<div class="needNotReviewBox">
|
||||
<div class='checkbox-primary'>
|
||||
<input id='needNotReview' name='needNotReview' value='1' type='checkbox' class='no-margin' <?php echo $needReview;?>/>
|
||||
<label for='needNotReview'><?php echo $lang->story->needNotReview;?></label>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
<form class="load-indicator main-form form-ajax" method='post' enctype='multipart/form-data' id='dataform'>
|
||||
<table class="table table-form">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->module;?></th>
|
||||
<td>
|
||||
<td colspan='2'>
|
||||
<div class='input-group' id='moduleIdBox'>
|
||||
<?php
|
||||
echo html::select('module', $moduleOptionMenu, $moduleID, "class='form-control chosen'");
|
||||
@@ -39,7 +47,7 @@
|
||||
echo "<div class='input-group-addon'>";
|
||||
echo html::a($this->createLink('tree', 'browse', "rootID=$productID&view=story¤tModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='90%'");
|
||||
echo ' ';
|
||||
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($productID)'");
|
||||
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='refresh' onclick='loadProductModules($productID)'");
|
||||
echo '</div>';
|
||||
}
|
||||
?>
|
||||
@@ -48,21 +56,13 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->reviewedBy;?></th>
|
||||
<td colspan='<?php echo $type == 'story' ? 4 : 2;?>' id='reviewerBox'>
|
||||
<td colspan='2' id='reviewerBox'>
|
||||
<div class="table-row">
|
||||
<?php $required = $this->story->checkForceReview() ? 'required' : '';?>
|
||||
<?php echo $this->story->checkForceReview() ? '' : html::hidden('needNotReview', 1);?>
|
||||
<div class="table-col">
|
||||
<?php echo html::select('reviewer[]', $reviewers, empty($needReview) ? $product->PO : '', "class='form-control chosen' multiple");?>
|
||||
<?php echo html::select('reviewer[]', $reviewers, empty($needReview) ? $product->PO : '', "class='form-control picker-select' multiple $required");?>
|
||||
</div>
|
||||
<?php if(!$this->story->checkForceReview()):?>
|
||||
<div class="table-col w-130px">
|
||||
<span class="input-group-addon" style="border: 1px solid #dcdcdc; border-left-width: 0px;">
|
||||
<div class='checkbox-primary'>
|
||||
<input id='needNotReview' name='needNotReview' value='1' type='checkbox' class='no-margin' <?php echo $needReview;?>/>
|
||||
<label for='needNotReview'><?php echo $lang->story->needNotReview;?></label>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -134,10 +134,6 @@
|
||||
<?php echo html::textarea('spec', $spec, "rows='9' class='form-control kindeditor disabled-ie-placeholder' hidefocus='true' placeholder='" . htmlSpecialString($lang->noticePasteImg) . "'");?>
|
||||
</td>
|
||||
</tr>
|
||||
<tr class='hide'>
|
||||
<th><?php echo $lang->story->status;?></th>
|
||||
<td><?php echo html::hidden('status', 'draft');?></td>
|
||||
</tr>
|
||||
<?php $this->printExtendFields('', 'table', 'columns=4');?>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->legendAttatch;?></th>
|
||||
@@ -147,7 +143,7 @@
|
||||
<th><?php echo $lang->story->mailto;?></th>
|
||||
<td colspan="4">
|
||||
<div class="input-group">
|
||||
<?php echo html::select('mailto[]', $users, str_replace(' ' , '', $mailto), "class='form-control chosen' data-placeholder='{$lang->chooseUsersToMail}' multiple");?>
|
||||
<?php echo html::select('mailto[]', $users, str_replace(' ' , '', $mailto), "class='form-control picker-select' data-placeholder='{$lang->chooseUsersToMail}' multiple");?>
|
||||
<?php echo $this->fetch('my', 'buildContactLists');?>
|
||||
</div>
|
||||
</td>
|
||||
@@ -162,10 +158,12 @@
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="5" class="text-center form-actions">
|
||||
<?php echo html::hidden('type', $type) . html::submitButton();?>
|
||||
<?php echo html::hidden('type', $type);?>
|
||||
<?php echo html::hidden('product', $productID);?>
|
||||
<?php echo html::hidden('plan', $planID);?>
|
||||
<?php echo html::hidden('vision', 'lite');?>
|
||||
<?php echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide');?>
|
||||
<?php echo html::commonButton($lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');?>
|
||||
<?php echo html::backButton();?>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -14,14 +14,16 @@
|
||||
<?php include $this->app->getModuleRoot() . 'common/view/kindeditor.html.php';?>
|
||||
<?php js::set('page', 'edit')?>
|
||||
<?php js::set('oldProductID', $story->product);?>
|
||||
<?php js::set('storyID', $story->id);?>
|
||||
<?php js::set('parentStory', !empty($story->children));?>
|
||||
<?php js::set('moveChildrenTips', $lang->story->moveChildrenTips);?>
|
||||
<?php js::set('rawModule', $this->app->rawModule);?>
|
||||
<?php js::set('reviewedReviewer', $reviewedReviewer);?>
|
||||
<?php js::set('storyModule', $lang->story->module);?>
|
||||
<?php js::set('reviewers', explode(',', $reviewers));?>
|
||||
<?php js::set('reviewers', $reviewers);?>
|
||||
<?php js::set('reviewerNotEmpty', $lang->story->notice->reviewerNotEmpty);?>
|
||||
<?php js::set('feedbackSource', $config->story->feedbackSource); ?>
|
||||
<?php js::set('storyStatus', $story->status);?>
|
||||
<div class='main-content' id='mainContent'>
|
||||
<form method='post' enctype='multipart/form-data' target='hiddenwin' id='dataform'>
|
||||
<div class='main-header'>
|
||||
@@ -34,7 +36,7 @@
|
||||
<div class='main-row'>
|
||||
<div class='main-col col-8'>
|
||||
<div class='cell'>
|
||||
<div class='form-group'>
|
||||
<div class='form-group titleBox'>
|
||||
<div class="input-control has-icon-right">
|
||||
<div class="colorpicker">
|
||||
<button type="button" class="btn btn-link dropdown-toggle" data-toggle="dropdown" title="<?php echo $lang->task->colorTag ?>"><span class="cp-title"></span><span class="color-bar"></span><i class="ic"></i></button>
|
||||
@@ -43,12 +45,40 @@
|
||||
</ul>
|
||||
<input type="hidden" class="colorpicker" id="color" name="color" value="<?php echo $story->color ?>" data-icon="color" data-wrapper="input-control-icon-right" data-update-color=".story-title" data-provide="colorpicker">
|
||||
</div>
|
||||
<?php echo html::input('title', $story->title, 'class="form-control disabled story-title" disabled="disabled"');?>
|
||||
<?php echo html::input('title', $story->title, 'class="form-control disabled story-title"' . (strpos('draft,changing', $story->status) !== false ? '' : ' disabled="disabled"'));?>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(strpos('draft,changing', $story->status) !== false):?>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->story->reviewers;?></div>
|
||||
<div class='detail-content'>
|
||||
<div class="table-row">
|
||||
<?php if(!$this->story->checkForceReview()):?>
|
||||
<div class="table-col">
|
||||
<?php echo html::select('reviewer[]', $productReviewers, $reviewers, 'class="form-control picker-select" multiple')?>
|
||||
</div>
|
||||
<div class="table-col needNotReviewBox">
|
||||
<span class="input-group-addon" style="border: 1px solid #dcdcdc; border-left-width: 0px;">
|
||||
<div class='checkbox-primary'>
|
||||
<input id='needNotReview' name='needNotReview' value='1' type='checkbox' class='no-margin' <?php echo empty($reviewers) ? 'checked' : '';?>/>
|
||||
<label for='needNotReview'><?php echo $lang->story->needNotReview;?></label>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
<?php else:?>
|
||||
<div class="table-col">
|
||||
<?php echo html::select('reviewer[]', $productReviewers, $reviewers, 'class="form-control picker-select" multiple required')?>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif;?>
|
||||
<div class='detail'>
|
||||
<div class='detail-title'><?php echo $lang->story->legendSpec;?></div>
|
||||
<div class='detail-content article-content'><?php echo $story->spec;?></div>
|
||||
<div class='detail-content article-content'>
|
||||
<?php echo strpos('draft,changing', $story->status) !== false ? html::textarea('spec', htmlSpecialString($story->spec), "rows='5' class='form-control'") : $story->spec;?>
|
||||
</div>
|
||||
</div>
|
||||
<?php $this->printExtendFields($story, 'div', 'position=left');?>
|
||||
<div class='detail'>
|
||||
@@ -61,7 +91,15 @@
|
||||
<?php
|
||||
echo html::hidden('lastEditedDate', $story->lastEditedDate);
|
||||
echo html::hidden('product', $story->product);
|
||||
echo html::submitButton($lang->save);
|
||||
if(strpos('draft,changing', $story->status) !== false)
|
||||
{
|
||||
echo html::commonButton($lang->save, "id='saveButton'", 'btn btn-primary btn-wide');
|
||||
echo html::commonButton($story->status == 'changing' ? $lang->story->doNotSubmit : $lang->story->saveDraft, "id='saveDraftButton'", 'btn btn-secondary btn-wide');
|
||||
}
|
||||
else
|
||||
{
|
||||
echo html::submitButton($lang->save);
|
||||
}
|
||||
if(!isonlybody()) echo html::backButton();
|
||||
?>
|
||||
</div>
|
||||
@@ -85,7 +123,7 @@
|
||||
echo "<span class='input-group-addon'>";
|
||||
echo html::a($this->createLink('tree', 'browse', "rootID=$story->product&view=story¤tModuleID=0&branch=$story->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
|
||||
echo ' ';
|
||||
echo html::a("javascript:void(0)", $lang->refresh, '', "class='refresh' onclick='loadProductModules($story->product)'");
|
||||
echo html::a("javascript:void(0)", $lang->refreshIcon, '', "class='refresh' title='$lang->refresh' onclick='loadProductModules($story->product)'");
|
||||
echo '</span>';
|
||||
}
|
||||
?>
|
||||
@@ -129,7 +167,7 @@
|
||||
<th><?php echo $lang->story->mailto;?></th>
|
||||
<td>
|
||||
<div class='input-group'>
|
||||
<?php echo html::select('mailto[]', $users, str_replace(' ' , '', $story->mailto), "class='form-control chosen' multiple");?>
|
||||
<?php echo html::select('mailto[]', $users, str_replace(' ' , '', $story->mailto), "class='form-control picker-select' multiple");?>
|
||||
<?php echo $this->fetch('my', 'buildContactLists');?>
|
||||
</div>
|
||||
</td>
|
||||
@@ -145,12 +183,13 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->assignedTo;?></th>
|
||||
<td><?php echo html::select('assignedTo', $users, $story->assignedTo, 'class="form-control chosen"');?></td>
|
||||
<?php $assignedToList = $story->status == 'closed' ? $users + array('closed' => 'Closed') : $users;?>
|
||||
<td><?php echo html::select('assignedTo', $assignedToList, $story->assignedTo, 'class="form-control chosen"');?></td>
|
||||
</tr>
|
||||
<?php if($isShowReviewer):?>
|
||||
<?php if($story->status == 'reviewing'):?>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->reviewers;?></th>
|
||||
<td><?php echo html::select('reviewer[]', $productReviewers, $reviewers, 'class="form-control chosen" multiple')?></td>
|
||||
<td><?php echo html::select('reviewer[]', $productReviewers, $reviewers, 'class="form-control picker-select" multiple')?></td>
|
||||
</tr>
|
||||
<?php endif;?>
|
||||
<?php if($story->status == 'closed'):?>
|
||||
|
||||
@@ -108,7 +108,14 @@
|
||||
<td class='c-actions'>
|
||||
<?php
|
||||
common::printIcon('story', 'change', "storyID=$child->id", $child, 'list', 'alter');
|
||||
common::printIcon('story', 'review', "storyID=$child->id", $child, 'list', 'search', '', 'iframe showinonlybody', true);
|
||||
if(strpos('draft,changing', $child->status) !== false)
|
||||
{
|
||||
common::printIcon('story', 'submitReview', "storyID=$child->id", $child, 'list', 'sub-review', '', 'iframe showinonlybody', true);
|
||||
}
|
||||
else
|
||||
{
|
||||
common::printIcon('story', 'review', "storyID=$child->id", $child, 'list', 'search', '', 'iframe showinonlybody', true);
|
||||
}
|
||||
common::printIcon('story', 'assignTo', "storyID=$child->id", $child, 'list', '', '', 'iframe showinonlybody', true);
|
||||
common::printIcon('story', 'close', "storyID=$child->id", $child, 'list', '', '', 'iframe showinonlybody', true);
|
||||
common::printIcon('story', 'activate', "storyID=$child->id", $child, 'list', '', '', 'iframe showinonlybody', true);
|
||||
@@ -134,7 +141,14 @@
|
||||
<?php if(!$story->deleted):?>
|
||||
<?php
|
||||
common::printIcon('story', 'change', "storyID=$story->id", $story, 'button', 'alter', '', 'showinonlybody');
|
||||
common::printIcon('story', 'review', "storyID=$story->id", $story, 'button', 'search', '', 'showinonlybody');
|
||||
if(strpos('draft,changing', $story->status) !== false)
|
||||
{
|
||||
common::printIcon('story', 'submitReview', "storyID=$story->id", $story, 'button', 'sub-review', '', 'iframe showinonlybody', true);
|
||||
}
|
||||
else
|
||||
{
|
||||
common::printIcon('story', 'review', "storyID=$story->id", $story, 'button', 'search', '', 'iframe showinonlybody', true);
|
||||
}
|
||||
if($story->status == 'active' and $story->stage == 'wait' and $story->parent <= 0 and !isonlybody())
|
||||
{
|
||||
$divideLang = $lang->story->subdivide;
|
||||
@@ -147,7 +161,7 @@
|
||||
common::printIcon('story', 'close', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true);
|
||||
common::printIcon('story', 'activate', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true);
|
||||
|
||||
if($from == 'execution' and strpos('draft,closed', $story->status) === false) common::printIcon('task', 'create', "execution=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'plus', '', 'showinonlybody');
|
||||
if($from == 'execution' and strpos('draft,reviewing,closed', $story->status) === false) common::printIcon('task', 'create', "execution=$param&storyID=$story->id&moduleID=$story->module", $story, 'button', 'plus', '', 'showinonlybody');
|
||||
|
||||
echo "<div class='divider'></div>";
|
||||
common::printIcon('story', 'edit', "storyID=$story->id", $story);
|
||||
@@ -221,7 +235,18 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<th><?php echo $lang->story->legendMailto;?></th>
|
||||
<td><?php $mailto = explode(',', $story->mailto); foreach($mailto as $account) {if(empty($account)) continue; echo "<span>" . zget($users, trim($account)) . '</span> '; }?></td>
|
||||
<td>
|
||||
<?php
|
||||
if(!empty($story->mailto))
|
||||
{
|
||||
foreach(explode(',', $story->mailto) as $account)
|
||||
{
|
||||
if(empty($account)) continue;
|
||||
echo "<span>" . zget($users, trim($account)) . '</span> ';
|
||||
}
|
||||
}
|
||||
?>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -7,4 +7,4 @@ $config->task->datatable->fieldList['lane']['title'] = 'lane';
|
||||
$config->task->datatable->fieldList['lane']['fixed'] = 'no';
|
||||
$config->task->datatable->fieldList['lane']['width'] = '120';
|
||||
$config->task->datatable->fieldList['lane']['required'] = 'no';
|
||||
$config->task->datatable->fieldList['lane']['sort'] = 'no';
|
||||
$config->task->datatable->fieldList['lane']['sort'] = 'no';
|
||||
|
||||
@@ -336,6 +336,7 @@
|
||||
<?php js::set('storyPinYin', (empty($config->isINT) and class_exists('common')) ? common::convert2Pinyin($stories) : array());?>
|
||||
<?php js::set('testStoryIdList', $testStoryIdList);?>
|
||||
<?php js::set('executionID', $execution->id);?>
|
||||
<?php js::set('executionType', $execution->type);?>
|
||||
<?php if(isonlybody()):?>
|
||||
<style>
|
||||
.body-modal .main-header {padding-right: 0px; z-index: 1000;}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php if($config->visions == ',lite,'):?>
|
||||
<?php $feedbackDatasources = $this->dao->select('id')->from(TABLE_WORKFLOWDATASOURCE)->where('code')->like('litefeedback%')->andWhere('vision')->eq('lite')->fetchPairs('id', 'id');?>
|
||||
<?php if($feedbackDatasources):?>
|
||||
<script>
|
||||
<?php foreach($feedbackDatasources as $id):?>
|
||||
$('#fieldOptionType option[value=<?php echo $id;?>]').remove();
|
||||
<?php endforeach;?>
|
||||
$('#fieldOptionType').trigger("chosen:updated");
|
||||
</script>
|
||||
<?php endif;?>
|
||||
<?php endif;?>
|
||||
@@ -253,10 +253,15 @@ class baseModel
|
||||
{
|
||||
if(empty($extensionName)) return false;
|
||||
|
||||
/* 设置扩展的名字和相应的文件。Set extenson name and extension file. */
|
||||
$moduleName = $moduleName ? $moduleName : $this->getModuleName();
|
||||
$moduleName = strtolower($moduleName);
|
||||
$extensionName = strtolower($extensionName);
|
||||
|
||||
/* 设置扩展类的名字。Set the extension class name. */
|
||||
$extensionClass = $extensionName . ucfirst($moduleName);
|
||||
if(isset($this->$extensionClass)) return $this->$extensionClass;
|
||||
|
||||
/* 设置扩展的名字和相应的文件。Set extenson name and extension file. */
|
||||
$moduleExtPath = $this->app->getModuleExtPath($this->appName, $moduleName, 'model');
|
||||
if(!empty($moduleExtPath['site'])) $extensionFile = $moduleExtPath['site'] . 'class/' . $extensionName . '.class.php';
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['custom'] . 'class/' . $extensionName . '.class.php';
|
||||
@@ -265,10 +270,6 @@ class baseModel
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['xuan'] . 'class/' . $extensionName . '.class.php';
|
||||
if(!isset($extensionFile) or !file_exists($extensionFile)) $extensionFile = $moduleExtPath['common'] . 'class/' . $extensionName . '.class.php';
|
||||
|
||||
/* 设置扩展类的名字。Set the extension class name. */
|
||||
$extensionClass = $extensionName . ucfirst($moduleName);
|
||||
if(isset($this->$extensionClass)) return $this->$extensionClass;
|
||||
|
||||
/* 载入父类。Try to import parent model file auto and then import the extension file. */
|
||||
if(!class_exists($moduleName . 'Model')) helper::import($this->app->getModulePath($this->appName, $moduleName) . 'model.php');
|
||||
if(!helper::import($extensionFile)) return false;
|
||||
|
||||
+152
-113
@@ -996,14 +996,7 @@ class baseRouter
|
||||
if($writable)
|
||||
{
|
||||
$ztSessionHandler = new ztSessionHandler($_GET['tid']);
|
||||
session_set_save_handler(
|
||||
array($ztSessionHandler, "open"),
|
||||
array($ztSessionHandler, "close"),
|
||||
array($ztSessionHandler, "read"),
|
||||
array($ztSessionHandler, "write"),
|
||||
array($ztSessionHandler, "destroy"),
|
||||
array($ztSessionHandler, "gc")
|
||||
);
|
||||
session_set_save_handler($ztSessionHandler, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1435,6 +1428,138 @@ class baseRouter
|
||||
if($this->checkMethodName($methodName)) $this->methodName = strtolower($methodName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置要被调用方法的参数。
|
||||
* Set the params of method calling.
|
||||
*
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function setParams()
|
||||
{
|
||||
try
|
||||
{
|
||||
$appName = $this->appName;
|
||||
$moduleName = $this->moduleName;
|
||||
$methodName = $this->methodName;
|
||||
|
||||
/*
|
||||
* 引入该模块的control文件。
|
||||
* Include the control file of the module.
|
||||
**/
|
||||
$isExt = $this->setActionExtFile();
|
||||
if($isExt)
|
||||
{
|
||||
$controlFile = $this->controlFile;
|
||||
spl_autoload_register(function($class) use ($moduleName, $controlFile)
|
||||
{
|
||||
if($class == $moduleName) include $controlFile;
|
||||
});
|
||||
}
|
||||
|
||||
$file2Included = $isExt ? $this->extActionFile : $this->controlFile;
|
||||
chdir(dirname($file2Included));
|
||||
helper::import($file2Included);
|
||||
|
||||
/* Check file is encode by ioncube. */
|
||||
$isEncrypted = false;
|
||||
if($isExt)
|
||||
{
|
||||
$fp = fopen($file2Included, 'r');
|
||||
$line1 = fgets($fp);
|
||||
$line2 = fgets($fp);
|
||||
fclose($fp);
|
||||
if(strpos($line1, '<?php //') === 0 and strpos($line2, "if(!extension_loaded('ionCube Loader'))") === 0) $isEncrypted = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* 设置control的类名。
|
||||
* Set the class name of the control.
|
||||
**/
|
||||
$className = class_exists("my$moduleName") ? "my$moduleName" : $moduleName;
|
||||
if(!class_exists($className)) $this->triggerError("the control $className not found", __FILE__, __LINE__, $exit = true);
|
||||
|
||||
/*
|
||||
* 创建control类的实例。
|
||||
* Create a instance of the control.
|
||||
**/
|
||||
$module = new $className();
|
||||
if(!method_exists($module, $methodName)) $this->triggerError("the module $moduleName has no $methodName method", __FILE__, __LINE__, $exit = true);
|
||||
$this->control = $module;
|
||||
|
||||
/* include default value for module*/
|
||||
$defaultValueFiles = glob($this->getTmpRoot() . "defaultvalue/*.php");
|
||||
if($defaultValueFiles) foreach($defaultValueFiles as $file) include $file;
|
||||
|
||||
/*
|
||||
* 使用反射机制获取函数参数的默认值。
|
||||
* Get the default settings of the method to be called using the reflecting.
|
||||
*
|
||||
* */
|
||||
$defaultParams = array();
|
||||
$methodReflect = new reflectionMethod($className, $methodName);
|
||||
foreach($methodReflect->getParameters() as $param)
|
||||
{
|
||||
$name = $param->getName();
|
||||
|
||||
$default = '_NOT_SET';
|
||||
if(isset($paramDefaultValue[$appName][$className][$methodName][$name]))
|
||||
{
|
||||
$default = $paramDefaultValue[$appName][$className][$methodName][$name];
|
||||
}
|
||||
elseif(isset($paramDefaultValue[$className][$methodName][$name]))
|
||||
{
|
||||
$default = $paramDefaultValue[$className][$methodName][$name];
|
||||
}
|
||||
elseif(!$isEncrypted and $param->isDefaultValueAvailable())
|
||||
{
|
||||
$default = $param->getDefaultValue();
|
||||
}
|
||||
|
||||
$defaultParams[$name] = $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据PATH_INFO或者GET方式设置请求的参数。
|
||||
* Set params according PATH_INFO or GET.
|
||||
*/
|
||||
if($this->config->requestType != 'GET')
|
||||
{
|
||||
$this->setParamsByPathInfo($defaultParams);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->setParamsByGET($defaultParams);
|
||||
}
|
||||
|
||||
if ('cli' === PHP_SAPI)
|
||||
{
|
||||
if ($this->params)
|
||||
{
|
||||
$this->params = array_merge($defaultParams, $this->params);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->params = $defaultParams;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if($this->config->framework->filterParam == 2)
|
||||
{
|
||||
$_GET = validater::filterParam($_GET, 'get');
|
||||
$_COOKIE = validater::filterParam($_COOKIE, 'cookie');
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch(EndResponseException $endResponseException)
|
||||
{
|
||||
echo $endResponseException->getContent();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取一个模块的路径。
|
||||
* Get the path of one module.
|
||||
@@ -1532,8 +1657,14 @@ class baseRouter
|
||||
public function checkModuleName($var, $exit = true)
|
||||
{
|
||||
global $filter;
|
||||
$rule = $filter->default->moduleName;
|
||||
if(validater::checkByRule($var, $rule)) return true;
|
||||
static $checkedModule = array();
|
||||
if(!isset($checkedModule[$var]))
|
||||
{
|
||||
$rule = $filter->default->moduleName;
|
||||
$result = validater::checkByRule($var, $rule);
|
||||
$checkedModule[$var] = $result;
|
||||
}
|
||||
if($checkedModule[$var]) return true;
|
||||
if(!$exit) return false;
|
||||
$this->triggerError("'$var' illegal. ", __FILE__, __LINE__, $exit = true);
|
||||
}
|
||||
@@ -2027,110 +2158,12 @@ class baseRouter
|
||||
public function loadModule()
|
||||
{
|
||||
try {
|
||||
$appName = $this->appName;
|
||||
$moduleName = $this->moduleName;
|
||||
$methodName = $this->methodName;
|
||||
|
||||
/*
|
||||
* 引入该模块的control文件。
|
||||
* Include the control file of the module.
|
||||
**/
|
||||
$isExt = $this->setActionExtFile();
|
||||
if($isExt)
|
||||
{
|
||||
$controlFile = $this->controlFile;
|
||||
spl_autoload_register(function($class) use ($moduleName, $controlFile)
|
||||
{
|
||||
if($class == $moduleName) include $controlFile;
|
||||
});
|
||||
}
|
||||
|
||||
$file2Included = $isExt ? $this->extActionFile : $this->controlFile;
|
||||
chdir(dirname($file2Included));
|
||||
helper::import($file2Included);
|
||||
|
||||
/*
|
||||
* 设置control的类名。
|
||||
* Set the class name of the control.
|
||||
**/
|
||||
$className = class_exists("my$moduleName") ? "my$moduleName" : $moduleName;
|
||||
if(!class_exists($className)) $this->triggerError("the control $className not found", __FILE__, __LINE__, $exit = true);
|
||||
|
||||
/*
|
||||
* 创建control类的实例。
|
||||
* Create a instance of the control.
|
||||
**/
|
||||
$module = new $className();
|
||||
if(!method_exists($module, $methodName)) $this->triggerError("the module $moduleName has no $methodName method", __FILE__, __LINE__, $exit = true);
|
||||
$this->control = $module;
|
||||
|
||||
/* include default value for module*/
|
||||
$defaultValueFiles = glob($this->getTmpRoot() . "defaultvalue/*.php");
|
||||
if($defaultValueFiles) foreach($defaultValueFiles as $file) include $file;
|
||||
|
||||
/*
|
||||
* 使用反射机制获取函数参数的默认值。
|
||||
* Get the default settings of the method to be called using the reflecting.
|
||||
*
|
||||
* */
|
||||
$defaultParams = array();
|
||||
$methodReflect = new reflectionMethod($className, $methodName);
|
||||
foreach($methodReflect->getParameters() as $param)
|
||||
{
|
||||
$name = $param->getName();
|
||||
|
||||
$default = '_NOT_SET';
|
||||
if(isset($paramDefaultValue[$appName][$className][$methodName][$name]))
|
||||
{
|
||||
$default = $paramDefaultValue[$appName][$className][$methodName][$name];
|
||||
}
|
||||
elseif(isset($paramDefaultValue[$className][$methodName][$name]))
|
||||
{
|
||||
$default = $paramDefaultValue[$className][$methodName][$name];
|
||||
}
|
||||
elseif($param->isDefaultValueAvailable())
|
||||
{
|
||||
$default = $param->getDefaultValue();
|
||||
}
|
||||
|
||||
$defaultParams[$name] = $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据PATH_INFO或者GET方式设置请求的参数。
|
||||
* Set params according PATH_INFO or GET.
|
||||
*/
|
||||
if($this->config->requestType != 'GET')
|
||||
{
|
||||
$this->setParamsByPathInfo($defaultParams);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->setParamsByGET($defaultParams);
|
||||
}
|
||||
|
||||
if ('cli' === PHP_SAPI)
|
||||
{
|
||||
if ($this->params)
|
||||
{
|
||||
$this->params = array_merge($defaultParams, $this->params);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->params = $defaultParams;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if($this->config->framework->filterParam == 2)
|
||||
{
|
||||
$_GET = validater::filterParam($_GET, 'get');
|
||||
$_COOKIE = validater::filterParam($_COOKIE, 'cookie');
|
||||
}
|
||||
}
|
||||
if(is_null($this->params) and !$this->setParams()) return false;
|
||||
|
||||
/* 调用该方法 Call the method. */
|
||||
call_user_func_array(array($module, $methodName), $this->params);
|
||||
$module = $this->control;
|
||||
|
||||
call_user_func_array(array($module, $this->methodName), $this->params);
|
||||
$this->checkAPIFile();
|
||||
return $module;
|
||||
} catch (EndResponseException $endResponseException) {
|
||||
@@ -3107,7 +3140,7 @@ class EndResponseException extends \Exception
|
||||
*
|
||||
* @package framework
|
||||
*/
|
||||
class ztSessionHandler
|
||||
class ztSessionHandler implements SessionHandlerInterface
|
||||
{
|
||||
public $sessSavePath;
|
||||
public $tagID;
|
||||
@@ -3171,6 +3204,7 @@ class ztSessionHandler
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function open($savePath, $sessionName)
|
||||
{
|
||||
$this->sessSavePath = $savePath;
|
||||
@@ -3183,6 +3217,7 @@ class ztSessionHandler
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function close()
|
||||
{
|
||||
return true;
|
||||
@@ -3195,6 +3230,7 @@ class ztSessionHandler
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function read($id)
|
||||
{
|
||||
$sessFile = $this->getSessionFile($id);
|
||||
@@ -3214,6 +3250,7 @@ class ztSessionHandler
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function write($id, $sessData)
|
||||
{
|
||||
$sessFile = $this->getSessionFile($id);
|
||||
@@ -3244,6 +3281,7 @@ class ztSessionHandler
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function destroy($id)
|
||||
{
|
||||
$sessFile = $this->getSessionFile($id);
|
||||
@@ -3260,6 +3298,7 @@ class ztSessionHandler
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function gc($maxlifeTime)
|
||||
{
|
||||
$time = time();
|
||||
|
||||
@@ -389,27 +389,21 @@ class control extends baseControl
|
||||
* inForm=0|1 The fields displayed in a form or not. The default is 1.
|
||||
* inCell=0|1 The fields displayed in a div with class cell or not. The default is 0.
|
||||
* @param bool $print
|
||||
* @param string $moduleName
|
||||
* @param string $methodName
|
||||
* @access public
|
||||
* @return void
|
||||
*/
|
||||
public function printExtendFields($object, $type, $extras = '', $print = true)
|
||||
public function printExtendFields($object, $type, $extras = '', $print = true, $moduleName = '', $methodName = '')
|
||||
{
|
||||
if(!isset($this->config->bizVersion)) return false;
|
||||
|
||||
$moduleName = $this->app->getModuleName();
|
||||
$methodName = $this->app->getMethodName();
|
||||
$moduleName = $moduleName ? $moduleName : $this->app->getModuleName();
|
||||
$methodName = $methodName ? $methodName : $this->app->getMethodName();
|
||||
$fields = $this->loadModel('flow')->printFields($moduleName, $methodName, $object, $type, $extras);
|
||||
if(!$print) return $fields;
|
||||
|
||||
$picker = '';
|
||||
//$jsRoot = $this->config->webRoot . "js/";
|
||||
//$picker = file_get_contents($this->app->getBasePath() . 'app/sys/common/view/picker.html.php');
|
||||
//$picker = substr($picker, strpos($picker, '<style>'));
|
||||
|
||||
//js::import($jsRoot . 'picker/min.js');
|
||||
//css::import($jsRoot . 'picker/min.css');
|
||||
|
||||
echo $picker . $fields;
|
||||
echo $fields;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -157,6 +157,20 @@ class model extends baseModel
|
||||
}
|
||||
if(empty($relations)) $relations = $this->dao->select('next, actions')->from(TABLE_WORKFLOWRELATION)->where('prev')->eq($moduleName)->fetchPairs();
|
||||
|
||||
$this->loadModel('flow');
|
||||
|
||||
$approvalProgressMenu = '';
|
||||
if($type == 'view' && !empty($this->config->openedApproval) && commonModel::hasPriv('approval', 'progress'))
|
||||
{
|
||||
$flow = $this->loadModel('workflow', 'flow')->getByModule($moduleName);
|
||||
if($flow->approval == 'enabled' && !empty($data->approval))
|
||||
{
|
||||
$extraClass = strpos(',testsuite,build,release,productplan,', ",{$moduleName},") !== false ? 'btn-link' : '';
|
||||
$approvalProgressMenu .= "<div class='divider'></div>";
|
||||
$approvalProgressMenu .= baseHTML::a(helper::createLink('approval', 'progress', "approvalID={$data->approval}", '', true), $this->lang->flow->approvalProgress, "class='btn {$extraClass} iframe'");
|
||||
}
|
||||
}
|
||||
|
||||
$menu = '';
|
||||
if($show)
|
||||
{
|
||||
@@ -164,8 +178,10 @@ class model extends baseModel
|
||||
{
|
||||
if(strpos($action->position, $type) === false || $action->show != $show) continue;
|
||||
|
||||
$menu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
$menu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
}
|
||||
|
||||
if($approvalProgressMenu) $menu .= $approvalProgressMenu;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -174,10 +190,12 @@ class model extends baseModel
|
||||
{
|
||||
if(strpos($action->position, $type) === false) continue;
|
||||
|
||||
if($type == 'view' || $action->show == 'direct') $menu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
if($type == 'browse' && $action->show == 'dropdownlist') $dropdownMenu .= $this->loadModel('flow')->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
if($type == 'view' || $action->show == 'direct') $menu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
if($type == 'browse' && $action->show == 'dropdownlist') $dropdownMenu .= $this->flow->buildActionMenu($moduleName, $action, $data, $type, $relations);
|
||||
}
|
||||
|
||||
if($approvalProgressMenu) $menu .= $approvalProgressMenu;
|
||||
|
||||
if($type == 'browse' && $dropdownMenu)
|
||||
{
|
||||
$menu .= "<div class='dropdown'><a href='javascript:;' data-toggle='dropdown'>{$this->lang->more}<span class='caret'> </span></a>";
|
||||
|
||||
@@ -280,16 +280,6 @@ class basePager
|
||||
if(strtolower($key) == 'recperpage') $this->params[$key] = $this->recPerPage;
|
||||
if(strtolower($key) == 'pageid') $this->params[$key] = $this->pageID;
|
||||
}
|
||||
|
||||
parse_str(strip_tags(urldecode($_SERVER['QUERY_STRING'])), $query);
|
||||
if(!empty($query['m']) && !empty($query['f']) && $query['m'] == $this->moduleName && $query['f'] == $this->methodName)
|
||||
{
|
||||
unset($query['m']);
|
||||
unset($query['f']);
|
||||
unset($query['t']);
|
||||
|
||||
$this->params = array_merge($this->params, $query);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -29,7 +29,7 @@ class dao extends baseDAO
|
||||
/**
|
||||
* 设置需要更新或插入的数据。
|
||||
* Set the data to update or insert.
|
||||
*
|
||||
*
|
||||
* @param object $data the data object or array
|
||||
* @access public
|
||||
* @return object the dao object self.
|
||||
@@ -182,7 +182,7 @@ class dao extends baseDAO
|
||||
|
||||
/**
|
||||
* Check workFlow field rule.
|
||||
*
|
||||
*
|
||||
* @access public
|
||||
* @return object the dao object self.
|
||||
*/
|
||||
@@ -195,10 +195,10 @@ class dao extends baseDAO
|
||||
$module = $app->getModuleName();
|
||||
$method = $app->getMethodName();
|
||||
|
||||
$flowAction = $this->dbh->query("SELECT * FROM " . TABLE_WORKFLOWACTION . " WHERE `module` = '{$module}' AND `action` = '{$method}' AND `buildin` = '1' AND `extensionType` = 'extend'")->fetch(PDO::FETCH_OBJ);
|
||||
$flowAction = $this->dbh->query("SELECT * FROM " . TABLE_WORKFLOWACTION . " WHERE `module` = '{$module}' AND `action` = '{$method}' AND `buildin` = '1' AND `extensionType` = 'extend' AND `vision` = '{$config->vision}'")->fetch(PDO::FETCH_OBJ);
|
||||
if(!$flowAction) return $this;
|
||||
|
||||
$flowFields = $this->dbh->query("SELECT t2.name,t2.rules,t2.control,t2.field,t1.layoutRules FROM " . TABLE_WORKFLOWLAYOUT . " AS t1 LEFT JOIN " . TABLE_WORKFLOWFIELD . " AS t2 ON t1.module = t2.module AND t1.field = t2.field WHERE t1.module = '{$module}' AND t1.action = '{$method}' AND t1.readonly = '0'")->fetchAll();
|
||||
$flowFields = $this->dbh->query("SELECT t2.name,t2.rules,t2.control,t2.field,t1.layoutRules FROM " . TABLE_WORKFLOWLAYOUT . " AS t1 LEFT JOIN " . TABLE_WORKFLOWFIELD . " AS t2 ON t1.module = t2.module AND t1.field = t2.field WHERE t1.module = '{$module}' AND t1.action = '{$method}' AND t1.readonly = '0' AND t1.vision = '{$config->vision}'")->fetchAll();
|
||||
if(!$flowFields) return $this;
|
||||
|
||||
$rules = array();
|
||||
@@ -232,10 +232,10 @@ class dao extends baseDAO
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查工作流扩展字段
|
||||
* check workflow extend field
|
||||
*
|
||||
* @param array $fields
|
||||
* 检查工作流扩展字段
|
||||
* check workflow extend field
|
||||
*
|
||||
* @param array $fields
|
||||
* @access public
|
||||
* @return object the dao object self
|
||||
*/
|
||||
|
||||
@@ -57,6 +57,7 @@ class html extends baseHTML
|
||||
{
|
||||
$id = "id='$name'";
|
||||
if(strpos($attrib, 'id=') !== false) $id = '';
|
||||
if(is_null($value)) $value = '';
|
||||
$value = str_replace("'", ''', $value);
|
||||
$autocomplete = $autocomplete ? 'autocomplete="on"' : 'autocomplete="off"';
|
||||
return "<input type='text' name='$name' {$id} value='$value' $attrib $autocomplete />\n";
|
||||
|
||||
+136
-136
@@ -29,7 +29,7 @@
|
||||
if (!defined('PCLZIP_READ_BLOCK_SIZE')) {
|
||||
define( 'PCLZIP_READ_BLOCK_SIZE', 2048 );
|
||||
}
|
||||
|
||||
|
||||
// ----- File list separator
|
||||
// In version 1.x of PclZip, the separator for file list is a space
|
||||
// (which is not a very smart choice, specifically for windows paths !).
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
// ----- Optional threshold ratio for use of temporary files
|
||||
// Pclzip sense the size of the file to add/extract and decide to
|
||||
// use or not temporary file. The algorythm is looking for
|
||||
// use or not temporary file. The algorythm is looking for
|
||||
// memory_limit of PHP and apply a ratio.
|
||||
// threshold = memory_limit * ratio.
|
||||
// Recommended values are under 0.5. Default 0.47.
|
||||
@@ -152,7 +152,7 @@
|
||||
define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); // alias
|
||||
define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 );
|
||||
define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); // alias
|
||||
|
||||
|
||||
// ----- File description attributes
|
||||
define( 'PCLZIP_ATT_FILE_NAME', 79001 );
|
||||
define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 );
|
||||
@@ -198,7 +198,7 @@
|
||||
// ----- Internal error handling
|
||||
var $error_code = 1;
|
||||
var $error_string = '';
|
||||
|
||||
|
||||
// ----- Current status of the magic_quotes_runtime
|
||||
// This value store the php configuration for magic_quotes
|
||||
// The class can then disable the magic_quotes and reset it after
|
||||
@@ -332,7 +332,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for default option values
|
||||
$this->privOptionDefaultThreshold($v_options);
|
||||
|
||||
@@ -341,16 +341,16 @@
|
||||
$v_att_list = array();
|
||||
$v_filedescr_list = array();
|
||||
$p_result_list = array();
|
||||
|
||||
|
||||
// ----- Look if the $p_filelist is really an array
|
||||
if (is_array($p_filelist)) {
|
||||
|
||||
|
||||
// ----- Look if the first element is also an array
|
||||
// This will mean that this is a file description entry
|
||||
if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
|
||||
$v_att_list = $p_filelist;
|
||||
}
|
||||
|
||||
|
||||
// ----- The list is a list of string names
|
||||
else {
|
||||
$v_string_list = $p_filelist;
|
||||
@@ -368,7 +368,7 @@
|
||||
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ----- Reformat the string list
|
||||
if (sizeof($v_string_list) != 0) {
|
||||
foreach ($v_string_list as $v_string) {
|
||||
@@ -379,7 +379,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- For each file in the list check the attributes
|
||||
$v_supported_attributes
|
||||
= array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
|
||||
@@ -528,16 +528,16 @@
|
||||
$v_att_list = array();
|
||||
$v_filedescr_list = array();
|
||||
$p_result_list = array();
|
||||
|
||||
|
||||
// ----- Look if the $p_filelist is really an array
|
||||
if (is_array($p_filelist)) {
|
||||
|
||||
|
||||
// ----- Look if the first element is also an array
|
||||
// This will mean that this is a file description entry
|
||||
if (isset($p_filelist[0]) && is_array($p_filelist[0])) {
|
||||
$v_att_list = $p_filelist;
|
||||
}
|
||||
|
||||
|
||||
// ----- The list is a list of string names
|
||||
else {
|
||||
$v_string_list = $p_filelist;
|
||||
@@ -555,14 +555,14 @@
|
||||
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ----- Reformat the string list
|
||||
if (sizeof($v_string_list) != 0) {
|
||||
foreach ($v_string_list as $v_string) {
|
||||
$v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- For each file in the list check the attributes
|
||||
$v_supported_attributes
|
||||
= array ( PCLZIP_ATT_FILE_NAME => 'mandatory'
|
||||
@@ -996,7 +996,7 @@
|
||||
// Options :
|
||||
// PCLZIP_OPT_BY_INDEX :
|
||||
// PCLZIP_OPT_BY_NAME :
|
||||
// PCLZIP_OPT_BY_EREG :
|
||||
// PCLZIP_OPT_BY_EREG :
|
||||
// PCLZIP_OPT_BY_PREG :
|
||||
// Return Values :
|
||||
// 0 on failure,
|
||||
@@ -1064,7 +1064,7 @@
|
||||
// --------------------------------------------------------------------------------
|
||||
function deleteByIndex($p_index)
|
||||
{
|
||||
|
||||
|
||||
$p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index);
|
||||
|
||||
// ----- Return
|
||||
@@ -1114,7 +1114,7 @@
|
||||
if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0)
|
||||
{
|
||||
$this->privSwapBackMagicQuotes();
|
||||
|
||||
|
||||
// ----- Error log
|
||||
PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
|
||||
|
||||
@@ -1426,7 +1426,7 @@
|
||||
function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options=false)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
// ----- Read the options
|
||||
$i=0;
|
||||
while ($i<$p_size) {
|
||||
@@ -1466,13 +1466,13 @@
|
||||
PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'");
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
|
||||
// ----- Check for incompatible options
|
||||
if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) {
|
||||
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
|
||||
// ----- Check the value
|
||||
$v_value = $p_options_list[$i+1];
|
||||
if ((!is_integer($v_value)) || ($v_value<0)) {
|
||||
@@ -1491,7 +1491,7 @@
|
||||
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'");
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
|
||||
$v_result_list[$p_options_list[$i]] = true;
|
||||
break;
|
||||
|
||||
@@ -1506,7 +1506,7 @@
|
||||
PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'");
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
|
||||
$v_result_list[$p_options_list[$i]] = true;
|
||||
break;
|
||||
|
||||
@@ -1655,7 +1655,7 @@
|
||||
// ----- Return
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
|
||||
// ----- Reduce the index list
|
||||
// each index item in the list must be a couple with a start and
|
||||
// an end value : [0,3], [5-5], [8-10], ...
|
||||
@@ -1666,10 +1666,10 @@
|
||||
// ----- Explode the item
|
||||
$v_item_list = explode("-", $v_work_list[$j]);
|
||||
$v_size_item_list = sizeof($v_item_list);
|
||||
|
||||
|
||||
// ----- TBC : Here we might check that each item is a
|
||||
// real integer ...
|
||||
|
||||
|
||||
// ----- Look for single value
|
||||
if ($v_size_item_list == 1) {
|
||||
// ----- Set the option value
|
||||
@@ -1703,7 +1703,7 @@
|
||||
}
|
||||
$v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start'];
|
||||
}
|
||||
|
||||
|
||||
// ----- Sort the items
|
||||
if ($v_sort_flag) {
|
||||
// TBC : To Be Completed
|
||||
@@ -1806,10 +1806,10 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for default values
|
||||
if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
// ----- Return
|
||||
@@ -1826,12 +1826,12 @@
|
||||
function privOptionDefaultThreshold(&$p_options)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
|
||||
|| isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) {
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
|
||||
// ----- Get 'memory_limit' configuration value
|
||||
$v_memory_limit = ini_get('memory_limit');
|
||||
$v_memory_limit = trim($v_memory_limit);
|
||||
@@ -1846,15 +1846,15 @@
|
||||
$v_memory_limit = $v_memory_limit*1048576;
|
||||
if($last == 'k')
|
||||
$v_memory_limit = $v_memory_limit*1024;
|
||||
|
||||
|
||||
$p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO);
|
||||
|
||||
|
||||
|
||||
// ----- Sanity check : No threshold if value lower than 1M
|
||||
if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) {
|
||||
unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]);
|
||||
}
|
||||
|
||||
|
||||
// ----- Return
|
||||
return $v_result;
|
||||
}
|
||||
@@ -1871,10 +1871,10 @@
|
||||
function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options=false)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
// ----- For each file in the list check the attributes
|
||||
foreach ($p_file_list as $v_key => $v_value) {
|
||||
|
||||
|
||||
// ----- Check if the option is supported
|
||||
if (!isset($v_requested_options[$v_key])) {
|
||||
// ----- Error log
|
||||
@@ -1893,7 +1893,7 @@
|
||||
}
|
||||
|
||||
$p_filedescr['filename'] = PclZipUtilPathReduction($v_value);
|
||||
|
||||
|
||||
if ($p_filedescr['filename'] == '') {
|
||||
PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'");
|
||||
return PclZip::errorCode();
|
||||
@@ -1974,10 +1974,10 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// end foreach
|
||||
}
|
||||
|
||||
|
||||
// ----- Return
|
||||
return $v_result;
|
||||
}
|
||||
@@ -1990,7 +1990,7 @@
|
||||
// or a string to be added as file. For any other type of files (link, other)
|
||||
// just ignore the item.
|
||||
// Then prepare the information that will be stored for that file.
|
||||
// When its a folder, expand the folder with all the files that are in that
|
||||
// When its a folder, expand the folder with all the files that are in that
|
||||
// folder (recursively).
|
||||
// Parameters :
|
||||
// Return Values :
|
||||
@@ -2000,20 +2000,20 @@
|
||||
function privFileDescrExpand(&$p_filedescr_list, &$p_options)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
// ----- Create a result list
|
||||
$v_result_list = array();
|
||||
|
||||
|
||||
// ----- Look each entry
|
||||
for ($i=0; $i<sizeof($p_filedescr_list); $i++) {
|
||||
|
||||
|
||||
// ----- Get filedescr
|
||||
$v_descr = $p_filedescr_list[$i];
|
||||
|
||||
|
||||
// ----- Reduce the filename
|
||||
$v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false);
|
||||
$v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']);
|
||||
|
||||
|
||||
// ----- Look for real file or folder
|
||||
if (file_exists($v_descr['filename'])) {
|
||||
if (@is_file($v_descr['filename'])) {
|
||||
@@ -2031,12 +2031,12 @@
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for string added as file
|
||||
else if (isset($v_descr['content'])) {
|
||||
$v_descr['type'] = 'virtual_file';
|
||||
}
|
||||
|
||||
|
||||
// ----- Missing file
|
||||
else {
|
||||
// ----- Error log
|
||||
@@ -2045,13 +2045,13 @@
|
||||
// ----- Return
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
|
||||
// ----- Calculate the stored filename
|
||||
$this->privCalculateStoredFilename($v_descr, $p_options);
|
||||
|
||||
|
||||
// ----- Add the descriptor in result list
|
||||
$v_result_list[sizeof($v_result_list)] = $v_descr;
|
||||
|
||||
|
||||
// ----- Look for folder
|
||||
if ($v_descr['type'] == 'folder') {
|
||||
// ----- List of items in folder
|
||||
@@ -2064,10 +2064,10 @@
|
||||
if (($v_item_handler == '.') || ($v_item_handler == '..')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// ----- Compose the full filename
|
||||
$v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler;
|
||||
|
||||
|
||||
// ----- Look for different stored filename
|
||||
// Because the name of the folder was changed, the name of the
|
||||
// files/sub-folders also change
|
||||
@@ -2080,34 +2080,34 @@
|
||||
$v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$v_dirlist_nb++;
|
||||
}
|
||||
|
||||
|
||||
@closedir($v_folder_handler);
|
||||
}
|
||||
else {
|
||||
// TBC : unable to open folder in read mode
|
||||
}
|
||||
|
||||
|
||||
// ----- Expand each element of the list
|
||||
if ($v_dirlist_nb != 0) {
|
||||
// ----- Expand
|
||||
if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) {
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
|
||||
// ----- Concat the resulting list
|
||||
$v_result_list = array_merge($v_result_list, $v_dirlist_descr);
|
||||
}
|
||||
else {
|
||||
}
|
||||
|
||||
|
||||
// ----- Free local array
|
||||
unset($v_dirlist_descr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Get the result list
|
||||
$p_filedescr_list = $v_result_list;
|
||||
|
||||
@@ -2126,7 +2126,7 @@
|
||||
{
|
||||
$v_result=1;
|
||||
$v_list_detail = array();
|
||||
|
||||
|
||||
// ----- Magic quotes trick
|
||||
$this->privDisableMagicQuotes();
|
||||
|
||||
@@ -2456,7 +2456,7 @@
|
||||
// Function : privAddFileList()
|
||||
// Description :
|
||||
// Parameters :
|
||||
// $p_filedescr_list : An array containing the file description
|
||||
// $p_filedescr_list : An array containing the file description
|
||||
// or directory names to add in the zip
|
||||
// $p_result_list : list of added files with their properties (specially the status field)
|
||||
// Return Values :
|
||||
@@ -2474,7 +2474,7 @@
|
||||
// ----- Format the filename
|
||||
$p_filedescr_list[$j]['filename']
|
||||
= PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false);
|
||||
|
||||
|
||||
|
||||
// ----- Skip empty file names
|
||||
// TBC : Can this be possible ? not checked in DescrParseAtt ?
|
||||
@@ -2526,7 +2526,7 @@
|
||||
function privAddFile($p_filedescr, &$p_header, &$p_options)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
// ----- Working variable
|
||||
$p_filename = $p_filedescr['filename'];
|
||||
|
||||
@@ -2538,8 +2538,8 @@
|
||||
// ----- Return
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
|
||||
// ----- Look for a stored different filename
|
||||
|
||||
// ----- Look for a stored different filename
|
||||
/* TBC : Removed
|
||||
if (isset($p_filedescr['stored_filename'])) {
|
||||
$v_stored_filename = $p_filedescr['stored_filename'];
|
||||
@@ -2564,7 +2564,7 @@
|
||||
$p_header['offset'] = 0;
|
||||
$p_header['filename'] = $p_filename;
|
||||
// TBC : Removed $p_header['stored_filename'] = $v_stored_filename;
|
||||
$p_header['stored_filename'] = $p_filedescr['stored_filename'];
|
||||
$p_header['stored_filename'] = strpos(helper::getOS(), 'Windows') !== false ? mb_convert_encoding($p_filedescr['stored_filename'],'GB2312','UTF-8') : $p_filedescr['stored_filename'];
|
||||
$p_header['extra'] = '';
|
||||
$p_header['status'] = 'ok';
|
||||
$p_header['index'] = -1;
|
||||
@@ -2574,20 +2574,20 @@
|
||||
$p_header['external'] = 0x00000000;
|
||||
$p_header['size'] = filesize($p_filename);
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for regular folder
|
||||
else if ($p_filedescr['type']=='folder') {
|
||||
$p_header['external'] = 0x00000010;
|
||||
$p_header['mtime'] = filemtime($p_filename);
|
||||
$p_header['size'] = filesize($p_filename);
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for virtual file
|
||||
else if ($p_filedescr['type'] == 'virtual_file') {
|
||||
$p_header['external'] = 0x00000000;
|
||||
$p_header['size'] = strlen($p_filedescr['content']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ----- Look for filetime
|
||||
if (isset($p_filedescr['mtime'])) {
|
||||
@@ -2639,7 +2639,7 @@
|
||||
if ($p_header['stored_filename'] == "") {
|
||||
$p_header['status'] = "filtered";
|
||||
}
|
||||
|
||||
|
||||
// ----- Check the path length
|
||||
if (strlen($p_header['stored_filename']) > 0xFF) {
|
||||
$p_header['status'] = 'filename_too_long';
|
||||
@@ -2651,7 +2651,7 @@
|
||||
// ----- Look for a file
|
||||
if ($p_filedescr['type'] == 'file') {
|
||||
// ----- Look for using temporary file to zip
|
||||
if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
|
||||
if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
|
||||
&& (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
|
||||
|| (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
|
||||
&& ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) {
|
||||
@@ -2660,7 +2660,7 @@
|
||||
return $v_result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Use "in memory" zip algo
|
||||
else {
|
||||
|
||||
@@ -2678,14 +2678,14 @@
|
||||
|
||||
// ----- Calculate the CRC
|
||||
$p_header['crc'] = @crc32($v_content);
|
||||
|
||||
|
||||
// ----- Look for no compression
|
||||
if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
|
||||
// ----- Set header parameters
|
||||
$p_header['compressed_size'] = $p_header['size'];
|
||||
$p_header['compression'] = 0;
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for normal compression
|
||||
else {
|
||||
// ----- Compress the content
|
||||
@@ -2695,7 +2695,7 @@
|
||||
$p_header['compressed_size'] = strlen($v_content);
|
||||
$p_header['compression'] = 8;
|
||||
}
|
||||
|
||||
|
||||
// ----- Call the header generation
|
||||
if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
|
||||
@fclose($v_file);
|
||||
@@ -2711,19 +2711,19 @@
|
||||
|
||||
// ----- Look for a virtual file (a file from string)
|
||||
else if ($p_filedescr['type'] == 'virtual_file') {
|
||||
|
||||
|
||||
$v_content = $p_filedescr['content'];
|
||||
|
||||
// ----- Calculate the CRC
|
||||
$p_header['crc'] = @crc32($v_content);
|
||||
|
||||
|
||||
// ----- Look for no compression
|
||||
if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) {
|
||||
// ----- Set header parameters
|
||||
$p_header['compressed_size'] = $p_header['size'];
|
||||
$p_header['compression'] = 0;
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for normal compression
|
||||
else {
|
||||
// ----- Compress the content
|
||||
@@ -2733,7 +2733,7 @@
|
||||
$p_header['compressed_size'] = strlen($v_content);
|
||||
$p_header['compression'] = 8;
|
||||
}
|
||||
|
||||
|
||||
// ----- Call the header generation
|
||||
if (($v_result = $this->privWriteFileHeader($p_header)) != 1) {
|
||||
@fclose($v_file);
|
||||
@@ -2799,7 +2799,7 @@
|
||||
function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options)
|
||||
{
|
||||
$v_result=PCLZIP_ERR_NO_ERROR;
|
||||
|
||||
|
||||
// ----- Working variable
|
||||
$p_filename = $p_filedescr['filename'];
|
||||
|
||||
@@ -2894,7 +2894,7 @@
|
||||
|
||||
// ----- Unlink the temporary file
|
||||
@unlink($v_gzip_temp_name);
|
||||
|
||||
|
||||
// ----- Return
|
||||
return $v_result;
|
||||
}
|
||||
@@ -2911,7 +2911,7 @@
|
||||
function privCalculateStoredFilename(&$p_filedescr, &$p_options)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
// ----- Working variables
|
||||
$p_filename = $p_filedescr['filename'];
|
||||
if (isset($p_options[PCLZIP_OPT_ADD_PATH])) {
|
||||
@@ -2939,7 +2939,7 @@
|
||||
// ----- Remove drive letter if any
|
||||
$v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']);
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for path and/or short name change
|
||||
else {
|
||||
|
||||
@@ -2969,7 +2969,7 @@
|
||||
|
||||
if ( (substr($p_filename, 0, 2) == "./")
|
||||
|| (substr($p_remove_dir, 0, 2) == "./")) {
|
||||
|
||||
|
||||
if ( (substr($p_filename, 0, 2) == "./")
|
||||
&& (substr($p_remove_dir, 0, 2) != "./")) {
|
||||
$p_remove_dir = "./".$p_remove_dir;
|
||||
@@ -2992,10 +2992,10 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Remove drive letter if any
|
||||
$v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename);
|
||||
|
||||
|
||||
// ----- Look for path to add
|
||||
if ($p_add_dir != "") {
|
||||
if (substr($p_add_dir, -1) == "/")
|
||||
@@ -3008,7 +3008,7 @@
|
||||
// ----- Filename (reduce the path of stored name)
|
||||
$v_stored_filename = PclZipUtilPathReduction($v_stored_filename);
|
||||
$p_filedescr['stored_filename'] = $v_stored_filename;
|
||||
|
||||
|
||||
// ----- Return
|
||||
return $v_result;
|
||||
}
|
||||
@@ -3159,7 +3159,7 @@
|
||||
{
|
||||
// ----- Magic quotes trick
|
||||
$this->privSwapBackMagicQuotes();
|
||||
|
||||
|
||||
// ----- Error log
|
||||
PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode');
|
||||
|
||||
@@ -3390,7 +3390,7 @@
|
||||
|
||||
// ----- Look for extract by ereg rule
|
||||
// ereg() is deprecated with PHP 5.3
|
||||
/*
|
||||
/*
|
||||
else if ( (isset($p_options[PCLZIP_OPT_BY_EREG]))
|
||||
&& ($p_options[PCLZIP_OPT_BY_EREG] != "")) {
|
||||
|
||||
@@ -3412,7 +3412,7 @@
|
||||
// ----- Look for extract by index rule
|
||||
else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX]))
|
||||
&& ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) {
|
||||
|
||||
|
||||
// ----- Look if the index is in the list
|
||||
for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) {
|
||||
|
||||
@@ -3445,7 +3445,7 @@
|
||||
&& ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) {
|
||||
|
||||
$this->privSwapBackMagicQuotes();
|
||||
|
||||
|
||||
PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION,
|
||||
"Filename '".$v_header['stored_filename']."' is "
|
||||
."compressed by an unsupported compression "
|
||||
@@ -3454,7 +3454,7 @@
|
||||
return PclZip::errorCode();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Check encrypted files
|
||||
if (($v_extract) && (($v_header['flag'] & 1) == 1)) {
|
||||
$v_header['status'] = 'unsupported_encryption';
|
||||
@@ -3486,7 +3486,7 @@
|
||||
|
||||
$v_extract = false;
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for real extraction
|
||||
if ($v_extract)
|
||||
{
|
||||
@@ -3535,7 +3535,7 @@
|
||||
|
||||
// ----- Next extracted file
|
||||
$v_nb_extracted++;
|
||||
|
||||
|
||||
// ----- Look for user callback abort
|
||||
if ($v_result1 == 2) {
|
||||
break;
|
||||
@@ -3671,12 +3671,12 @@
|
||||
if ($p_path != '') {
|
||||
$p_entry['filename'] = $p_path."/".$p_entry['filename'];
|
||||
}
|
||||
|
||||
|
||||
// ----- Check a base_dir_restriction
|
||||
if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) {
|
||||
$v_inclusion
|
||||
= PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION],
|
||||
$p_entry['filename']);
|
||||
$p_entry['filename']);
|
||||
if ($v_inclusion == 0) {
|
||||
|
||||
PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION,
|
||||
@@ -3704,7 +3704,7 @@
|
||||
$p_entry['status'] = "skipped";
|
||||
$v_result = 1;
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for abort result
|
||||
if ($v_result == 2) {
|
||||
// ----- This status is internal and will be changed in 'skipped'
|
||||
@@ -3731,7 +3731,7 @@
|
||||
|
||||
// ----- Change the file status
|
||||
$p_entry['status'] = "already_a_directory";
|
||||
|
||||
|
||||
// ----- Look for PCLZIP_OPT_STOP_ON_ERROR
|
||||
// For historical reason first PclZip implementation does not stop
|
||||
// when this kind of error occurs.
|
||||
@@ -3804,10 +3804,10 @@
|
||||
$v_dir_to_check = dirname($p_entry['filename']);
|
||||
|
||||
if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) {
|
||||
|
||||
|
||||
// ----- Change the file status
|
||||
$p_entry['status'] = "path_creation_fail";
|
||||
|
||||
|
||||
// ----- Return
|
||||
//return $v_result;
|
||||
$v_result = 1;
|
||||
@@ -3846,7 +3846,7 @@
|
||||
$v_binary_data = pack('a'.$v_read_size, $v_buffer);
|
||||
@fwrite($v_dest_file, $v_binary_data, $v_read_size);
|
||||
*/
|
||||
@fwrite($v_dest_file, $v_buffer, $v_read_size);
|
||||
@fwrite($v_dest_file, $v_buffer, $v_read_size);
|
||||
$v_size -= $v_read_size;
|
||||
}
|
||||
|
||||
@@ -3855,7 +3855,7 @@
|
||||
|
||||
// ----- Change the file mtime
|
||||
touch($p_entry['filename'], $p_entry['mtime']);
|
||||
|
||||
|
||||
|
||||
}
|
||||
else {
|
||||
@@ -3868,7 +3868,7 @@
|
||||
|
||||
|
||||
// ----- Look for using temporary file to unzip
|
||||
if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
|
||||
if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]))
|
||||
&& (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON])
|
||||
|| (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD])
|
||||
&& ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) {
|
||||
@@ -3877,42 +3877,42 @@
|
||||
return $v_result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for extract in memory
|
||||
else {
|
||||
|
||||
|
||||
|
||||
// ----- Read the compressed file in a buffer (one shot)
|
||||
$v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
|
||||
|
||||
|
||||
// ----- Decompress the file
|
||||
$v_file_content = @gzinflate($v_buffer);
|
||||
unset($v_buffer);
|
||||
if ($v_file_content === FALSE) {
|
||||
|
||||
|
||||
// ----- Change the file status
|
||||
// TBC
|
||||
$p_entry['status'] = "error";
|
||||
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
|
||||
// ----- Opening destination file
|
||||
if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) {
|
||||
|
||||
|
||||
// ----- Change the file status
|
||||
$p_entry['status'] = "write_error";
|
||||
|
||||
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
|
||||
// ----- Write the uncompressed data
|
||||
@fwrite($v_dest_file, $v_file_content, $p_entry['size']);
|
||||
unset($v_file_content);
|
||||
|
||||
|
||||
// ----- Closing the destination file
|
||||
@fclose($v_dest_file);
|
||||
|
||||
|
||||
}
|
||||
|
||||
// ----- Change the file mtime
|
||||
@@ -3933,7 +3933,7 @@
|
||||
if ($p_entry['status'] == "aborted") {
|
||||
$p_entry['status'] = "skipped";
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for post-extract callback
|
||||
elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
|
||||
|
||||
@@ -3967,7 +3967,7 @@
|
||||
function privExtractFileUsingTempFile(&$p_entry, &$p_options)
|
||||
{
|
||||
$v_result=1;
|
||||
|
||||
|
||||
// ----- Creates a temporary file
|
||||
$v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz';
|
||||
if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) {
|
||||
@@ -4028,7 +4028,7 @@
|
||||
|
||||
// ----- Delete the temporary file
|
||||
@unlink($v_gzip_temp_name);
|
||||
|
||||
|
||||
// ----- Return
|
||||
return $v_result;
|
||||
}
|
||||
@@ -4106,7 +4106,7 @@
|
||||
|
||||
// ----- Read the compressed file in a buffer (one shot)
|
||||
$v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']);
|
||||
|
||||
|
||||
// ----- Decompress the file
|
||||
$v_file_content = gzinflate($v_buffer);
|
||||
unset($v_buffer);
|
||||
@@ -4187,7 +4187,7 @@
|
||||
$p_entry['status'] = "skipped";
|
||||
$v_result = 1;
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for abort result
|
||||
if ($v_result == 2) {
|
||||
// ----- This status is internal and will be changed in 'skipped'
|
||||
@@ -4209,41 +4209,41 @@
|
||||
// ----- Look for not compressed file
|
||||
// if ($p_entry['compressed_size'] == $p_entry['size'])
|
||||
if ($p_entry['compression'] == 0) {
|
||||
|
||||
|
||||
// ----- Reading the file
|
||||
$p_string = @fread($this->zip_fd, $p_entry['compressed_size']);
|
||||
}
|
||||
else {
|
||||
|
||||
|
||||
// ----- Reading the file
|
||||
$v_data = @fread($this->zip_fd, $p_entry['compressed_size']);
|
||||
|
||||
|
||||
// ----- Decompress the file
|
||||
if (($p_string = @gzinflate($v_data)) === FALSE) {
|
||||
// TBC
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Trace
|
||||
}
|
||||
else {
|
||||
// TBC : error : can not extract a folder in a string
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// ----- Change abort status
|
||||
if ($p_entry['status'] == "aborted") {
|
||||
$p_entry['status'] = "skipped";
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for post-extract callback
|
||||
elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) {
|
||||
|
||||
// ----- Generate a local information
|
||||
$v_local_header = array();
|
||||
$this->privConvertHeader2FileInfo($p_entry, $v_local_header);
|
||||
|
||||
|
||||
// ----- Swap the content to header
|
||||
$v_local_header['content'] = $p_string;
|
||||
$p_string = '';
|
||||
@@ -4504,7 +4504,7 @@
|
||||
}
|
||||
if ($p_local_header['filename_len'] != $p_central_header['filename_len']) {
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for flag bit 3
|
||||
if (($p_local_header['flag'] & 8) == 8) {
|
||||
$p_local_header['size'] = $p_central_header['size'];
|
||||
@@ -4590,9 +4590,9 @@
|
||||
|
||||
// ----- Add the byte
|
||||
//$v_bytes = ($v_bytes << 8) | Ord($v_byte);
|
||||
// Note we mask the old value down such that once shifted we can never end up with more than a 32bit number
|
||||
// Otherwise on systems where we have 64bit integers the check below for the magic number will fail.
|
||||
$v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);
|
||||
// Note we mask the old value down such that once shifted we can never end up with more than a 32bit number
|
||||
// Otherwise on systems where we have 64bit integers the check below for the magic number will fail.
|
||||
$v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte);
|
||||
|
||||
// ----- Compare the bytes
|
||||
if ($v_bytes == 0x504b0506)
|
||||
@@ -4870,7 +4870,7 @@
|
||||
// ----- Return
|
||||
return $v_result;
|
||||
}
|
||||
|
||||
|
||||
// ----- Check that local file header is same as central file header
|
||||
if ($this->privCheckFileHeaders($v_local_header,
|
||||
$v_header_list[$i]) != 1) {
|
||||
@@ -4954,11 +4954,11 @@
|
||||
// TBC : I should test the result ...
|
||||
//@rename($v_zip_temp_name, $this->zipname);
|
||||
PclZipUtilRename($v_zip_temp_name, $this->zipname);
|
||||
|
||||
|
||||
// ----- Destroy the temporary archive
|
||||
unset($v_temp_zip);
|
||||
}
|
||||
|
||||
|
||||
// ----- Remove every files : reset the file
|
||||
else if ($v_central_dir['entries'] != 0) {
|
||||
$this->privCloseFd();
|
||||
@@ -5445,7 +5445,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ----- Look for skip
|
||||
if ($v_skip > 0) {
|
||||
while ($v_skip > 0) {
|
||||
@@ -5478,7 +5478,7 @@
|
||||
function PclZipUtilPathInclusion($p_dir, $p_path)
|
||||
{
|
||||
$v_result = 1;
|
||||
|
||||
|
||||
// ----- Look for path beginning by ./
|
||||
if ( ($p_dir == '.')
|
||||
|| ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) {
|
||||
@@ -5646,7 +5646,7 @@
|
||||
// --------------------------------------------------------------------------------
|
||||
function PclZipUtilOptionText($p_option)
|
||||
{
|
||||
|
||||
|
||||
$v_list = get_defined_constants();
|
||||
for (reset($v_list); $v_key = key($v_list); next($v_list)) {
|
||||
$v_prefix = substr($v_key, 0, 10);
|
||||
@@ -5657,7 +5657,7 @@
|
||||
return $v_key;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$v_result = 'Unknown';
|
||||
|
||||
return $v_result;
|
||||
|
||||
@@ -3,6 +3,7 @@ class Gitea
|
||||
{
|
||||
public $client;
|
||||
public $root;
|
||||
public $repo;
|
||||
|
||||
/**
|
||||
* Construct
|
||||
@@ -43,6 +44,7 @@ class Gitea
|
||||
if(isset($branches[$branch])) $branch = "origin/$branch";
|
||||
}
|
||||
$this->branch = $branch;
|
||||
$this->repo = $repo;
|
||||
|
||||
chdir($this->root);
|
||||
exec("{$this->client} config core.quotepath false");
|
||||
@@ -699,4 +701,20 @@ class Gitea
|
||||
|
||||
return $parsedLogs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get download url.
|
||||
*
|
||||
* @param string $branch
|
||||
* @param string $savePath
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDownloadUrl($branch = 'master', $savePath = '', $ext = 'zip')
|
||||
{
|
||||
global $app;
|
||||
$api = $app->control->loadModel('gitea')->getApiRoot($this->repo->serviceHost);
|
||||
return sprintf($api, "/repos/{$this->repo->serviceProject}/archive/{$branch}.zip");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -840,11 +840,12 @@ class gitlab
|
||||
* Get download url.
|
||||
*
|
||||
* @param string $branch
|
||||
* @param string $savePath
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDownloadUrl($branch = 'master', $ext = 'zip')
|
||||
public function getDownloadUrl($branch = 'master', $savePath = '', $ext = 'zip')
|
||||
{
|
||||
$params = (array) $params;
|
||||
$params['private_token'] = $this->token;
|
||||
|
||||
@@ -3,6 +3,7 @@ class GitRepo
|
||||
{
|
||||
public $client;
|
||||
public $root;
|
||||
public $repo;
|
||||
|
||||
/**
|
||||
* Construct
|
||||
@@ -30,6 +31,7 @@ class GitRepo
|
||||
if(isset($branches[$branch])) $branch = "origin/$branch";
|
||||
}
|
||||
$this->branch = $branch;
|
||||
$this->repo = $repo;
|
||||
|
||||
chdir($this->root);
|
||||
exec("{$this->client} config core.quotepath false");
|
||||
@@ -683,4 +685,31 @@ class GitRepo
|
||||
|
||||
return $parsedLogs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get download url.
|
||||
*
|
||||
* @param string $branch
|
||||
* @param string $savePath
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDownloadUrl($branch = 'master', $savePath = '', $ext = 'zip')
|
||||
{
|
||||
global $app, $config;
|
||||
$gitDir = scandir($this->root);
|
||||
$files = '';
|
||||
foreach($gitDir as $path)
|
||||
{
|
||||
if(!in_array($path, array('.', '..', '.git'))) $files .= $this->root . DS . "$path,";
|
||||
}
|
||||
|
||||
$app->loadClass('pclzip', true);
|
||||
$fileName = $savePath . DS . "{$this->repo->name}_$branch.zip";
|
||||
$zip = new pclzip($fileName);
|
||||
$zip->create($files, PCLZIP_OPT_REMOVE_PATH, $this->root);
|
||||
|
||||
return $config->webRoot . $app->getAppName() . 'data' . DS . 'repo' . DS . "{$this->repo->name}_$branch.zip";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ class Gogs
|
||||
{
|
||||
public $client;
|
||||
public $root;
|
||||
public $repo;
|
||||
|
||||
/**
|
||||
* Construct
|
||||
@@ -43,6 +44,7 @@ class Gogs
|
||||
if(isset($branches[$branch])) $branch = "origin/$branch";
|
||||
}
|
||||
$this->branch = $branch;
|
||||
$this->repo = $repo;
|
||||
|
||||
chdir($this->root);
|
||||
exec("{$this->client} config core.quotepath false");
|
||||
@@ -617,6 +619,27 @@ class Gogs
|
||||
return $logs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get commits by MR branches.
|
||||
*
|
||||
* @param string $sourceBranch
|
||||
* @param string $targetBranch
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getMRCommits($sourceBranch, $targetBranch)
|
||||
{
|
||||
execCmd(escapeCmd("$this->client checkout $sourceBranch"));
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
execCmd(escapeCmd("$this->client checkout $targetBranch"));
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
|
||||
$commits = execCmd(escapeCmd("$this->client log origin/$sourceBranch ^origin/$targetBranch"), 'array');
|
||||
$commits = $this->parseLog($commits);
|
||||
foreach($commits as $commit) $commit->id = $commit->revision;
|
||||
return $commits;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get clone url.
|
||||
*
|
||||
@@ -699,4 +722,34 @@ class Gogs
|
||||
|
||||
return $parsedLogs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get download url.
|
||||
*
|
||||
* @param string $branch
|
||||
* @param string $savePath
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDownloadUrl($branch = 'master', $savePath = '', $ext = 'zip')
|
||||
{
|
||||
execCmd(escapeCmd("$this->client checkout $branch"));
|
||||
execCmd(escapeCmd("$this->client pull"));
|
||||
|
||||
global $app, $config;
|
||||
$gitDir = scandir($this->root);
|
||||
$files = '';
|
||||
foreach($gitDir as $path)
|
||||
{
|
||||
if(!in_array($path, array('.', '..', '.git'))) $files .= $this->root . DS . "$path,";
|
||||
}
|
||||
|
||||
$app->loadClass('pclzip', true);
|
||||
$fileName = $savePath . DS . "{$this->repo->name}_$branch.zip";
|
||||
$zip = new pclzip($fileName);
|
||||
$zip->create($files, PCLZIP_OPT_REMOVE_PATH, $this->root);
|
||||
|
||||
return $config->webRoot . $app->getAppName() . 'data' . DS . 'repo' . DS . "{$this->repo->name}_$branch.zip";
|
||||
}
|
||||
}
|
||||
|
||||
+16
-2
@@ -220,6 +220,19 @@ class scm
|
||||
return $this->engine->getCommits($version, $count, $branch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get commits by MR branches.
|
||||
*
|
||||
* @param string $sourceBranch
|
||||
* @param string $targetBranch
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getMRCommits($sourceBranch, $targetBranch)
|
||||
{
|
||||
return $this->engine->getMRCommits($sourceBranch, $targetBranch);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get clone url.
|
||||
*
|
||||
@@ -249,13 +262,14 @@ class scm
|
||||
* Get download url.
|
||||
*
|
||||
* @param string $branch
|
||||
* @param string $savePath
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDownloadUrl($branch = '', $ext = 'zip')
|
||||
public function getDownloadUrl($branch = '', $savePath = '', $ext = 'zip')
|
||||
{
|
||||
return $this->engine->getDownloadUrl($branch, $ext);
|
||||
return $this->engine->getDownloadUrl($branch, $savePath, $ext);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ class Subversion
|
||||
public $remote;
|
||||
public $encoding;
|
||||
public $svnVersion;
|
||||
public $repo;
|
||||
|
||||
/**
|
||||
* Construct
|
||||
@@ -29,6 +30,7 @@ class Subversion
|
||||
$this->account = $account;
|
||||
$this->password = $password;
|
||||
$this->encoding = $encoding;
|
||||
$this->repo = $repo;
|
||||
$this->ssh = (stripos($this->root, 'svn') === 0 or stripos($this->root, 'https') === 0) ? true : false;
|
||||
$this->remote = !(stripos($this->root, 'file') === 0);
|
||||
$this->client = $this->remote ? $client . " --username @account@ --password @password@" : $client;
|
||||
@@ -682,4 +684,32 @@ class Subversion
|
||||
|
||||
return end($versionOutput);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get download url.
|
||||
*
|
||||
* @param string $branch
|
||||
* @param string $savePath
|
||||
* @param string $ext
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDownloadUrl($branch = '', $savePath = '', $ext = 'zip')
|
||||
{
|
||||
global $app, $config;
|
||||
|
||||
/* Get repo name. */
|
||||
$pathList = explode('/', trim($this->root, '/'));
|
||||
$repoDir = $savePath . DS . end($pathList);
|
||||
execCmd($this->replaceAuth(escapeCmd("$this->client export $this->root $repoDir")));
|
||||
|
||||
$fileName = $savePath . DS . "{$this->repo->name}.zip";
|
||||
$app->loadClass('pclzip', true);
|
||||
$zip = new pclzip($fileName);
|
||||
$zip->create($repoDir, PCLZIP_OPT_REMOVE_PATH, $repoDir);
|
||||
|
||||
$zfile = $app->loadClass('zfile');
|
||||
$zfile->removeDir($repoDir);
|
||||
return $config->webRoot . $app->getAppName() . 'data' . DS . 'repo' . DS . $this->repo->name . '.zip';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
class sqlparser
|
||||
{
|
||||
public function __construct($query)
|
||||
{
|
||||
$this->parser = new PhpMyAdmin\SqlParser\Parser($query);
|
||||
$this->statements = $this->parser->statements;
|
||||
}
|
||||
}
|
||||
Vendored
+7
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
// autoload.php @generated by Composer
|
||||
|
||||
require_once __DIR__ . '/composer/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInitea8a35d9469bbaa4fe54772aaf0cb8ae::getLoader();
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../phpmyadmin/sql-parser/bin/highlight-query)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/phpmyadmin/sql-parser/bin/highlight-query');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/phpmyadmin/sql-parser/bin/highlight-query';
|
||||
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/highlight-query
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
Vendored
+117
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../phpmyadmin/sql-parser/bin/lint-query)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/phpmyadmin/sql-parser/bin/lint-query');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/phpmyadmin/sql-parser/bin/lint-query';
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/lint-query
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../phpmyadmin/sql-parser/bin/tokenize-query)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/phpmyadmin/sql-parser/bin/tokenize-query');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/phpmyadmin/sql-parser/bin/tokenize-query';
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/tokenize-query
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
+572
@@ -0,0 +1,572 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
/**
|
||||
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||
*
|
||||
* $loader = new \Composer\Autoload\ClassLoader();
|
||||
*
|
||||
* // register classes with namespaces
|
||||
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||
* $loader->add('Symfony', __DIR__.'/framework');
|
||||
*
|
||||
* // activate the autoloader
|
||||
* $loader->register();
|
||||
*
|
||||
* // to enable searching the include path (eg. for PEAR packages)
|
||||
* $loader->setUseIncludePath(true);
|
||||
*
|
||||
* In this example, if you try to use a class in the Symfony\Component
|
||||
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||
* the autoloader will first look for the class under the component/
|
||||
* directory, and it will then fallback to the framework/ directory if not
|
||||
* found before giving up.
|
||||
*
|
||||
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||
*
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||
* @see https://www.php-fig.org/psr/psr-0/
|
||||
* @see https://www.php-fig.org/psr/psr-4/
|
||||
*/
|
||||
class ClassLoader
|
||||
{
|
||||
/** @var ?string */
|
||||
private $vendorDir;
|
||||
|
||||
// PSR-4
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array<string, int>>
|
||||
*/
|
||||
private $prefixLengthsPsr4 = array();
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array<int, string>>
|
||||
*/
|
||||
private $prefixDirsPsr4 = array();
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, string>
|
||||
*/
|
||||
private $fallbackDirsPsr4 = array();
|
||||
|
||||
// PSR-0
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array<string, string[]>>
|
||||
*/
|
||||
private $prefixesPsr0 = array();
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, string>
|
||||
*/
|
||||
private $fallbackDirsPsr0 = array();
|
||||
|
||||
/** @var bool */
|
||||
private $useIncludePath = false;
|
||||
|
||||
/**
|
||||
* @var string[]
|
||||
* @psalm-var array<string, string>
|
||||
*/
|
||||
private $classMap = array();
|
||||
|
||||
/** @var bool */
|
||||
private $classMapAuthoritative = false;
|
||||
|
||||
/**
|
||||
* @var bool[]
|
||||
* @psalm-var array<string, bool>
|
||||
*/
|
||||
private $missingClasses = array();
|
||||
|
||||
/** @var ?string */
|
||||
private $apcuPrefix;
|
||||
|
||||
/**
|
||||
* @var self[]
|
||||
*/
|
||||
private static $registeredLoaders = array();
|
||||
|
||||
/**
|
||||
* @param ?string $vendorDir
|
||||
*/
|
||||
public function __construct($vendorDir = null)
|
||||
{
|
||||
$this->vendorDir = $vendorDir;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getPrefixes()
|
||||
{
|
||||
if (!empty($this->prefixesPsr0)) {
|
||||
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
* @psalm-return array<string, array<int, string>>
|
||||
*/
|
||||
public function getPrefixesPsr4()
|
||||
{
|
||||
return $this->prefixDirsPsr4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
* @psalm-return array<string, string>
|
||||
*/
|
||||
public function getFallbackDirs()
|
||||
{
|
||||
return $this->fallbackDirsPsr0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
* @psalm-return array<string, string>
|
||||
*/
|
||||
public function getFallbackDirsPsr4()
|
||||
{
|
||||
return $this->fallbackDirsPsr4;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[] Array of classname => path
|
||||
* @psalm-return array<string, string>
|
||||
*/
|
||||
public function getClassMap()
|
||||
{
|
||||
return $this->classMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $classMap Class to filename map
|
||||
* @psalm-param array<string, string> $classMap
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addClassMap(array $classMap)
|
||||
{
|
||||
if ($this->classMap) {
|
||||
$this->classMap = array_merge($this->classMap, $classMap);
|
||||
} else {
|
||||
$this->classMap = $classMap;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix, either
|
||||
* appending or prepending to the ones previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param string[]|string $paths The PSR-0 root directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function add($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr0
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr0 = array_merge(
|
||||
$this->fallbackDirsPsr0,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$first = $prefix[0];
|
||||
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
|
||||
|
||||
return;
|
||||
}
|
||||
if ($prepend) {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixesPsr0[$first][$prefix]
|
||||
);
|
||||
} else {
|
||||
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||
$this->prefixesPsr0[$first][$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace, either
|
||||
* appending or prepending to the ones previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param string[]|string $paths The PSR-4 base directories
|
||||
* @param bool $prepend Whether to prepend the directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function addPsr4($prefix, $paths, $prepend = false)
|
||||
{
|
||||
if (!$prefix) {
|
||||
// Register directories for the root namespace.
|
||||
if ($prepend) {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
(array) $paths,
|
||||
$this->fallbackDirsPsr4
|
||||
);
|
||||
} else {
|
||||
$this->fallbackDirsPsr4 = array_merge(
|
||||
$this->fallbackDirsPsr4,
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||
// Register directories for a new namespace.
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
} elseif ($prepend) {
|
||||
// Prepend directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
(array) $paths,
|
||||
$this->prefixDirsPsr4[$prefix]
|
||||
);
|
||||
} else {
|
||||
// Append directories for an already registered namespace.
|
||||
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||
$this->prefixDirsPsr4[$prefix],
|
||||
(array) $paths
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-0 directories for a given prefix,
|
||||
* replacing any others previously set for this prefix.
|
||||
*
|
||||
* @param string $prefix The prefix
|
||||
* @param string[]|string $paths The PSR-0 base directories
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function set($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr0 = (array) $paths;
|
||||
} else {
|
||||
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a set of PSR-4 directories for a given namespace,
|
||||
* replacing any others previously set for this namespace.
|
||||
*
|
||||
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||
* @param string[]|string $paths The PSR-4 base directories
|
||||
*
|
||||
* @throws \InvalidArgumentException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setPsr4($prefix, $paths)
|
||||
{
|
||||
if (!$prefix) {
|
||||
$this->fallbackDirsPsr4 = (array) $paths;
|
||||
} else {
|
||||
$length = strlen($prefix);
|
||||
if ('\\' !== $prefix[$length - 1]) {
|
||||
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||
}
|
||||
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns on searching the include path for class files.
|
||||
*
|
||||
* @param bool $useIncludePath
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setUseIncludePath($useIncludePath)
|
||||
{
|
||||
$this->useIncludePath = $useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can be used to check if the autoloader uses the include path to check
|
||||
* for classes.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function getUseIncludePath()
|
||||
{
|
||||
return $this->useIncludePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turns off searching the prefix and fallback directories for classes
|
||||
* that have not been registered with the class map.
|
||||
*
|
||||
* @param bool $classMapAuthoritative
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||
{
|
||||
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should class lookup fail if not found in the current class map?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isClassMapAuthoritative()
|
||||
{
|
||||
return $this->classMapAuthoritative;
|
||||
}
|
||||
|
||||
/**
|
||||
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||
*
|
||||
* @param string|null $apcuPrefix
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setApcuPrefix($apcuPrefix)
|
||||
{
|
||||
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getApcuPrefix()
|
||||
{
|
||||
return $this->apcuPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers this instance as an autoloader.
|
||||
*
|
||||
* @param bool $prepend Whether to prepend the autoloader or not
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function register($prepend = false)
|
||||
{
|
||||
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||
|
||||
if (null === $this->vendorDir) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($prepend) {
|
||||
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
|
||||
} else {
|
||||
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||
self::$registeredLoaders[$this->vendorDir] = $this;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregisters this instance as an autoloader.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function unregister()
|
||||
{
|
||||
spl_autoload_unregister(array($this, 'loadClass'));
|
||||
|
||||
if (null !== $this->vendorDir) {
|
||||
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given class or interface.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
* @return true|null True if loaded, null otherwise
|
||||
*/
|
||||
public function loadClass($class)
|
||||
{
|
||||
if ($file = $this->findFile($class)) {
|
||||
includeFile($file);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the path to the file where the class is defined.
|
||||
*
|
||||
* @param string $class The name of the class
|
||||
*
|
||||
* @return string|false The path if found, false otherwise
|
||||
*/
|
||||
public function findFile($class)
|
||||
{
|
||||
// class map lookup
|
||||
if (isset($this->classMap[$class])) {
|
||||
return $this->classMap[$class];
|
||||
}
|
||||
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||
return false;
|
||||
}
|
||||
if (null !== $this->apcuPrefix) {
|
||||
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||
if ($hit) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
$file = $this->findFileWithExtension($class, '.php');
|
||||
|
||||
// Search for Hack files if we are running on HHVM
|
||||
if (false === $file && defined('HHVM_VERSION')) {
|
||||
$file = $this->findFileWithExtension($class, '.hh');
|
||||
}
|
||||
|
||||
if (null !== $this->apcuPrefix) {
|
||||
apcu_add($this->apcuPrefix.$class, $file);
|
||||
}
|
||||
|
||||
if (false === $file) {
|
||||
// Remember that this class does not exist.
|
||||
$this->missingClasses[$class] = true;
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the currently registered loaders indexed by their corresponding vendor directories.
|
||||
*
|
||||
* @return self[]
|
||||
*/
|
||||
public static function getRegisteredLoaders()
|
||||
{
|
||||
return self::$registeredLoaders;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $class
|
||||
* @param string $ext
|
||||
* @return string|false
|
||||
*/
|
||||
private function findFileWithExtension($class, $ext)
|
||||
{
|
||||
// PSR-4 lookup
|
||||
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||
|
||||
$first = $class[0];
|
||||
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||
$subPath = $class;
|
||||
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||
$subPath = substr($subPath, 0, $lastPos);
|
||||
$search = $subPath . '\\';
|
||||
if (isset($this->prefixDirsPsr4[$search])) {
|
||||
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||
if (file_exists($file = $dir . $pathEnd)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-4 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 lookup
|
||||
if (false !== $pos = strrpos($class, '\\')) {
|
||||
// namespaced class name
|
||||
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||
} else {
|
||||
// PEAR-like class name
|
||||
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||
}
|
||||
|
||||
if (isset($this->prefixesPsr0[$first])) {
|
||||
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||
if (0 === strpos($class, $prefix)) {
|
||||
foreach ($dirs as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 fallback dirs
|
||||
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
}
|
||||
|
||||
// PSR-0 include paths.
|
||||
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||
return $file;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Scope isolated include.
|
||||
*
|
||||
* Prevents access to $this/self from included files.
|
||||
*
|
||||
* @param string $file
|
||||
* @return void
|
||||
* @private
|
||||
*/
|
||||
function includeFile($file)
|
||||
{
|
||||
include $file;
|
||||
}
|
||||
+350
@@ -0,0 +1,350 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Composer.
|
||||
*
|
||||
* (c) Nils Adermann <naderman@naderman.de>
|
||||
* Jordi Boggiano <j.boggiano@seld.be>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
use Composer\Autoload\ClassLoader;
|
||||
use Composer\Semver\VersionParser;
|
||||
|
||||
/**
|
||||
* This class is copied in every Composer installed project and available to all
|
||||
*
|
||||
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
||||
*
|
||||
* To require its presence, you can require `composer-runtime-api ^2.0`
|
||||
*/
|
||||
class InstalledVersions
|
||||
{
|
||||
/**
|
||||
* @var mixed[]|null
|
||||
* @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
|
||||
*/
|
||||
private static $installed;
|
||||
|
||||
/**
|
||||
* @var bool|null
|
||||
*/
|
||||
private static $canGetVendors;
|
||||
|
||||
/**
|
||||
* @var array[]
|
||||
* @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
||||
*/
|
||||
private static $installedByVendor = array();
|
||||
|
||||
/**
|
||||
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
||||
*
|
||||
* @return string[]
|
||||
* @psalm-return list<string>
|
||||
*/
|
||||
public static function getInstalledPackages()
|
||||
{
|
||||
$packages = array();
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
$packages[] = array_keys($installed['versions']);
|
||||
}
|
||||
|
||||
if (1 === \count($packages)) {
|
||||
return $packages[0];
|
||||
}
|
||||
|
||||
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all package names with a specific type e.g. 'library'
|
||||
*
|
||||
* @param string $type
|
||||
* @return string[]
|
||||
* @psalm-return list<string>
|
||||
*/
|
||||
public static function getInstalledPackagesByType($type)
|
||||
{
|
||||
$packagesByType = array();
|
||||
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
foreach ($installed['versions'] as $name => $package) {
|
||||
if (isset($package['type']) && $package['type'] === $type) {
|
||||
$packagesByType[] = $name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $packagesByType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given package is installed
|
||||
*
|
||||
* This also returns true if the package name is provided or replaced by another package
|
||||
*
|
||||
* @param string $packageName
|
||||
* @param bool $includeDevRequirements
|
||||
* @return bool
|
||||
*/
|
||||
public static function isInstalled($packageName, $includeDevRequirements = true)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (isset($installed['versions'][$packageName])) {
|
||||
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given package satisfies a version constraint
|
||||
*
|
||||
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
||||
*
|
||||
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
||||
*
|
||||
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
||||
* @param string $packageName
|
||||
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
||||
* @return bool
|
||||
*/
|
||||
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||
{
|
||||
$constraint = $parser->parseConstraints($constraint);
|
||||
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||
|
||||
return $provided->matches($constraint);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a version constraint representing all the range(s) which are installed for a given package
|
||||
*
|
||||
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
||||
* whether a given version of a package is installed, and not just whether it exists
|
||||
*
|
||||
* @param string $packageName
|
||||
* @return string Version constraint usable with composer/semver
|
||||
*/
|
||||
public static function getVersionRanges($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$ranges = array();
|
||||
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
||||
}
|
||||
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
||||
}
|
||||
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
||||
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
||||
}
|
||||
|
||||
return implode(' || ', $ranges);
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||
*/
|
||||
public static function getVersion($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['version'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||
*/
|
||||
public static function getPrettyVersion($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['pretty_version'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
||||
*/
|
||||
public static function getReference($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($installed['versions'][$packageName]['reference'])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $installed['versions'][$packageName]['reference'];
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $packageName
|
||||
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||
*/
|
||||
public static function getInstallPath($packageName)
|
||||
{
|
||||
foreach (self::getInstalled() as $installed) {
|
||||
if (!isset($installed['versions'][$packageName])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||
}
|
||||
|
||||
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
|
||||
*/
|
||||
public static function getRootPackage()
|
||||
{
|
||||
$installed = self::getInstalled();
|
||||
|
||||
return $installed[0]['root'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw installed.php data for custom implementations
|
||||
*
|
||||
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||
* @return array[]
|
||||
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
|
||||
*/
|
||||
public static function getRawData()
|
||||
{
|
||||
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||
|
||||
if (null === self::$installed) {
|
||||
// only require the installed.php file if this file is loaded from its dumped location,
|
||||
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||
self::$installed = include __DIR__ . '/installed.php';
|
||||
} else {
|
||||
self::$installed = array();
|
||||
}
|
||||
}
|
||||
|
||||
return self::$installed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||
*
|
||||
* @return array[]
|
||||
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
||||
*/
|
||||
public static function getAllRawData()
|
||||
{
|
||||
return self::getInstalled();
|
||||
}
|
||||
|
||||
/**
|
||||
* Lets you reload the static array from another file
|
||||
*
|
||||
* This is only useful for complex integrations in which a project needs to use
|
||||
* this class but then also needs to execute another project's autoloader in process,
|
||||
* and wants to ensure both projects have access to their version of installed.php.
|
||||
*
|
||||
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
||||
* the data it needs from this class, then call reload() with
|
||||
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
||||
* the project in which it runs can then also use this class safely, without
|
||||
* interference between PHPUnit's dependencies and the project's dependencies.
|
||||
*
|
||||
* @param array[] $data A vendor/composer/installed.php data set
|
||||
* @return void
|
||||
*
|
||||
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
|
||||
*/
|
||||
public static function reload($data)
|
||||
{
|
||||
self::$installed = $data;
|
||||
self::$installedByVendor = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array[]
|
||||
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
||||
*/
|
||||
private static function getInstalled()
|
||||
{
|
||||
if (null === self::$canGetVendors) {
|
||||
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
||||
}
|
||||
|
||||
$installed = array();
|
||||
|
||||
if (self::$canGetVendors) {
|
||||
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||
$installed[] = self::$installedByVendor[$vendorDir];
|
||||
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
|
||||
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
|
||||
self::$installed = $installed[count($installed) - 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (null === self::$installed) {
|
||||
// only require the installed.php file if this file is loaded from its dumped location,
|
||||
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||
self::$installed = require __DIR__ . '/installed.php';
|
||||
} else {
|
||||
self::$installed = array();
|
||||
}
|
||||
}
|
||||
$installed[] = self::$installed;
|
||||
|
||||
return $installed;
|
||||
}
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
|
||||
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is furnished
|
||||
to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
// autoload_classmap.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||
);
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
// autoload_files.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
);
|
||||
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
// autoload_namespaces.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
);
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
// autoload_psr4.php @generated by Composer
|
||||
|
||||
$vendorDir = dirname(dirname(__FILE__));
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
||||
return array(
|
||||
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
|
||||
'PhpMyAdmin\\SqlParser\\' => array($vendorDir . '/phpmyadmin/sql-parser/src'),
|
||||
);
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
|
||||
// autoload_real.php @generated by Composer
|
||||
|
||||
class ComposerAutoloaderInitea8a35d9469bbaa4fe54772aaf0cb8ae
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
public static function loadClassLoader($class)
|
||||
{
|
||||
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||
require __DIR__ . '/ClassLoader.php';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Composer\Autoload\ClassLoader
|
||||
*/
|
||||
public static function getLoader()
|
||||
{
|
||||
if (null !== self::$loader) {
|
||||
return self::$loader;
|
||||
}
|
||||
|
||||
require __DIR__ . '/platform_check.php';
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInitea8a35d9469bbaa4fe54772aaf0cb8ae', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInitea8a35d9469bbaa4fe54772aaf0cb8ae', 'loadClassLoader'));
|
||||
|
||||
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
||||
if ($useStaticLoader) {
|
||||
require __DIR__ . '/autoload_static.php';
|
||||
|
||||
call_user_func(\Composer\Autoload\ComposerStaticInitea8a35d9469bbaa4fe54772aaf0cb8ae::getInitializer($loader));
|
||||
} else {
|
||||
$map = require __DIR__ . '/autoload_namespaces.php';
|
||||
foreach ($map as $namespace => $path) {
|
||||
$loader->set($namespace, $path);
|
||||
}
|
||||
|
||||
$map = require __DIR__ . '/autoload_psr4.php';
|
||||
foreach ($map as $namespace => $path) {
|
||||
$loader->setPsr4($namespace, $path);
|
||||
}
|
||||
|
||||
$classMap = require __DIR__ . '/autoload_classmap.php';
|
||||
if ($classMap) {
|
||||
$loader->addClassMap($classMap);
|
||||
}
|
||||
}
|
||||
|
||||
$loader->register(true);
|
||||
|
||||
if ($useStaticLoader) {
|
||||
$includeFiles = Composer\Autoload\ComposerStaticInitea8a35d9469bbaa4fe54772aaf0cb8ae::$files;
|
||||
} else {
|
||||
$includeFiles = require __DIR__ . '/autoload_files.php';
|
||||
}
|
||||
foreach ($includeFiles as $fileIdentifier => $file) {
|
||||
composerRequireea8a35d9469bbaa4fe54772aaf0cb8ae($fileIdentifier, $file);
|
||||
}
|
||||
|
||||
return $loader;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $fileIdentifier
|
||||
* @param string $file
|
||||
* @return void
|
||||
*/
|
||||
function composerRequireea8a35d9469bbaa4fe54772aaf0cb8ae($fileIdentifier, $file)
|
||||
{
|
||||
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||
|
||||
require $file;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
// autoload_static.php @generated by Composer
|
||||
|
||||
namespace Composer\Autoload;
|
||||
|
||||
class ComposerStaticInitea8a35d9469bbaa4fe54772aaf0cb8ae
|
||||
{
|
||||
public static $files = array (
|
||||
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
|
||||
);
|
||||
|
||||
public static $prefixLengthsPsr4 = array (
|
||||
'S' =>
|
||||
array (
|
||||
'Symfony\\Polyfill\\Mbstring\\' => 26,
|
||||
),
|
||||
'P' =>
|
||||
array (
|
||||
'PhpMyAdmin\\SqlParser\\' => 21,
|
||||
),
|
||||
);
|
||||
|
||||
public static $prefixDirsPsr4 = array (
|
||||
'Symfony\\Polyfill\\Mbstring\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
|
||||
),
|
||||
'PhpMyAdmin\\SqlParser\\' =>
|
||||
array (
|
||||
0 => __DIR__ . '/..' . '/phpmyadmin/sql-parser/src',
|
||||
),
|
||||
);
|
||||
|
||||
public static $classMap = array (
|
||||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||
);
|
||||
|
||||
public static function getInitializer(ClassLoader $loader)
|
||||
{
|
||||
return \Closure::bind(function () use ($loader) {
|
||||
$loader->prefixLengthsPsr4 = ComposerStaticInitea8a35d9469bbaa4fe54772aaf0cb8ae::$prefixLengthsPsr4;
|
||||
$loader->prefixDirsPsr4 = ComposerStaticInitea8a35d9469bbaa4fe54772aaf0cb8ae::$prefixDirsPsr4;
|
||||
$loader->classMap = ComposerStaticInitea8a35d9469bbaa4fe54772aaf0cb8ae::$classMap;
|
||||
|
||||
}, null, ClassLoader::class);
|
||||
}
|
||||
}
|
||||
+168
@@ -0,0 +1,168 @@
|
||||
{
|
||||
"packages": [
|
||||
{
|
||||
"name": "phpmyadmin/sql-parser",
|
||||
"version": "5.5.0",
|
||||
"version_normalized": "5.5.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/phpmyadmin/sql-parser.git",
|
||||
"reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/8ab99cd0007d880f49f5aa1807033dbfa21b1cb5",
|
||||
"reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0",
|
||||
"symfony/polyfill-mbstring": "^1.3"
|
||||
},
|
||||
"conflict": {
|
||||
"phpmyadmin/motranslator": "<3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpmyadmin/coding-standard": "^3.0",
|
||||
"phpmyadmin/motranslator": "^4.0 || ^5.0",
|
||||
"phpstan/extension-installer": "^1.1",
|
||||
"phpstan/phpstan": "^1.2",
|
||||
"phpstan/phpstan-phpunit": "^1.0",
|
||||
"phpunit/php-code-coverage": "*",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||
"psalm/plugin-phpunit": "^0.16.1",
|
||||
"vimeo/psalm": "^4.11",
|
||||
"zumba/json-serializer": "^3.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mbstring": "For best performance",
|
||||
"phpmyadmin/motranslator": "Translate messages to your favorite locale"
|
||||
},
|
||||
"time": "2021-12-09T04:31:52+00:00",
|
||||
"bin": [
|
||||
"bin/highlight-query",
|
||||
"bin/lint-query",
|
||||
"bin/tokenize-query"
|
||||
],
|
||||
"type": "library",
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PhpMyAdmin\\SqlParser\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"GPL-2.0-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "The phpMyAdmin Team",
|
||||
"email": "developers@phpmyadmin.net",
|
||||
"homepage": "https://www.phpmyadmin.net/team/"
|
||||
}
|
||||
],
|
||||
"description": "A validating SQL lexer and parser with a focus on MySQL dialect.",
|
||||
"homepage": "https://github.com/phpmyadmin/sql-parser",
|
||||
"keywords": [
|
||||
"analysis",
|
||||
"lexer",
|
||||
"parser",
|
||||
"sql"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/phpmyadmin/sql-parser/issues",
|
||||
"source": "https://github.com/phpmyadmin/sql-parser"
|
||||
},
|
||||
"install-path": "../phpmyadmin/sql-parser"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
"version": "v1.26.0",
|
||||
"version_normalized": "1.26.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
||||
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
|
||||
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"provide": {
|
||||
"ext-mbstring": "*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mbstring": "For best performance"
|
||||
},
|
||||
"time": "2022-05-24T11:49:31+00:00",
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-main": "1.26-dev"
|
||||
},
|
||||
"thanks": {
|
||||
"name": "symfony/polyfill",
|
||||
"url": "https://github.com/symfony/polyfill"
|
||||
}
|
||||
},
|
||||
"installation-source": "dist",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"bootstrap.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Symfony\\Polyfill\\Mbstring\\": ""
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Nicolas Grekas",
|
||||
"email": "p@tchwork.com"
|
||||
},
|
||||
{
|
||||
"name": "Symfony Community",
|
||||
"homepage": "https://symfony.com/contributors"
|
||||
}
|
||||
],
|
||||
"description": "Symfony polyfill for the Mbstring extension",
|
||||
"homepage": "https://symfony.com",
|
||||
"keywords": [
|
||||
"compatibility",
|
||||
"mbstring",
|
||||
"polyfill",
|
||||
"portable",
|
||||
"shim"
|
||||
],
|
||||
"support": {
|
||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
|
||||
},
|
||||
"funding": [
|
||||
{
|
||||
"url": "https://symfony.com/sponsor",
|
||||
"type": "custom"
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/fabpot",
|
||||
"type": "github"
|
||||
},
|
||||
{
|
||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||
"type": "tidelift"
|
||||
}
|
||||
],
|
||||
"install-path": "../symfony/polyfill-mbstring"
|
||||
}
|
||||
],
|
||||
"dev": true,
|
||||
"dev-package-names": []
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
<?php return array(
|
||||
'root' => array(
|
||||
'pretty_version' => '1.0.0+no-version-set',
|
||||
'version' => '1.0.0.0',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'reference' => NULL,
|
||||
'name' => '__root__',
|
||||
'dev' => true,
|
||||
),
|
||||
'versions' => array(
|
||||
'__root__' => array(
|
||||
'pretty_version' => '1.0.0+no-version-set',
|
||||
'version' => '1.0.0.0',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../../',
|
||||
'aliases' => array(),
|
||||
'reference' => NULL,
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'phpmyadmin/sql-parser' => array(
|
||||
'pretty_version' => '5.5.0',
|
||||
'version' => '5.5.0.0',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../phpmyadmin/sql-parser',
|
||||
'aliases' => array(),
|
||||
'reference' => '8ab99cd0007d880f49f5aa1807033dbfa21b1cb5',
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
'symfony/polyfill-mbstring' => array(
|
||||
'pretty_version' => 'v1.26.0',
|
||||
'version' => '1.26.0.0',
|
||||
'type' => 'library',
|
||||
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
|
||||
'aliases' => array(),
|
||||
'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
|
||||
'dev_requirement' => false,
|
||||
),
|
||||
),
|
||||
);
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
// platform_check.php @generated by Composer
|
||||
|
||||
$issues = array();
|
||||
|
||||
if (!(PHP_VERSION_ID >= 70100)) {
|
||||
$issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.';
|
||||
}
|
||||
|
||||
if ($issues) {
|
||||
if (!headers_sent()) {
|
||||
header('HTTP/1.1 500 Internal Server Error');
|
||||
}
|
||||
if (!ini_get('display_errors')) {
|
||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
|
||||
} elseif (!headers_sent()) {
|
||||
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
|
||||
}
|
||||
}
|
||||
trigger_error(
|
||||
'Composer detected issues in your platform: ' . implode(' ', $issues),
|
||||
E_USER_ERROR
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,489 @@
|
||||
# Change Log
|
||||
|
||||
## [5.5.0] - 2021-12-08
|
||||
|
||||
* Add WITH support (#165, #331)
|
||||
* Fixed BufferedQuery when it has an odd number of backslashes in the end (#340)
|
||||
* Fixed the issue that ignored the body tokens when creating views with union (#343)
|
||||
* Fixed parser errors on "ALTER TABLE" statements to add columns with SET type (#168)
|
||||
* Fixed PHP 8.1 fatal errors on classes that "implements ArrayAccess"
|
||||
* Add new contexts for MariaDB 10.4, 10.5, 10.6 (#328)
|
||||
* Fixed parser errors for "ALTER USER" with options (#342)
|
||||
* Fixed handling of the procedures and functions's options where part of the body (#339)
|
||||
* Fix PHP notice "Undefined index: name in src/Components/Key.php#206" for table keys using expressions (#347)
|
||||
* Added support for MySQL 8.0 table structure KEY expressions (#347)
|
||||
* Added support for KEY order (ASC/DESC) (#296)
|
||||
* Added missing KEY options for MySQL and MariaDB (#348)
|
||||
* Added support for ENFORCED and NOT ENFORCED on table create queries (#341)
|
||||
* Performance improvement to use less the "ord()" function (#352)
|
||||
* Added support for OVER() with an alias (AS) (#197)
|
||||
|
||||
## [5.4.2] - 2021-02-05
|
||||
|
||||
* Added check for quoted symbol to avoid parser error in case of keyword (#317)
|
||||
* Allow PHP 8
|
||||
|
||||
## [5.4.1] - 2020-10-15
|
||||
|
||||
* Fix array_key_exists warning when parsing a "DEFAULT FALSE" token (#299)
|
||||
|
||||
## [5.4.0] - 2020-10-08
|
||||
|
||||
* EXISTS is also a function. (#297)
|
||||
* Fix lexer to not allow numbers with letters (#300)
|
||||
* Add support for INVISIBLE keyword (#292)
|
||||
* Fix the "$" might be a character used in a name (#301)
|
||||
* Fix use stream_select instead of non-blocking STDIN (#309)
|
||||
* Add select validation to a create view statement (#310)
|
||||
|
||||
## [5.3.1] - 2020-03-20
|
||||
|
||||
* Revert some changes with the understanding of ANSI_QUOTES mode and identifiers
|
||||
* Suggest motranslator 5.0 in README
|
||||
|
||||
## [5.3.0] - 2020-03-20
|
||||
|
||||
* Stop instanciating an object to check its class name. (#290)
|
||||
* Replace sscanf by equivalent native PHP functions because sscanf can be disabled for security reasons. (#270)
|
||||
* Allow phpunit 9
|
||||
* Allow phpmyadmin/motranslator 5.0
|
||||
* Fix for php error when "INSERT INTO x SET a = 1" is "INSERT INTO x SET = 1" (#295)
|
||||
* Fixed lexer fails to detect "*" as a wildcard (#288)
|
||||
* Fixed ANSI_QUOTES support (#284)
|
||||
* Fixed parser mistakes with comments (#156)
|
||||
|
||||
## [5.2.0] - 2020-01-07
|
||||
|
||||
* Fix ALTER TABLE ... PRIMARY/UNIQUE KEY results in error (#267)
|
||||
* Prevent overwrite of offset in Limit clause by parenthesis (#275)
|
||||
* Allow SCHEMA to be used in CREATE Database statement (#231)
|
||||
* Add missing options in SET statement (#255)
|
||||
* Add support for DROP USER statement (#259)
|
||||
* Fix php error "undefined index" when replacing a non existing clause (#249)
|
||||
|
||||
## [5.1.0] - 2019-11-12
|
||||
|
||||
* Fix for PHP deprecations messages about implode for php 7.4+ (#258)
|
||||
* Parse CHECK keyword on table definition (#264)
|
||||
* Parse truncate statement (#221)
|
||||
* Fix wrong parsing of partitions (#265)
|
||||
|
||||
## [5.0.0] - 2019-05-09
|
||||
|
||||
* Drop support for PHP 5.3, PHP 5.4, PHP 5.5, PHP 5.6, PHP 7.0 and HHVM
|
||||
* Enable strict mode on PHP files
|
||||
* Fix redundant whitespaces in build() outputs (#228)
|
||||
* Fix incorrect error on DEFAULT keyword in ALTER operation (#229)
|
||||
* Fix incorrect outputs from Query::getClause (#233)
|
||||
* Add support for reading an SQL file from stdin
|
||||
* Fix for missing tokenize-query in Composer's vendor/bin/ directory
|
||||
* Fix for PHP warnings with an incomplete CASE expression (#241)
|
||||
* Fix for error message with multiple CALL statements (#223)
|
||||
* Recognize the question mark character as a parameter (#242)
|
||||
|
||||
## [4.7.3] - 2021-12-08
|
||||
|
||||
- Fixed BufferedQuery when it has an odd number of backslashes in the end (#340)
|
||||
- Fixed the issue that ignored the body tokens when creating views with union (#343)
|
||||
- Fixed parser errors on "ALTER TABLE" statements to add columns with SET type (#168)
|
||||
- Fixed parser errors for "ALTER USER" with options (#342)
|
||||
- Fixed handling of the procedures and functions's options where part of the body (#339)
|
||||
- Fix PHP notice "Undefined index: name in src/Components/Key.php#206" for table keys using functions (#347)
|
||||
- Fix MySQL 8.0 table structure KEY expression not recognized (#347)
|
||||
- Fix KEY order (ASC/DESC) not part of the KEY definition (#296)
|
||||
- Fix missing KEY options for MySQL and MariaDB (#348)
|
||||
- Fix validation error when using ENFORCED option (#341)
|
||||
|
||||
## [4.7.2] - 2021-02-05
|
||||
|
||||
- Added check for quoted symbol to avoid parser error in case of keyword (#317)
|
||||
- Adjust PHP version constraint to not support PHP 8.0 on the 4.7 series (5.x series supports it)
|
||||
|
||||
## [4.7.1] - 2020-10-15
|
||||
|
||||
* Fix array_key_exists warning when parsing a "DEFAULT FALSE" token (#299)
|
||||
|
||||
## [4.7.0] - 2020-10-08
|
||||
|
||||
* EXISTS is also a function. (#297)
|
||||
* Fix lexer to not allow numbers with letters (#300)
|
||||
* Add support for INVISIBLE keyword (#292)
|
||||
* Fix the "$" might be a character used in a name (#301)
|
||||
* Fix use stream_select instead of non-blocking STDIN (#309)
|
||||
* Add select validation to a create view statement (#310)
|
||||
|
||||
## [4.6.1] - 2020-03-20
|
||||
|
||||
* Revert some changes with the understanding of ANSI_QUOTES mode and identifiers
|
||||
* Suggest motranslator 4.0 in README
|
||||
|
||||
## [4.6.0] - 2020-03-20
|
||||
|
||||
* Stop instanciating an object to check its class name. (#290)
|
||||
* Replace sscanf by equivalent native PHP functions because sscanf can be disabled for security reasons. (#270)
|
||||
* Allow phpunit 7
|
||||
* Fix for php error when "INSERT INTO x SET a = 1" is "INSERT INTO x SET = 1" (#295)
|
||||
* Fixed lexer fails to detect "*" as a wildcard (#288)
|
||||
* Fixed ANSI_QUOTES support (#284)
|
||||
* Fixed parser mistakes with comments (#156)
|
||||
|
||||
## [4.5.0] - 2020-01-07
|
||||
|
||||
* Fix ALTER TABLE ... PRIMARY/UNIQUE KEY results in error (#267)
|
||||
* Prevent overwrite of offset in Limit clause by parenthesis (#275)
|
||||
* Allow SCHEMA to be used in CREATE Database statement (#231)
|
||||
* Add missing options in SET statement (#255)
|
||||
* Add support for DROP USER statement (#259)
|
||||
* Fix php error "undefined index" when replacing a non existing clause (#249)
|
||||
|
||||
## [4.4.0] - 2019-11-12
|
||||
|
||||
* Fix for PHP deprecations messages about implode for php 7.4+ (#258)
|
||||
* Parse CHECK keyword on table definition (#264)
|
||||
* Parse truncate statement (#221)
|
||||
* Fix wrong parsing of partitions (#265)
|
||||
|
||||
## [4.3.2] - 2019-06-03
|
||||
|
||||
Backport fixes from 5.0.0 to QA branch:
|
||||
|
||||
* Fix redundant whitespaces in build() outputs (#228)
|
||||
* Fix incorrect error on DEFAULT keyword in ALTER operation (#229)
|
||||
* Fix incorrect outputs from Query::getClause (#233)
|
||||
* Add support for reading an SQL file from stdin
|
||||
* Fix for missing tokenize-query in Composer's vendor/bin/ directory
|
||||
* Fix for PHP warnings with an incomplete CASE expression (#241)
|
||||
* Fix for error message with multiple CALL statements (#223)
|
||||
* Recognize the question mark character as a parameter (#242)
|
||||
|
||||
## [4.3.1] - 2019-01-05
|
||||
|
||||
* Fixed incorrect error thrown on DEFAULT keyword in ALTER statement (#218)
|
||||
|
||||
## [4.3.0] - 2018-12-25
|
||||
|
||||
* Add support for aliases on CASE expressions (#162 and #192)
|
||||
* Add support for INDEX hints in SELECT statement (#199)
|
||||
* Add support for LOCK and UNLOCK TABLES statement (#180)
|
||||
* Add detection of extraneous comma in UPDATE statement (#160)
|
||||
* Add detection of a missing comma between two ALTER operations (#189)
|
||||
* Add missing support for STRAIGHT_JOIN (#196)
|
||||
* Add support for end options in SET statement (#190)
|
||||
* Fix building of RENAME statements (#201)
|
||||
* Add support for PURGE statements (#207)
|
||||
* Add support for COLLATE keyword (#190)
|
||||
|
||||
## [4.2.5] - 2018-10-31
|
||||
|
||||
* Fix issue with CREATE OR REPLACE VIEW.
|
||||
|
||||
## [4.2.4] - 2017-12-06
|
||||
|
||||
* Fix parsing of CREATE TABLE with per field COLLATE.
|
||||
* Improved Context::loadClosest to better deal with corner cases.
|
||||
* Localization updates.
|
||||
|
||||
## [4.2.3] - 2017-10-10
|
||||
|
||||
* Make mbstring extension optional (though Symfony polyfill).
|
||||
* Fixed build CREATE TABLE query with PARTITIONS having ENGINE but not VALUES.
|
||||
|
||||
## [4.2.2] - 2017-09-28
|
||||
|
||||
* Added support for binding parameters.
|
||||
|
||||
## [4.2.1] - 2017-09-08
|
||||
|
||||
* Fixed minor bug in Query::getFlags.
|
||||
* Localization updates.
|
||||
|
||||
## [4.2.0] - 2017-08-30
|
||||
|
||||
* Initial support for MariaDB SQL contexts.
|
||||
* Add support for MariaDB 10.3 INTERSECT and EXCEPT.
|
||||
|
||||
## [4.1.10] - 2017-08-21
|
||||
|
||||
* Use custom LoaderException for context loading errors.
|
||||
|
||||
## [4.1.9] - 2017-07-12
|
||||
|
||||
* Various code cleanups.
|
||||
* Improved error handling of several invalid statements.
|
||||
|
||||
## [4.1.8] - 2017-07-09
|
||||
|
||||
* Fixed parsing SQL comment at the end of query.
|
||||
* Improved handing of non utf-8 strings.
|
||||
* Added query flag for SET queries.
|
||||
|
||||
## [4.1.7] - 2017-06-06
|
||||
|
||||
* Fixed setting combination SQL Modes.
|
||||
|
||||
## [4.1.6] - 2017-06-01
|
||||
|
||||
* Fixed building query with GROUP BY clause.
|
||||
|
||||
## [4.1.5] - 2017-05-15
|
||||
|
||||
* Fixed invalid lexing of queries with : in strings.
|
||||
* Properly handle maximal length of delimiter.
|
||||
|
||||
## [4.1.4] - 2017-05-05
|
||||
|
||||
* Fixed wrong extract of string tokens with escaped characters.
|
||||
* Properly handle lowercase begin statement.
|
||||
|
||||
## [4.1.3] - 2017-04-06
|
||||
|
||||
* Added support for DELETE ... JOIN clauses.
|
||||
* Changed BufferedQuery to include comments in output.
|
||||
* Fixed parsing of inline comments.
|
||||
|
||||
## [4.1.2] - 2017-02-20
|
||||
|
||||
* Coding style improvements.
|
||||
* Chinese localization.
|
||||
* Improved order validatin for JOIN clauses.
|
||||
* Improved pretty printing of JOIN clauses.
|
||||
* Added support for LOAD DATA statements.
|
||||
|
||||
## [4.1.1] - 2017-02-07
|
||||
|
||||
* Localization using phpmyadmin/motranslator is now optional.
|
||||
* Improved testsuite.
|
||||
* Better handling of non upper cased not reserved keywords.
|
||||
* Minor performance and coding style improvements.
|
||||
|
||||
## [4.1.0] - 2017-01-23
|
||||
|
||||
* Use phpmyadmin/motranslator to localize messages.
|
||||
|
||||
## [4.0.1] - 2017-01-23
|
||||
|
||||
* Fixed CLI wrappers for new API.
|
||||
* Fixed README for new API.
|
||||
|
||||
## [4.0.0] - 2017-01-23
|
||||
|
||||
* Added PhpMyAdmin namespace prefix to follow PSR-4.
|
||||
|
||||
## [3.4.17] - 2017-01-20
|
||||
|
||||
* Coding style fixes.
|
||||
* Fixed indentation in HTML formatting.
|
||||
* Fixed parsing of unterminated variables.
|
||||
* Improved comments lexing.
|
||||
|
||||
## [3.4.16] - 2017-01-06
|
||||
|
||||
* Coding style fixes.
|
||||
* Properly handle operators AND, NOT, OR, XOR, DIV, MOD
|
||||
|
||||
## [3.4.15] - 2017-01-02
|
||||
|
||||
* Fix return value of Formatter.toString() when type is text
|
||||
* Fix parsing of FIELDS and LINES options in SELECT..INTO
|
||||
* PHP 7.2 compatibility.
|
||||
* Better parameter passing to query formatter.
|
||||
|
||||
## [3.4.14] - 2016-11-30
|
||||
|
||||
* Improved parsing of UNION queries.
|
||||
* Recognize BINARY function.
|
||||
|
||||
## [3.4.13] - 2016-11-15
|
||||
|
||||
* Fix broken incorrect clause order detection for Joins.
|
||||
* Add parsing of end options in Select statements.
|
||||
|
||||
## [3.4.12] - 2016-11-09
|
||||
|
||||
* Added verification order of SELECT statement clauses.
|
||||
|
||||
## [3.4.11] - 2016-10-25
|
||||
|
||||
* Fixed parsing of ON UPDATE option in field definition of TIMESTAMP type with precision
|
||||
* Fixed parsing of NATURAL JOIN, CROSS JOIN and related joins.
|
||||
* Fixed parsing of BEGIN/END labels.
|
||||
|
||||
## [3.4.10] - 2016-10-03
|
||||
|
||||
* Fixed API regression on DELETE statement
|
||||
|
||||
## [3.4.9] - 2016-10-03
|
||||
|
||||
* Added support for CASE expressions
|
||||
* Support for parsing and building DELETE statement
|
||||
* Support for parsing subqueries in FROM clause
|
||||
|
||||
## [3.4.8] - 2016-09-22
|
||||
|
||||
* No change release to sync GitHub releases with Packagist
|
||||
|
||||
## [3.4.7] - 2016-09-20
|
||||
|
||||
* Fix parsing of DEFINER without backquotes
|
||||
* Fixed escaping HTML entities in HTML formatter
|
||||
* Fixed escaping of control chars in CLI formatter
|
||||
|
||||
## [3.4.6] - 2016-09-13
|
||||
|
||||
* Fix parsing of REPLACE INTO ...
|
||||
* Fix parsing of INSERT ... ON DUPLICATE KEY UPDATE ...
|
||||
* Extended testsuite
|
||||
* Re-enabled PHP 5.3 support
|
||||
|
||||
## [3.4.5] - 2016-09-13
|
||||
|
||||
* Fix parsing of INSERT...SELECT and INSERT...SET syntax
|
||||
* Fix parsing of CREATE TABLE ... PARTITION
|
||||
* Fix parsing of SET CHARACTER SET, CHARSET, NAMES
|
||||
* Add Support for 'CREATE TABLE `table_copy` LIKE `table`
|
||||
|
||||
## [3.4.4] - 2016-04-26
|
||||
|
||||
* Add support for FULL OUTER JOIN
|
||||
|
||||
## [3.4.3] - 2016-04-19
|
||||
|
||||
* Fix parsing of query with \
|
||||
|
||||
## [3.4.2] - 2016-04-07
|
||||
|
||||
* Recognize UNION DISTINCT
|
||||
* Recognize REGEXP and RLIKE operators
|
||||
|
||||
## [3.4.1] - 2016-04-06
|
||||
|
||||
* Add FULLTEXT and SPATIAL keywords
|
||||
* Properly parse CREATE TABLE [AS] SELECT
|
||||
* Fix parsing of table with DEFAULT and COMMENT
|
||||
|
||||
## [3.4.0] - 2016-02-23
|
||||
|
||||
* Fix parsing DEFAULT value on CREATE
|
||||
* Fix parsing of ALTER VIEW
|
||||
|
||||
## [3.3.1] - 2016-02-12
|
||||
|
||||
* Condition: Allow keyword `INTERVAL`.
|
||||
|
||||
## [3.3.0] - 2016-02-12
|
||||
|
||||
* Expression: Refactored parsing options.
|
||||
|
||||
## [3.2.0] - 2016-02-11
|
||||
|
||||
* Context: Added custom mode that avoids escaping when possible.
|
||||
|
||||
## [3.1.0] - 2016-02-10
|
||||
|
||||
* ArrayObj: Handle more complex expressions in arrays.
|
||||
* BufferedQuery: Backslashes in comments escaped characters in comments.
|
||||
* Condition: Allow `IF` in conditions.
|
||||
* Context: Add `;` as operator.
|
||||
* Context: Updated contexts to contain `BIT` data type.
|
||||
* CreateStatement: The `DEFAULT` option may be an expression.
|
||||
* DescribeStatement: Added `DESC` as alias for `DESCRIBE`.
|
||||
* Expression: Rewrote expression parsing.
|
||||
* Misc: Added PHPUnit's Code Coverage 3.0 as a dependency.
|
||||
* Misc: Added support for PHP 5.4 back.
|
||||
* Misc: Removed dependency to Ctype.
|
||||
* Misc: Repository transferred from @udan11 to @phpMyAdmin.
|
||||
* Misc: Updated `.gitignore` to ignore `composer.lock`.
|
||||
* Misc: Updated Composer and Travis configuration for PHP 7 and PHPUnit 5.
|
||||
* Tools: Documented tags in `ContextGenerator`.
|
||||
|
||||
## [3.0.8] - 2015-12-18
|
||||
|
||||
* Allow `NULL` in expressions.
|
||||
* Downgraded PHPUnit to 4.8. Removed old PHP versions.
|
||||
* Updated PHPUnit to 5.1 and fixed some of the tests.
|
||||
* Added `UNION ALL` as a type of `UNION`.
|
||||
* Expressions are permitted in `SET` operations.
|
||||
* Added `STRAIGHT_JOIN` as a known type of join.
|
||||
* Added missing definitions for `MATCH` and `AGAINST`.
|
||||
* Added missing statement (`FLUSH` and `DEALLOCATE`).
|
||||
|
||||
## [3.0.7] - 2015-11-12
|
||||
|
||||
* Expressions may begin with a function that is also a reserved keyword (e.g. `IF`).
|
||||
|
||||
## [3.0.6] - 2015-11-12
|
||||
|
||||
* Fixed a bug where formatter split the function name and the parameters list.
|
||||
|
||||
## [3.0.5] - 2015-11-08
|
||||
|
||||
* Add GRANT as known statement.
|
||||
* Use JOIN expressions for flag detection.
|
||||
* Fix the order of clauses in SELECT statements involving UNIONs.
|
||||
* Added dummy parsers for CREATE USER and SET PASSWORD statements.
|
||||
* Accept NOT operator in conditions.
|
||||
* Fixed DELIMITER statements in BufferedQuery.
|
||||
* Added INSERT statement builder.
|
||||
|
||||
## [3.0.4] - 2015-10-21
|
||||
|
||||
* Fix error message in `SqlParser\Components\OptionsArray`.
|
||||
|
||||
## [3.0.3] - 2015-10-10
|
||||
|
||||
* Avoid building a field multiple times if clause has synonyms.
|
||||
|
||||
## [3.0.2] - 2015-10-10
|
||||
|
||||
* Add EXISTS as an acceptable keyword in conditions.
|
||||
|
||||
## [3.0.1] - 2015-10-06
|
||||
|
||||
* Handle backslashes separately for `SqlParser\Utils\BufferedQuery`. Fixes a bug where backslashes in combination with strings weren't handled properly.
|
||||
|
||||
## [3.0.0] - 2015-10-02
|
||||
|
||||
__Breaking changes:__
|
||||
|
||||
* `SqlParser\Components\Reference::$table` is now an instance of `SqlParser\Components\Expression` to support references from other tables.
|
||||
|
||||
## [2.1.3] - 2015-10-02
|
||||
|
||||
* Add definitions for all JOIN clauses.
|
||||
|
||||
## [2.1.2] - 2015-10-02
|
||||
|
||||
* Properly parse options when the value of the option is '='.
|
||||
|
||||
## [2.1.1] - 2015-09-30
|
||||
|
||||
* Only RANGE and LIST type partitions support VALUES.
|
||||
|
||||
## [2.1.0] - 2015-09-30
|
||||
|
||||
* Added utilities for handling tokens and tokens list.
|
||||
|
||||
## [2.0.3] - 2015-09-30
|
||||
|
||||
* Added missing NOT IN operator. This caused troubles when parsing conditions that contained the `NOT IN` operator.
|
||||
|
||||
## [2.0.2] - 2015-09-30
|
||||
|
||||
* Added support for `OUTER` as an optional keyword in joins.
|
||||
|
||||
## [2.0.1] - 2015-09-30
|
||||
|
||||
* Fixed a bug related to (sub)partitions options not being included in the built component. Also, the option `ENGINE` was unrecognized.
|
||||
|
||||
## [2.0.0] - 2015-09-25
|
||||
|
||||
* Better parsing for CREATE TABLE statements (related to breaking change 1).
|
||||
* Added support for JSON data type.
|
||||
* Refactoring and minor documentation improvements.
|
||||
|
||||
__Breaking changes:__
|
||||
* `SqlParser\Components\Key::$columns` is now an array of arrays. Each array must contain a `name` key which represents the name of the column and an optional `length` key which represents the length of the column.
|
||||
|
||||
## [1.0.0] - 2015-08-20
|
||||
|
||||
* First release of this library.
|
||||
@@ -0,0 +1,53 @@
|
||||
# Contributing to SQL Parser
|
||||
|
||||
## Reporting issues
|
||||
|
||||
Our issue tracker is hosted at GitHub:
|
||||
|
||||
https://github.com/phpmyadmin/sql-parser/issues
|
||||
|
||||
Please search for existing issues before reporting new ones.
|
||||
|
||||
## Working with Git checkout
|
||||
|
||||
The dependencies are managed by Composer, to get them all installed (or update
|
||||
on consequent runs) do:
|
||||
|
||||
```
|
||||
composer update
|
||||
```
|
||||
|
||||
## Submitting patches
|
||||
|
||||
Please submit your patches using GitHub pull requests, this allows us to review
|
||||
them and to run automated tests on the code.
|
||||
|
||||
## Coding standards
|
||||
|
||||
We do follow PSR-1 and PSR-2 coding standards.
|
||||
|
||||
You can use phpcbf to fix the code to match our expectations:
|
||||
|
||||
```
|
||||
./vendor/bin/phpcbf
|
||||
```
|
||||
|
||||
## Testsuite
|
||||
|
||||
Our code comes with quite comprehensive testsuite, it is automatically executed
|
||||
on every commit and pull request, you can also run it locally:
|
||||
|
||||
```
|
||||
./vendor/bin/phpunit
|
||||
```
|
||||
|
||||
The testsuite relies on fixtures of parser states, in case you need to
|
||||
regenerate some of these there are helper scripts in tools directory:
|
||||
|
||||
```
|
||||
# Remove file you want to regenerate
|
||||
rm tests/data/parser/parse.out
|
||||
|
||||
# Run the generator located in the tools directory
|
||||
./tools/run_generators.sh
|
||||
```
|
||||
@@ -0,0 +1,339 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
@@ -0,0 +1,137 @@
|
||||
# SQL Parser
|
||||
|
||||
A validating SQL lexer and parser with a focus on MySQL dialect.
|
||||
|
||||
## Code status
|
||||
|
||||

|
||||
[](https://scrutinizer-ci.com/g/phpmyadmin/sql-parser/?branch=master)
|
||||
[](https://codecov.io/github/phpmyadmin/sql-parser?branch=master)
|
||||
[](https://scrutinizer-ci.com/g/phpmyadmin/sql-parser/?branch=master)
|
||||
[](https://hosted.weblate.org/engage/phpmyadmin/?utm_source=widget)
|
||||
[](https://packagist.org/packages/phpmyadmin/sql-parser)
|
||||
[](https://www.codetriage.com/phpmyadmin/sql-parser)
|
||||
[](https://shepherd.dev/github/phpmyadmin/sql-parser)
|
||||
[](https://infection.github.io)
|
||||
|
||||
## Installation
|
||||
|
||||
Please use [Composer][1] to install:
|
||||
|
||||
```sh
|
||||
composer require phpmyadmin/sql-parser
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
The API documentation is available at
|
||||
<https://develdocs.phpmyadmin.net/sql-parser/>.
|
||||
|
||||
## Usage
|
||||
|
||||
### Command line utilities
|
||||
|
||||
Command line utility to syntax highlight SQL query:
|
||||
|
||||
```sh
|
||||
./vendor/bin/highlight-query --query "SELECT 1"
|
||||
```
|
||||
|
||||
Command line utility to lint SQL query:
|
||||
|
||||
```sh
|
||||
./vendor/bin/lint-query --query "SELECT 1"
|
||||
```
|
||||
|
||||
Command line utility to tokenize SQL query:
|
||||
|
||||
```sh
|
||||
./vendor/bin/tokenize-query --query "SELECT 1"
|
||||
```
|
||||
|
||||
All commands are able to parse input from stdin (standard in), such as:
|
||||
|
||||
```sh
|
||||
echo "SELECT 1" | ./vendor/bin/highlight-query
|
||||
cat example.sql | ./vendor/bin/lint-query
|
||||
```
|
||||
|
||||
### Formatting SQL query
|
||||
|
||||
```php
|
||||
echo PhpMyAdmin\SqlParser\Utils\Formatter::format($query, ['type' => 'html']);
|
||||
```
|
||||
|
||||
### Discoverying query type
|
||||
|
||||
```php
|
||||
use PhpMyAdmin\SqlParser\Parser;
|
||||
use PhpMyAdmin\SqlParser\Utils\Query;
|
||||
|
||||
$query = 'OPTIMIZE TABLE tbl';
|
||||
$parser = new Parser($query);
|
||||
$flags = Query::getFlags($parser->statements[0]);
|
||||
|
||||
echo $flags['querytype'];
|
||||
```
|
||||
|
||||
### Parsing and building SQL query
|
||||
|
||||
```php
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
$query1 = 'select * from a';
|
||||
$parser = new PhpMyAdmin\SqlParser\Parser($query1);
|
||||
|
||||
// inspect query
|
||||
var_dump($parser->statements[0]); // outputs object(PhpMyAdmin\SqlParser\Statements\SelectStatement)
|
||||
|
||||
// modify query by replacing table a with table b
|
||||
$table2 = new \PhpMyAdmin\SqlParser\Components\Expression('', 'b', '', '');
|
||||
$parser->statements[0]->from[0] = $table2;
|
||||
|
||||
// build query again from an array of object(PhpMyAdmin\SqlParser\Statements\SelectStatement) to a string
|
||||
$statement = $parser->statements[0];
|
||||
$query2 = $statement->build();
|
||||
var_dump($query2); // outputs string(19) 'SELECT * FROM `b` '
|
||||
|
||||
// Change SQL mode
|
||||
PhpMyAdmin\SqlParser\Context::setMode('ANSI_QUOTES');
|
||||
|
||||
// build the query again using different quotes
|
||||
$query2 = $statement->build();
|
||||
var_dump($query2); // outputs string(19) 'SELECT * FROM "b" '
|
||||
```
|
||||
|
||||
## Localization
|
||||
|
||||
You can localize error messages installing `phpmyadmin/motranslator` version `5.0` or newer:
|
||||
|
||||
```sh
|
||||
composer require phpmyadmin/motranslator:^5.0
|
||||
```
|
||||
|
||||
The locale is automatically detected from your environment, you can also set a different locale
|
||||
|
||||
**From cli**:
|
||||
|
||||
```sh
|
||||
LC_ALL=pl ./vendor/bin/lint-query --query "SELECT 1"
|
||||
```
|
||||
|
||||
**From php**:
|
||||
|
||||
```php
|
||||
require __DIR__ . '/vendor/autoload.php';
|
||||
|
||||
$GLOBALS['lang'] = 'pl';
|
||||
|
||||
$query1 = 'select * from a';
|
||||
$parser = new PhpMyAdmin\SqlParser\Parser($query1);
|
||||
```
|
||||
|
||||
## More information
|
||||
|
||||
This library was originally created during the Google Summer of Code 2015 and has been used by phpMyAdmin since version 4.5.
|
||||
|
||||
[1]:https://getcomposer.org/
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
$files = [
|
||||
__DIR__ . "/../vendor/autoload.php",
|
||||
__DIR__ . "/../../vendor/autoload.php",
|
||||
__DIR__ . "/../../../autoload.php",
|
||||
"vendor/autoload.php"
|
||||
];
|
||||
|
||||
$found = false;
|
||||
foreach ($files as $file) {
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$found) {
|
||||
die(
|
||||
"You need to set up the project dependencies using the following commands:" . PHP_EOL .
|
||||
"curl -sS https://getcomposer.org/installer | php" . PHP_EOL .
|
||||
"php composer.phar install" . PHP_EOL
|
||||
);
|
||||
}
|
||||
|
||||
$cli = new PhpMyAdmin\SqlParser\Utils\CLI();
|
||||
exit($cli->runHighlight());
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
$files = [
|
||||
__DIR__ . "/../vendor/autoload.php",
|
||||
__DIR__ . "/../../vendor/autoload.php",
|
||||
__DIR__ . "/../../../autoload.php",
|
||||
"vendor/autoload.php"
|
||||
];
|
||||
|
||||
$found = false;
|
||||
foreach ($files as $file) {
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$found) {
|
||||
die(
|
||||
"You need to set up the project dependencies using the following commands:" . PHP_EOL .
|
||||
"curl -sS https://getcomposer.org/installer | php" . PHP_EOL .
|
||||
"php composer.phar install" . PHP_EOL
|
||||
);
|
||||
}
|
||||
|
||||
$cli = new PhpMyAdmin\SqlParser\Utils\CLI();
|
||||
exit($cli->runLint());
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
$files = [
|
||||
__DIR__ . "/../vendor/autoload.php",
|
||||
__DIR__ . "/../../vendor/autoload.php",
|
||||
__DIR__ . "/../../../autoload.php",
|
||||
"vendor/autoload.php"
|
||||
];
|
||||
|
||||
$found = false;
|
||||
foreach ($files as $file) {
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
$found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!$found) {
|
||||
die(
|
||||
"You need to set up the project dependencies using the following commands:" . PHP_EOL .
|
||||
"curl -sS https://getcomposer.org/installer | php" . PHP_EOL .
|
||||
"php composer.phar install" . PHP_EOL
|
||||
);
|
||||
}
|
||||
|
||||
$cli = new PhpMyAdmin\SqlParser\Utils\CLI();
|
||||
exit($cli->runTokenize());
|
||||
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"name": "phpmyadmin/sql-parser",
|
||||
"description": "A validating SQL lexer and parser with a focus on MySQL dialect.",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"keywords": ["sql", "lexer", "parser", "analysis"],
|
||||
"homepage": "https://github.com/phpmyadmin/sql-parser",
|
||||
"authors": [
|
||||
{
|
||||
"name": "The phpMyAdmin Team",
|
||||
"email": "developers@phpmyadmin.net",
|
||||
"homepage": "https://www.phpmyadmin.net/team/"
|
||||
}
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/phpmyadmin/sql-parser/issues",
|
||||
"source": "https://github.com/phpmyadmin/sql-parser"
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0",
|
||||
"symfony/polyfill-mbstring": "^1.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpmyadmin/coding-standard": "^3.0",
|
||||
"phpmyadmin/motranslator": "^4.0 || ^5.0",
|
||||
"phpstan/extension-installer": "^1.1",
|
||||
"phpstan/phpstan": "^1.2",
|
||||
"phpstan/phpstan-phpunit": "^1.0",
|
||||
"phpunit/php-code-coverage": "*",
|
||||
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
|
||||
"psalm/plugin-phpunit": "^0.16.1",
|
||||
"vimeo/psalm": "^4.11",
|
||||
"zumba/json-serializer": "^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"phpmyadmin/motranslator": "<3.0"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-mbstring": "For best performance",
|
||||
"phpmyadmin/motranslator": "Translate messages to your favorite locale"
|
||||
},
|
||||
"bin": [
|
||||
"bin/highlight-query",
|
||||
"bin/lint-query",
|
||||
"bin/tokenize-query"
|
||||
],
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"PhpMyAdmin\\SqlParser\\": "src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"PhpMyAdmin\\SqlParser\\Tests\\": "tests"
|
||||
}
|
||||
},
|
||||
"config":{
|
||||
"sort-packages": true
|
||||
}
|
||||
}
|
||||
BIN
Binary file not shown.
+286
@@ -0,0 +1,286 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2015-10-15 11:30+0200\n"
|
||||
"Last-Translator: Michal Čihař <michal@cihar.com>\n"
|
||||
"Language-Team: Afrikaans <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"master/af/>\n"
|
||||
"Language: af\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 2.5-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
#, fuzzy
|
||||
#| msgid "With selected:"
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "Met gekose:"
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
#, fuzzy
|
||||
#| msgid "With selected:"
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "Met gekose:"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
#, fuzzy
|
||||
#| msgid "With selected:"
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "Met gekose:"
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
#, fuzzy
|
||||
#| msgid "With selected:"
|
||||
msgid "An expression was expected."
|
||||
msgstr "Met gekose:"
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
#, fuzzy
|
||||
#| msgid "With selected:"
|
||||
msgid "An alias was expected."
|
||||
msgstr "Met gekose:"
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
msgid "Unexpected token."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "By Begin van Tabel"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "By Begin van Tabel"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
#, fuzzy
|
||||
#| msgid "The row has been deleted."
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "Die ry is verwyder"
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
#, fuzzy
|
||||
#| msgid "as regular expression"
|
||||
msgid "Missing expression."
|
||||
msgstr "as 'n regular expression"
|
||||
|
||||
#: src/Lexer.php:244
|
||||
msgid "Unexpected character."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, fuzzy, php-format
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "Tabel %s is verwyder"
|
||||
|
||||
#: src/Lexer.php:955
|
||||
msgid "Variable name was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Parser.php:451
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "By Begin van Tabel"
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:407
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "By Begin van Tabel"
|
||||
|
||||
#: src/Statement.php:551
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "By Begin van Tabel"
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
#, fuzzy
|
||||
#| msgid "With selected:"
|
||||
msgid "A table name was expected."
|
||||
msgstr "Met gekose:"
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
#, fuzzy
|
||||
#| msgid "The row has been deleted."
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "Die ry is verwyder"
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "By Begin van Tabel"
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
msgid "Unexpected keyword"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Error"
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "Fout"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Query"
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "Navraag dmv Voorbeeld"
|
||||
BIN
Binary file not shown.
+255
@@ -0,0 +1,255 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2020-08-07 09:32+0000\n"
|
||||
"Last-Translator: tamer dab <dabsantamer@yahoo.com>\n"
|
||||
"Language-Team: Arabic <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"sql-parser/ar/>\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Weblate 4.2-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "لم تنفذ بعد."
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr "تم العثور على بيان جديد، ولكن لا يوجد محدد بينه وبين سابقه ."
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr "فاصلة مفقودة قبل بدء عملية تغيير جديدة."
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr "عملية تغيير غير معروفة."
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr "تم توقع قيم %1$d ، ولكن تم العثور على %2$d."
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr "من المتوقع وجود قوس فتح متبوعا بمجموعة من القيم."
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr "من المتوقع وجود قوس مفتوح."
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "كلمة رئيسية غير متوقعة."
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr "نهاية غير متوقعة من التعبير"
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr "من المحتمل وجود مُسَمَّى إضافي متكرر لعبارة CASE."
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr "يتوقع وضع مُسَمَّى إضافي بعد AS لكن تم وضع "
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr "اسم مستعار موجود مسبقا ."
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "كان من المتوقع اسم مستعار بعد AS."
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
"كان من المتوقع وجود اسم رمز! لا يمكن استخدام كلمة رئيسية محجوزة كاسم عمود "
|
||||
"بدون علامات اقتباس."
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "كان من المتوقع اسم رمز!"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "من المتوقع وجود فاصلة أو قوس إغلاق."
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr "من المتوقع وجود قوس مغلق."
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr "نوع بيانات غير معروف."
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
msgid "An expression was expected."
|
||||
msgstr "متوقع وجود تعبير ."
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
msgid "An alias was expected."
|
||||
msgstr "كان من المتوقع وجود اسم مستعار."
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr "نقطة غير متوقعة."
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
msgid "Unexpected token."
|
||||
msgstr "رمز غير متوقع."
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr "متوقع حدوث تعويض ."
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "نهاية غير متوقعة لعبارة LOCK ."
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "نهاية غير متوقعة لتعبير Lock."
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr "يتعارض هذا الخيار مع“%1$s“ ."
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "متوفع وجود اسم الجدول القديم ."
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr "متوقع وجود الكلمة الرئيسية \"TO\"."
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "متوقع وجود الاسم الجديد للجدول ."
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "نتوقع منك اعادة تسمية ."
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
msgid "Missing expression."
|
||||
msgstr "تعبير مفقود ."
|
||||
|
||||
#: src/Lexer.php:244
|
||||
msgid "Unexpected character."
|
||||
msgstr "حرف غير متوقع ."
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr "المسافات البيضاء المتوقعة قبل المحدد."
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr "المحدد المتوقع."
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, php-format
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "نتوقع إنهاء الاقتباس %1$s ."
|
||||
|
||||
#: src/Lexer.php:955
|
||||
msgid "Variable name was expected."
|
||||
msgstr "متوقع منك اسم متغير ."
|
||||
|
||||
#: src/Parser.php:451
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "بداية غير متوقعة للبيان."
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr "نوع بيان غير معروف."
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr "لم يتم بدء أي معاملة من قبل."
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr "تم تحليل هذا النوع من العبارات سابقا."
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr "كلمة محجوزة غير معروفة."
|
||||
|
||||
#: src/Statement.php:407
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "الكلمة المفتاحية في نهاية البيان."
|
||||
|
||||
#: src/Statement.php:551
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "ترتيب غير متوقع للبنود."
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr "نتوفع منك ادراج اسم الكيان ."
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
msgid "A table name was expected."
|
||||
msgstr "نتوقع تسمية الجدول ."
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "نتوقع منك تعريف عمود علي الاقل ."
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr "كانت الكلمة الرئيسية \"رجوع\" متوقعة."
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr "هذا النوع من الشرط غير صالح في الاستعلامات متعددة الجداول."
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "نهاية غير متوقعة لبيان LOCK."
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "كلمة أساسية غير متوقعة"
|
||||
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "الخطأ رقم 1"
|
||||
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "خطأ صارم"
|
||||
BIN
Binary file not shown.
+266
@@ -0,0 +1,266 @@
|
||||
# phpMyAdmin SQL parser translation.
|
||||
# Copyright (C) 2015 - 2017 phpMyAdmin devel team
|
||||
# This file is distributed under the same license as the SQL parser package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2020-10-04 21:34+0000\n"
|
||||
"Last-Translator: Michal Čihař <michal@cihar.com>\n"
|
||||
"Language-Team: Asturian <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"sql-parser/ast/>\n"
|
||||
"Language: ast\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.3-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "Entá nun se desendolcó."
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
"Alcontróse una nueva declaración, pero nun hai llendador ente ésta y la "
|
||||
"anterior."
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr "Operación d'alteración desconocida."
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr "Esperábense %1$d valores, pero s'alcontraron %2$d."
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr "Esperábase un corchete d'apertura siguíu por un conxuntu de valores."
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr "Esperábase un corchete d'apertura."
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "Palabra clave inesperada."
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr "Final inesperáu d'espresión CASE"
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr "Final inesperáu d'espresión CASE"
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr "Alcontróse anteriormente un alcuñu."
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
#, fuzzy
|
||||
#| msgid "An alias was expected."
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "Esperábase un alcuñu."
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
"Esperábase un nome de símbolu. Una palabra acutada nun puede usase como nome "
|
||||
"de columna ensin comines."
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "Esperábase un nome de símbolu"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "Esperábase una coma o un corchete de zarru."
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr "Esperábase un corchete de zarru."
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr "Tipu de datu desconocíu."
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
msgid "An expression was expected."
|
||||
msgstr "Esperábase una espresión."
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
msgid "An alias was expected."
|
||||
msgstr "Esperábase un alcuñu."
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr "Puntu inesperáu."
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
msgid "Unexpected token."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr "Esperábase un desplazamientu."
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "Final inesperáu d'espresión CASE"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "Final inesperáu d'espresión CASE"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr "Esta opción fai conflictu con \"%1$s\"."
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "Esperábase'l nome anterior de la tabla."
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr "Esperábase la palabra clave \"TO\"."
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "Esperábase'l nome nuevu de la tabla."
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "Esperábase una operación de cambiu de nome."
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
msgid "Missing expression."
|
||||
msgstr "Falta una espresión."
|
||||
|
||||
#: src/Lexer.php:244
|
||||
msgid "Unexpected character."
|
||||
msgstr "Carácter inesperáu."
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr "Esperábase espaciu(os) en blancu antes d'un llendador."
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr "Esperábase un llendador."
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, php-format
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "Esperábense les comines de final %1$s."
|
||||
|
||||
#: src/Lexer.php:955
|
||||
msgid "Variable name was expected."
|
||||
msgstr "Esperábase un nome de variable."
|
||||
|
||||
#: src/Parser.php:451
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr ""
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:407
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:551
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
msgid "A table name was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "Final inesperáu d'espresión CASE"
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected keyword."
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "Palabra clave inesperada."
|
||||
BIN
Binary file not shown.
+273
@@ -0,0 +1,273 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2017-11-25 14:44+0000\n"
|
||||
"Last-Translator: Sevdimali İsa <sevdimaliisayev@mail.ru>\n"
|
||||
"Language-Team: Azerbaijani <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"sql-parser/az/>\n"
|
||||
"Language: az\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 2.18-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "Hələki tətbiq edilməyib."
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr "Kateqoriya olunmamış alter əməliyyatı."
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr "%1$d gözlənilirdi, amma %2$d tapıldı."
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr "Mötərizə ardından bir qrup dəyər gözlənilməkdə."
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "Gözlənilməyən açar söz."
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr "Gözlənməz Böyük/Kiçik hərf ifadəsi sonu"
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr "Gözlənməz Böyük/Kiçik hərf ifadəsi sonu"
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr "Daha öncə alias tapıldı."
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
#, fuzzy
|
||||
#| msgid "An alias was expected."
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "Alias gözlənilirdi."
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
"Bir simvol adı gözlənilirdi! Dırnaqsız reserv sözlər sütün adı olaraq "
|
||||
"istifadə edilə bilməz."
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "Simvol adı gözlənilirdi!"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "Vergül və ya mötərizə gözlənilirdi."
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr "Mötərizə gözlənilirdi."
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr "Tanınmayan verilən tipi."
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
msgid "An expression was expected."
|
||||
msgstr "İfadə gözlənilməkdə."
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
msgid "An alias was expected."
|
||||
msgstr "Alias gözlənilirdi."
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr "Gözlənilməz nöqtə."
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
msgid "Unexpected token."
|
||||
msgstr "Gözlənilməyən token."
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "Gözlənməz Böyük/Kiçik hərf ifadəsi sonu"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "Gözlənməz Böyük/Kiçik hərf ifadəsi sonu"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr "Bu seçim %1$s bununla zidiyyət təşkil edir."
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "Cədvəlin köhnə adı gözlənilirdi."
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr "\"TO\" açar sözü gözlənilirdi."
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "Cədvəlin yeni adı gözlənilirdi."
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "Yenidən adlandırma əməliyyatı gözlənilirdi."
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
msgid "Missing expression."
|
||||
msgstr "Əksik ifadə."
|
||||
|
||||
#: src/Lexer.php:244
|
||||
msgid "Unexpected character."
|
||||
msgstr "Gözlənilməyən simvol."
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, fuzzy, php-format
|
||||
#| msgid "Event %1$s has been created."
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "%1$s hadisəsi yaradıldı."
|
||||
|
||||
#: src/Lexer.php:955
|
||||
msgid "Variable name was expected."
|
||||
msgstr "Dəyişən adı gözlənilirdi."
|
||||
|
||||
#: src/Parser.php:451
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "İfadənin gözlənilməz başlanğıcı."
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr "Tanınmayan ifadə tipi."
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr "Daha öncə tranzaksiya başladılmadı."
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr "Tanınmayan açarsöz."
|
||||
|
||||
#: src/Statement.php:407
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "İfadənin sonunda açar söz."
|
||||
|
||||
#: src/Statement.php:551
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "Cədvəlin başına"
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr "Açıq olan cədvəl sayı."
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
msgid "A table name was expected."
|
||||
msgstr "Cədvəl adı gözlənilirdi."
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "Ən az bir sütün açıqlaması gözlənilirdi."
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr "\"RETURNS\" açarsözü gözlənilirdi."
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected beginning of statement."
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "İfadənin gözlənilməz başlanğıcı."
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected keyword."
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "Gözlənilməyən açar söz."
|
||||
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "xəta #1"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Query error"
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "Sorğu xətası"
|
||||
BIN
Binary file not shown.
+268
@@ -0,0 +1,268 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2017-08-22 09:47+0000\n"
|
||||
"Last-Translator: Viktar Vauchkevich <victorenator@gmail.com>\n"
|
||||
"Language-Team: Belarusian <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"sql-parser/be/>\n"
|
||||
"Language: be\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 2.17-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "Яшчэ не рэалізавана."
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
"Знойдзена новае сцвярджэнне, але між ім і папярэднім няма раздзяляльніка."
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr "Нераспазнаная аперацыя змены."
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr "Чакалася %1$d значэнняў, а знойдзена %2$d."
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr "Чакаліся адкрывальная дужка і спіс значэнняў."
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr "Чакалася адкрывальная дужка."
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "Нечаканае ключавое слова."
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr "Нечаканы канец CASE-выразу"
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr "Нечаканы канец CASE-выразу"
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr "Псеўданім быў знайдзены раней."
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
#, fuzzy
|
||||
#| msgid "An alias was expected."
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "Чакаўся псеўданім."
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
"Чакалася назва сімвала! Зарэзерваваныя ключавыя словы нельга выкарыстоўваць "
|
||||
"як назву слупка без двукоссяў."
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "Чакалася назва сімвала!"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "Чакалася коска або закрывальная дужка."
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr "Чакалася закрывальная дужка."
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr "Нераспазнаны тып даных."
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
msgid "An expression was expected."
|
||||
msgstr "Чакаўся выраз."
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
msgid "An alias was expected."
|
||||
msgstr "Чакаўся псеўданім."
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr "Нечаканая кропка."
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
msgid "Unexpected token."
|
||||
msgstr "Нечаканы знак."
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr "Чакаўся соступ."
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "Нечаканы канец CASE-выразу"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "Нечаканы канец CASE-выразу"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr "Гэты параметр канфліктуе з «%1$s»."
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "Чакалася старая назва табліцы."
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr "Чакалаcя ключавое слова «TO»."
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "Чакалася новая назва табліцы."
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "Чакалася аперацыя перайменавання."
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
msgid "Missing expression."
|
||||
msgstr "Адсутнічае выраз."
|
||||
|
||||
#: src/Lexer.php:244
|
||||
msgid "Unexpected character."
|
||||
msgstr "Нечаканы сімвал."
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr "Чакаўся прагал(ы) перад раздзяляльнікам."
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr "Чакаецца раздзяляльнік."
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, php-format
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "Чакалася канцавое двукоссе %1$s."
|
||||
|
||||
#: src/Lexer.php:955
|
||||
msgid "Variable name was expected."
|
||||
msgstr "Чакалася назва зменнай."
|
||||
|
||||
#: src/Parser.php:451
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "Нечаканы пачатак сцвярджэння."
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr "Нераспазнаны тып сцвярджэння."
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr "Няма папярэдне запушчанай транзакцыі."
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr "Гэты тып выразу быў папярэдне разабраны."
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr "Нераспазнанае ключавое слова."
|
||||
|
||||
#: src/Statement.php:407
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "Ключавое слова ў канцы сцвярджэння."
|
||||
|
||||
#: src/Statement.php:551
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "Нечаканы парадак выразаў."
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr "Чакалася назва сутнасці."
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
msgid "A table name was expected."
|
||||
msgstr "Чакалася назва табліцы."
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "Чакалася азначэнне прынамсі аднаго слупка."
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr "Чакалася ключавое слова «RETURNS»."
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr "Гэты тып выразу не правільны для мультытаблічных запытаў."
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected beginning of statement."
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "Нечаканы пачатак сцвярджэння."
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected keyword."
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "Нечаканае ключавое слова."
|
||||
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "памылка #1"
|
||||
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "недапушчальная памылка"
|
||||
BIN
Binary file not shown.
+269
@@ -0,0 +1,269 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2017-08-22 09:47+0000\n"
|
||||
"Last-Translator: Viktar Vauchkevich <victorenator@gmail.com>\n"
|
||||
"Language-Team: Belarusian (latin) <https://hosted.weblate.org/projects/"
|
||||
"phpmyadmin/sql-parser/be_Latn/>\n"
|
||||
"Language: be@latin\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 2.17-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "Jašče nie realizavana."
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
"Znojdziena novaje scviardžennie, alie miž im i papiarednim niama "
|
||||
"razdzialiaĺnika."
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr "Nieraspaznanaja apieracyja zmieny."
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr "Čakalasia %1$d značenniaŭ, a znojdziena %2$d."
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr "Čakalisia adkryvaĺnaja dužka i spis značenniaŭ."
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr "Čakalasia adkryvaĺnaja dužka."
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "Niečakanaje kliučavoje slova."
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr "Niečakany kaniec CASE-vyrazu"
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr "Niečakany kaniec CASE-vyrazu"
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr "Psieŭdanim byŭ znajdzieny raniej."
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
#, fuzzy
|
||||
#| msgid "An alias was expected."
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "Čakaŭsia psieŭdanim."
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
"Čakalasia nazva simvala! Zareziervavanyja kliučavyja slovy nieĺha "
|
||||
"vykarystoŭvać jak nazvu slupka biez dvukossiaŭ."
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "Čakalasia nazva simvala!"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "Čakalasia koska abo zakryvaĺnaja dužka."
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr "Čakalasia zakryvaĺnaja dužka."
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr "Nieraspaznany typ danych."
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
msgid "An expression was expected."
|
||||
msgstr "Čakaŭsia vyraz."
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
msgid "An alias was expected."
|
||||
msgstr "Čakaŭsia psieŭdanim."
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr "Niečakanaja kropka."
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
msgid "Unexpected token."
|
||||
msgstr "Niečakany znak."
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr "Čakaŭsia sostup."
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "Niečakany kaniec CASE-vyrazu"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected end of CASE expression"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "Niečakany kaniec CASE-vyrazu"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr "Hety paramietr kanfliktuje z «%1$s»."
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "Čakalasia staraja nazva tablicy."
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr "Čakalacja kliučavoje slova «TO»."
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "Čakalasia novaja nazva tablicy."
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "Čakalasia apieracyja pierajmienavannia."
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
msgid "Missing expression."
|
||||
msgstr "Adsutničaje vyraz."
|
||||
|
||||
#: src/Lexer.php:244
|
||||
msgid "Unexpected character."
|
||||
msgstr "Niečakany simval."
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr "Čakaŭsia prahal(y) pierad razdzialiaĺnikam."
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr "Čakajecca razdzialiaĺnik."
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, php-format
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "Čakalasia kancavoje dvukossie %1$s."
|
||||
|
||||
#: src/Lexer.php:955
|
||||
msgid "Variable name was expected."
|
||||
msgstr "Čakalasia nazva zmiennaj."
|
||||
|
||||
#: src/Parser.php:451
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "Niečakany pačatak scviardžennia."
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr "Nieraspaznany typ scviardžennia."
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr "Niama papiarednie zapuščanaj tranzakcyi."
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr "Hety typ vyrazu byŭ papiarednie razabrany."
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr "Nieraspaznanaje kliučavoje slova."
|
||||
|
||||
#: src/Statement.php:407
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "Kliučavoje slova ŭ kancy scviardžennia."
|
||||
|
||||
#: src/Statement.php:551
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "Niečakany paradak vyrazaŭ."
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr "Čakalasia nazva sutnasci."
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
msgid "A table name was expected."
|
||||
msgstr "Čakalasia nazva tablicy."
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "Čakalasia aznačennie prynamsi adnaho slupka."
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr "Čakalasia kliučavoje slova «RETURNS»."
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr "Hety typ vyrazu nie praviĺny dlia muĺtytabličnych zapytaŭ."
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected beginning of statement."
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "Niečakany pačatak scviardžennia."
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected keyword."
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "Niečakanaje kliučavoje slova."
|
||||
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "pamylka #1"
|
||||
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "niedapuščaĺnaja pamylka"
|
||||
BIN
Binary file not shown.
+298
@@ -0,0 +1,298 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2020-10-14 10:02+0000\n"
|
||||
"Last-Translator: Пламен <plamen_mbx@yahoo.com>\n"
|
||||
"Language-Team: Bulgarian <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"sql-parser/bg/>\n"
|
||||
"Language: bg\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.3-dev\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "Все още не е внедрена."
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
"Беше открито ново изявление, но не и разграничител между него и предишния."
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr "Липсва запетая пред началото на нова операция alter."
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr "Неизвестна промяна на операцията."
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr "%1$d стойности бяха очаквани, но бяха намерени %2$d."
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr "Очаква се отваряща скоба последвана от списък стойности."
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr "Очаква се отваряща скоба."
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "Неочаквана ключова дума."
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr "Неочакван край на израза CASE"
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr "Потенциален дублиращ се псевдоним на изявата на CASE."
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr "Псевдоним, очакван след AS, но получи "
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr "Преди това е открит псевдоним."
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "Псевдоним се очакваше след AS."
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
"Очакваше се име на символ! Запазената ключова дума не може да се използва "
|
||||
"като име на колона без обратни кавички."
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "Очаква се име на символ!"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "Очакваше се запетая или затваряща скоба."
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
#, fuzzy
|
||||
#| msgid "No rows selected"
|
||||
msgid "An expression was expected."
|
||||
msgstr "Няма върнати редове"
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
#, fuzzy
|
||||
#| msgid "No tables selected."
|
||||
msgid "An alias was expected."
|
||||
msgstr "Няма избрани таблици."
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected token."
|
||||
msgstr "Неочаквани знаци на ред %s."
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "В началото на таблицата"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "В началото на таблицата"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "Броят отворени таблици."
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "Броят отворени таблици."
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
#, fuzzy
|
||||
#| msgid "The row has been deleted."
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "Редът беше изтрит"
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
#, fuzzy
|
||||
#| msgid "as regular expression"
|
||||
msgid "Missing expression."
|
||||
msgstr "като регулярен израз"
|
||||
|
||||
#: src/Lexer.php:244
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected character."
|
||||
msgstr "Неочаквани знаци на ред %s."
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, fuzzy, php-format
|
||||
#| msgid "Event %1$s has been created."
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "Събитието %1$s беше създадено."
|
||||
|
||||
#: src/Lexer.php:955
|
||||
#, fuzzy
|
||||
#| msgid "Table name template"
|
||||
msgid "Variable name was expected."
|
||||
msgstr "Шаблон за име на таблица"
|
||||
|
||||
#: src/Parser.php:451
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "В началото на таблицата"
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:407
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "В началото на таблицата"
|
||||
|
||||
#: src/Statement.php:551
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "В началото на таблицата"
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr "Броят отворени таблици."
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
#, fuzzy
|
||||
#| msgid "Table name template"
|
||||
msgid "A table name was expected."
|
||||
msgstr "Шаблон за име на таблица"
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
#, fuzzy
|
||||
#| msgid "The row has been deleted."
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "Редът беше изтрит"
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "В началото на таблицата"
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "Неочаквани знаци на ред %s."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "errors."
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "грешки."
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Gather errors"
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "Събиране на грешки"
|
||||
BIN
Binary file not shown.
+305
@@ -0,0 +1,305 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: SQL parser 5\n"
|
||||
"Report-Msgid-Bugs-To: translators@phpmyadmin.net\n"
|
||||
"POT-Creation-Date: 2020-03-20 21:01+0100\n"
|
||||
"PO-Revision-Date: 2021-03-02 18:02+0000\n"
|
||||
"Last-Translator: Nokib Sarkar <nokibsarkar@gmail.com>\n"
|
||||
"Language-Team: Bengali <https://hosted.weblate.org/projects/phpmyadmin/"
|
||||
"sql-parser/bn/>\n"
|
||||
"Language: bn\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Weblate 4.5\n"
|
||||
|
||||
#: src/Component.php:41 src/Component.php:61
|
||||
msgid "Not implemented yet."
|
||||
msgstr "এখনো বাস্তবায়িত হয়নি।"
|
||||
|
||||
#: src/Components/AlterOperation.php:278 src/Statement.php:351
|
||||
msgid ""
|
||||
"A new statement was found, but no delimiter between it and the previous one."
|
||||
msgstr ""
|
||||
"একটি নতুন বিবৃতি পাওয়া গেছে, তবে এটি এবং পূর্ববর্তীটির মধ্যে কোনও বিভাজক "
|
||||
"নেই।"
|
||||
|
||||
#: src/Components/AlterOperation.php:290
|
||||
msgid "Missing comma before start of a new alter operation."
|
||||
msgstr "নতুন অল্টার অপারেশন শুরুর আগে কমা খুঁজে পাওয়া যায় নি।"
|
||||
|
||||
#: src/Components/AlterOperation.php:302
|
||||
msgid "Unrecognized alter operation."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/Array2d.php:86
|
||||
#, php-format
|
||||
msgid "%1$d values were expected, but found %2$d."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/Array2d.php:110
|
||||
msgid "An opening bracket followed by a set of values was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/ArrayObj.php:112 src/Components/CreateDefinition.php:230
|
||||
msgid "An opening bracket was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:136 src/Components/CaseExpression.php:164
|
||||
#: src/Components/CaseExpression.php:177 src/Components/CaseExpression.php:191
|
||||
#: src/Components/IndexHint.php:131 src/Components/IndexHint.php:160
|
||||
#: src/Components/LockExpression.php:171 src/Components/LockExpression.php:181
|
||||
#: src/Components/LockExpression.php:189 src/Statements/DeleteStatement.php:254
|
||||
#: src/Statements/DeleteStatement.php:269
|
||||
#: src/Statements/DeleteStatement.php:313
|
||||
#: src/Statements/DeleteStatement.php:325
|
||||
#: src/Statements/DeleteStatement.php:356
|
||||
#: src/Statements/DeleteStatement.php:367
|
||||
#: src/Statements/InsertStatement.php:189
|
||||
#: src/Statements/InsertStatement.php:217 src/Statements/LoadStatement.php:271
|
||||
#: src/Statements/LockStatement.php:86 src/Statements/ReplaceStatement.php:155
|
||||
#: src/Statements/ReplaceStatement.php:183
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected keyword."
|
||||
msgstr "%s লাইনে অপ্রত্যাশিত চিহ্ন।"
|
||||
|
||||
#: src/Components/CaseExpression.php:200
|
||||
msgid "Unexpected end of CASE expression"
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:225
|
||||
msgid "Potential duplicate alias of CASE expression."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:236
|
||||
msgid "An alias expected after AS but got "
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:248 src/Components/Expression.php:353
|
||||
#: src/Components/Expression.php:373 src/Components/Expression.php:408
|
||||
msgid "An alias was previously found."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CaseExpression.php:262
|
||||
#, fuzzy
|
||||
#| msgid "No databases selected."
|
||||
msgid "An alias was expected after AS."
|
||||
msgstr "ডাটাবেইজ নিবার্চন করা হয়নি।"
|
||||
|
||||
#: src/Components/CreateDefinition.php:252
|
||||
msgid ""
|
||||
"A symbol name was expected! A reserved keyword can not be used as a column "
|
||||
"name without backquotes."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/CreateDefinition.php:266
|
||||
#, fuzzy
|
||||
#| msgid "Table name template"
|
||||
msgid "A symbol name was expected!"
|
||||
msgstr "টেবলের নামের নকশা"
|
||||
|
||||
#: src/Components/CreateDefinition.php:301
|
||||
#, fuzzy
|
||||
#| msgid "No databases selected."
|
||||
msgid "A comma or a closing bracket was expected."
|
||||
msgstr "ডাটাবেইজ নিবার্চন করা হয়নি।"
|
||||
|
||||
#: src/Components/CreateDefinition.php:317
|
||||
msgid "A closing bracket was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/DataType.php:130
|
||||
msgid "Unrecognized data type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/ExpressionArray.php:101
|
||||
#, fuzzy
|
||||
#| msgid "No rows selected"
|
||||
msgid "An expression was expected."
|
||||
msgstr "কোন রো নির্বাচন করা হয় নাই"
|
||||
|
||||
#: src/Components/Expression.php:258 src/Components/Expression.php:420
|
||||
#, fuzzy
|
||||
#| msgid "No databases selected."
|
||||
msgid "An alias was expected."
|
||||
msgstr "ডাটাবেইজ নিবার্চন করা হয়নি।"
|
||||
|
||||
#: src/Components/Expression.php:387
|
||||
msgid "Unexpected dot."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/IndexHint.php:137 src/Components/IndexHint.php:166
|
||||
#: src/Components/LockExpression.php:159 src/Components/SetOperation.php:138
|
||||
#: src/Statement.php:247 src/Statements/DeleteStatement.php:278
|
||||
#: src/Statements/DeleteStatement.php:329
|
||||
#: src/Statements/InsertStatement.php:227
|
||||
#: src/Statements/InsertStatement.php:247 src/Statements/LoadStatement.php:274
|
||||
#: src/Statements/LoadStatement.php:302 src/Statements/LoadStatement.php:323
|
||||
#: src/Statements/LockStatement.php:93 src/Statements/LockStatement.php:99
|
||||
#: src/Statements/PurgeStatement.php:109 src/Statements/PurgeStatement.php:119
|
||||
#: src/Statements/PurgeStatement.php:139
|
||||
#: src/Statements/ReplaceStatement.php:192
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected token."
|
||||
msgstr "%s লাইনে অপ্রত্যাশিত চিহ্ন।"
|
||||
|
||||
#: src/Components/Limit.php:80 src/Components/Limit.php:108
|
||||
msgid "An offset was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/LockExpression.php:91
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of LOCK expression."
|
||||
msgstr "টেবিলের শুরুতে"
|
||||
|
||||
#: src/Components/LockExpression.php:199
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of Lock expression."
|
||||
msgstr "টেবিলের শুরুতে"
|
||||
|
||||
#: src/Components/OptionsArray.php:145
|
||||
#, php-format
|
||||
msgid "This option conflicts with \"%1$s\"."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:105
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The old name of the table was expected."
|
||||
msgstr "খোলা টেবিলের সংখ্যা।"
|
||||
|
||||
#: src/Components/RenameOperation.php:116
|
||||
msgid "Keyword \"TO\" was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Components/RenameOperation.php:132
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The new name of the table was expected."
|
||||
msgstr "খোলা টেবিলের সংখ্যা।"
|
||||
|
||||
#: src/Components/RenameOperation.php:151
|
||||
#, fuzzy
|
||||
#| msgid "The row has been deleted."
|
||||
msgid "A rename operation was expected."
|
||||
msgstr "রো টি মুছা হয়েছে।"
|
||||
|
||||
#: src/Components/SetOperation.php:121
|
||||
#, fuzzy
|
||||
#| msgid "as regular expression"
|
||||
msgid "Missing expression."
|
||||
msgstr "রেগুলার এক্সপ্রেশনের মত"
|
||||
|
||||
#: src/Lexer.php:244
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected character."
|
||||
msgstr "%s লাইনে অপ্রত্যাশিত চিহ্ন।"
|
||||
|
||||
#: src/Lexer.php:285
|
||||
msgid "Expected whitespace(s) before delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:303 src/Lexer.php:325
|
||||
msgid "Expected delimiter."
|
||||
msgstr ""
|
||||
|
||||
#: src/Lexer.php:909
|
||||
#, fuzzy, php-format
|
||||
#| msgid "Event %1$s has been created."
|
||||
msgid "Ending quote %1$s was expected."
|
||||
msgstr "ইভেন্ট %1$s তৈরী হয়েছে।"
|
||||
|
||||
#: src/Lexer.php:955
|
||||
#, fuzzy
|
||||
#| msgid "Table name template"
|
||||
msgid "Variable name was expected."
|
||||
msgstr "টেবলের নামের নকশা"
|
||||
|
||||
#: src/Parser.php:451
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected beginning of statement."
|
||||
msgstr "টেবিলের শুরুতে"
|
||||
|
||||
#: src/Parser.php:476
|
||||
msgid "Unrecognized statement type."
|
||||
msgstr ""
|
||||
|
||||
#: src/Parser.php:565
|
||||
msgid "No transaction was previously started."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:318
|
||||
msgid "This type of clause was previously parsed."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:396
|
||||
msgid "Unrecognized keyword."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statement.php:407
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Keyword at end of statement."
|
||||
msgstr "টেবিলের শুরুতে"
|
||||
|
||||
#: src/Statement.php:551
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected ordering of clauses."
|
||||
msgstr "টেবিলের শুরুতে"
|
||||
|
||||
#: src/Statements/CreateStatement.php:492
|
||||
#, fuzzy
|
||||
#| msgid "The number of tables that are open."
|
||||
msgid "The name of the entity was expected."
|
||||
msgstr "খোলা টেবিলের সংখ্যা।"
|
||||
|
||||
#: src/Statements/CreateStatement.php:542
|
||||
#, fuzzy
|
||||
#| msgid "Table name template"
|
||||
msgid "A table name was expected."
|
||||
msgstr "টেবলের নামের নকশা"
|
||||
|
||||
#: src/Statements/CreateStatement.php:550
|
||||
#, fuzzy
|
||||
#| msgid "The row has been deleted."
|
||||
msgid "At least one column definition was expected."
|
||||
msgstr "রো টি মুছা হয়েছে।"
|
||||
|
||||
#: src/Statements/CreateStatement.php:665
|
||||
msgid "A \"RETURNS\" keyword was expected."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/DeleteStatement.php:337
|
||||
msgid "This type of clause is not valid in Multi-table queries."
|
||||
msgstr ""
|
||||
|
||||
#: src/Statements/LockStatement.php:116
|
||||
#, fuzzy
|
||||
#| msgid "At Beginning of Table"
|
||||
msgid "Unexpected end of LOCK statement."
|
||||
msgstr "টেবিলের শুরুতে"
|
||||
|
||||
#: src/Statements/PurgeStatement.php:136
|
||||
#, fuzzy
|
||||
#| msgid "Unexpected characters on line %s."
|
||||
msgid "Unexpected keyword"
|
||||
msgstr "%s লাইনে অপ্রত্যাশিত চিহ্ন।"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "errors."
|
||||
#~ msgid "error #1"
|
||||
#~ msgstr "ভুলসমূহ"
|
||||
|
||||
#, fuzzy
|
||||
#~| msgid "Gather errors"
|
||||
#~ msgid "strict error"
|
||||
#~ msgstr "ভুলসমূহ জড়ো"
|
||||
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user