Merge branch 'master' into cyy_ops_test

This commit is contained in:
caoyanyi
2022-08-26 13:45:28 +08:00
2720 changed files with 361624 additions and 8879 deletions
+17 -1
View File
@@ -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
+1 -1
View File
@@ -1 +1 @@
17.4
17.6
+4 -5
View File
@@ -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;
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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');
+1 -1
View File
@@ -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'));
}
/**
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -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
View File
@@ -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');
+5 -3
View File
@@ -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');
+1 -1
View File
@@ -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']))
-12
View File
@@ -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
View File
@@ -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.
+1
View File
@@ -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();
+9
View File
@@ -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
View File
@@ -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
View File
@@ -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
+62
View File
@@ -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;
+264
View File
@@ -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
View File
File diff suppressed because it is too large Load Diff
+288
View File
@@ -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>
+5 -2
View File
@@ -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);
+3 -1
View File
@@ -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 -1
View File
@@ -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>
+18 -20
View File
@@ -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&currentModuleID=0&branch=$branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='90%'");
echo '&nbsp; ';
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>
+49 -10
View File
@@ -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&currentModuleID=0&branch=$story->branch", '', true), $lang->tree->manage, '', "class='text-primary' data-toggle='modal' data-type='iframe' data-width='95%'");
echo '&nbsp; ';
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'):?>
+29 -4
View File
@@ -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> &nbsp;'; }?></td>
<td>
<?php
if(!empty($story->mailto))
{
foreach(explode(',', $story->mailto) as $account)
{
if(empty($account)) continue;
echo "<span>" . zget($users, trim($account)) . '</span> &nbsp;';
}
}
?>
</td>
</tr>
</tbody>
</table>
+1 -1
View File
@@ -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;?>
+6 -5
View File
@@ -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
View File
@@ -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();
+6 -12
View File
@@ -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;
}
/**
+21 -3
View File
@@ -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>";
-10
View File
@@ -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);
}
}
/**
+8 -8
View File
@@ -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
*/
+1
View File
@@ -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("'", '&#039;', $value);
$autocomplete = $autocomplete ? 'autocomplete="on"' : 'autocomplete="off"';
return "<input type='text' name='$name' {$id} value='$value' $attrib $autocomplete />\n";
+136 -136
View File
@@ -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;
+18
View File
@@ -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");
}
}
+2 -1
View File
@@ -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;
+29
View File
@@ -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";
}
}
+53
View File
@@ -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
View File
@@ -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);
}
}
+30
View File
@@ -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';
}
}
+11
View File
@@ -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;
}
}
+7
View File
@@ -0,0 +1,7 @@
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitea8a35d9469bbaa4fe54772aaf0cb8ae::getLoader();
+117
View File
@@ -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';
+5
View File
@@ -0,0 +1,5 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/highlight-query
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
php "%BIN_TARGET%" %*
+117
View File
@@ -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
View File
@@ -0,0 +1,5 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/lint-query
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
php "%BIN_TARGET%" %*
+117
View File
@@ -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
View File
@@ -0,0 +1,5 @@
@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/tokenize-query
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
php "%BIN_TARGET%" %*
+572
View File
@@ -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
View File
@@ -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
View File
@@ -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.
+10
View File
@@ -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',
);
+10
View File
@@ -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',
);
+9
View File
@@ -0,0 +1,9 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
);
+11
View File
@@ -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
View File
@@ -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;
}
}
+48
View 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
View File
@@ -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
View File
@@ -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,
),
),
);
+26
View File
@@ -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
);
}
+489
View File
@@ -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
```
+339
View File
@@ -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.
+137
View File
@@ -0,0 +1,137 @@
# SQL Parser
A validating SQL lexer and parser with a focus on MySQL dialect.
## Code status
![Tests](https://github.com/phpmyadmin/sql-parser/workflows/Run%20tests/badge.svg?branch=master)
[![Code Coverage](https://scrutinizer-ci.com/g/phpmyadmin/sql-parser/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/phpmyadmin/sql-parser/?branch=master)
[![codecov.io](https://codecov.io/github/phpmyadmin/sql-parser/coverage.svg?branch=master)](https://codecov.io/github/phpmyadmin/sql-parser?branch=master)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/phpmyadmin/sql-parser/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/phpmyadmin/sql-parser/?branch=master)
[![Translation status](https://hosted.weblate.org/widgets/phpmyadmin/-/svg-badge.svg)](https://hosted.weblate.org/engage/phpmyadmin/?utm_source=widget)
[![Packagist](https://img.shields.io/packagist/dt/phpmyadmin/sql-parser.svg)](https://packagist.org/packages/phpmyadmin/sql-parser)
[![Open Source Helpers](https://www.codetriage.com/phpmyadmin/sql-parser/badges/users.svg)](https://www.codetriage.com/phpmyadmin/sql-parser)
[![Type coverage](https://shepherd.dev/github/phpmyadmin/sql-parser/coverage.svg)](https://shepherd.dev/github/phpmyadmin/sql-parser)
[![Infection MSI](https://badge.stryker-mutator.io/github.com/phpmyadmin/sql-parser/master)](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
}
}
@@ -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"
@@ -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 "خطأ صارم"
@@ -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."
@@ -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ı"
@@ -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 "недапушчальная памылка"
@@ -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"
@@ -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 "Събиране на грешки"
@@ -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 "ভুলসমূহ জড়ো"

Some files were not shown because too many files have changed in this diff Show More