PageRenderTime 65ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/workflow/engine/classes/class.xmlDb.php

https://bitbucket.org/ferOnti/processmaker
PHP | 627 lines | 424 code | 23 blank | 180 comment | 46 complexity | 071239469344e561c12c17bac0a260bb MD5 | raw file
  1. <?php
  2. /**
  3. * class.xmlDb.php
  4. *
  5. * @package workflow.engine.ProcessMaker
  6. *
  7. * ProcessMaker Open Source Edition
  8. * Copyright (C) 2004 - 2011 Colosa Inc.
  9. *
  10. * This program is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU Affero General Public License as
  12. * published by the Free Software Foundation, either version 3 of the
  13. * License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU Affero General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Affero General Public License
  21. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. *
  23. * For more information, contact Colosa Inc, 2566 Le Jeune Rd.,
  24. * Coral Gables, FL, 33134, USA, or email info@colosa.com.
  25. *
  26. */
  27. /**
  28. * XMLDB
  29. *
  30. * ProcessMaker Open Source Edition
  31. *
  32. * @copyright (C) 2004 - 2008 Colosa Inc.23
  33. * @package workflow.engine.ProcessMaker
  34. *
  35. */
  36. class XMLDB
  37. {
  38. /**
  39. * &connect
  40. *
  41. * @param string $dsn
  42. * @return array $options
  43. */
  44. public function &connect ($dsn, $options = array())
  45. {
  46. //Needed for $mysql_real_escape_string
  47. $mresdbc = new DBConnection();
  48. if (! file_exists( $dsn )) {
  49. $err = new DB_Error( "File $dsn not found." );
  50. return $err;
  51. }
  52. $dbc = new XMLConnection( $dsn );
  53. return $dbc;
  54. }
  55. /**
  56. * isError
  57. *
  58. * @param string $result
  59. * @return boolean is_a($result, 'DB_Error')
  60. */
  61. public function isError ($result)
  62. {
  63. return is_a( $result, 'DB_Error' );
  64. }
  65. }
  66. /**
  67. * XMLConnection
  68. *
  69. * ProcessMaker Open Source Edition
  70. *
  71. * @copyright (C) 2004 - 2008 Colosa Inc.23
  72. * @package workflow.engine.ProcessMaker
  73. *
  74. */
  75. class XMLConnection
  76. {
  77. var $phptype = 'myxml';
  78. var $caseFolding = true;
  79. var $xmldoc = null;
  80. var $xmlFile = '';
  81. /**
  82. * XMLConnection
  83. *
  84. * @param string $file
  85. * @return void
  86. */
  87. public function XMLConnection ($file)
  88. {
  89. $this->xmldoc = new Xml_Document();
  90. $this->xmldoc->parseXmlFile( $file );
  91. $this->xmlFile = $file;
  92. }
  93. /**
  94. * &query
  95. * Actualy the only one supported query is simple SELECT.
  96. *
  97. * @param string $sql
  98. * @return object(XMLResult) $result
  99. */
  100. public function &query ($sql)
  101. {
  102. if (! isset( $this->xmldoc )) {
  103. $err = new DB_Error( "Error: Closed xmlConnection." );
  104. return $err;
  105. }
  106. if (1 === preg_match( '/^\s*SELECT\s+([\w\W]+?)(?:\s+FROM\s+`?([^`]+?)`?)(?:\s+WHERE\s+([\w\W]+?))?(?:\s+GROUP\s+BY\s+([\w\W]+?))?(?:\s+ORDER\s+BY\s+([\w\W]+?))?(?:\s+BETWEEN\s+([\w\W]+?)\s+AND\s+([\w\W]+?))?(?:\s+LIMIT\s+(\d+)\s*,\s*(\d+))?\s*$/im', $sql, $matches )) {
  107. $sqlColumns = $matches[1];
  108. $sqlFrom = isset( $matches[2] ) ? $matches[2] : '';
  109. $sqlWhere = isset( $matches[3] ) ? $matches[3] : '';
  110. $sqlGroupBy = isset( $matches[4] ) ? $matches[4] : '';
  111. $sqlOrderBy = isset( $matches[5] ) ? $matches[5] : '';
  112. $sqlLowLimit = isset( $matches[8] ) ? $matches[8] : '';
  113. $sqlHighLimit = isset( $matches[9] ) ? $matches[9] : '';
  114. /* Start Block: Fields list */
  115. $count = preg_match_all( '/\s*(\*|[\w\.]+)(?:\s+AS\s+([\w\.]+))?/im', $sqlColumns, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE );
  116. $fieldsList = array ();
  117. for ($r = 0; $r < $count; $r ++) {
  118. $name = (is_array( $match[2][$r] ) && $match[2][$r][0] !== '') ? $match[2][$r][0] : $match[1][$r][0];
  119. $fieldsList[$name] = $match[1][$r][0];
  120. }
  121. /* End Block */
  122. /* Start Block: Order list */
  123. $count = preg_match_all( '/\s*(\*|[\w\.]+)(\s+ASC|\s+DESC)?\s*,?/im', $sqlOrderBy, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE );
  124. $orderList = array ();
  125. for ($r = $count - 1; $r >= 0; $r --) {
  126. $direction = (is_array( $match[2][$r] ) && $match[2][$r][0] !== '') ? $match[2][$r][0] : 'ASC';
  127. $direction = strtoupper( $direction );
  128. $orderList[$match[1][$r][0]] = $direction;
  129. }
  130. /* End Block */
  131. $xmlFrom = '/' . str_replace( '.', '/', $sqlFrom );
  132. $node = & $this->xmldoc->findNode( $xmlFrom );
  133. if (! isset( $node )) {
  134. //$err = new DB_Error( "$xmlFrom node not found in $dsn." );
  135. throw new Exception( "$xmlFrom node not found in " . $this->xmlFile . "." );
  136. return $err;
  137. } else {
  138. $res = $this->fetchChildren( $node );
  139. }
  140. /* Start Block: WHERE*/
  141. if ($sqlWhere !== '') {
  142. /*Start Block: Replace the operator */
  143. $blocks = preg_split( '/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', $sqlWhere, - 1, PREG_SPLIT_DELIM_CAPTURE );
  144. $sqlWhere = '';
  145. for ($r = 0; $r < sizeof( $blocks ); $r ++) {
  146. if (($r % 2) === 0) {
  147. $blocks[$r] = str_replace( '=', '==', $blocks[$r] );
  148. $blocks[$r] = str_replace( '<>', '!=', $blocks[$r] );
  149. $blocks[$r] = str_replace( 'AND', '&&', $blocks[$r] );
  150. $blocks[$r] = str_replace( 'and', '&&', $blocks[$r] );
  151. $blocks[$r] = str_replace( 'OR', '||', $blocks[$r] );
  152. $blocks[$r] = str_replace( 'or', '||', $blocks[$r] );
  153. $blocks[$r] = str_replace( 'NOT', '!', $blocks[$r] );
  154. $blocks[$r] = str_replace( 'not', '!', $blocks[$r] );
  155. $blocks[$r] = preg_replace( '/\b[a-zA-Z_][\w\.]*\b/im', '$res[$r][\'$0\']', $blocks[$r] );
  156. $blocks[$r] = preg_replace( '/\$res\[\$r\]\[\'(like)\'\]/im', '$1', $blocks[$r] );
  157. }
  158. $sqlWhere .= $blocks[$r];
  159. }
  160. $sqlWhere = preg_replace_callback( '/(.+)\s+like\s+("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', array ('XMLConnection','sqlWhereLike'
  161. ), $sqlWhere );
  162. $sqlWhere = preg_replace_callback( '/"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'/im', array ('XMLConnection','sqlString'
  163. ), $sqlWhere );
  164. $newRes = array ();
  165. for ($r = 0; $r < sizeof( $res ); $r ++) {
  166. $evalWhere = false;
  167. @eval( '$evalWhere = ' . $sqlWhere . ';' );
  168. if ($evalWhere) {
  169. $newRes[] = $res[$r];
  170. }
  171. }
  172. $res = $newRes;
  173. }
  174. /* End Block */
  175. /* Start Block: Expands the resultant data according to fill an array
  176. * with the required fields in the query.
  177. */
  178. for ($r = 0; $r < sizeof( $res ); $r ++) {
  179. $res[$r] = $this->expandFields( $res[$r], $fieldsList );
  180. }
  181. /* End Block */
  182. /* Start Block: ORDER BY*/
  183. foreach ($orderList as $field => $direction) {
  184. for ($i = 0; $i < sizeof( $res ); $i ++) {
  185. for ($j = $i + 1; $j < sizeof( $res ); $j ++) {
  186. $condition = ($direction === 'ASC') ? ($res[$j] < $res[$i]) : ($res[$j] > $res[$i]);
  187. if ($condition) {
  188. $swap = $res[$i];
  189. $res[$i] = $res[$j];
  190. $res[$j] = $swap;
  191. }
  192. }
  193. }
  194. }
  195. /* End Block */
  196. /* Start Block: Apply limits */
  197. if ($sqlLowLimit != '' && $sqlHighLimit != '') {
  198. $sqlLowLimit = (int) $sqlLowLimit;
  199. $sqlHighLimit = (int) $sqlHighLimit;
  200. $res = array_slice( $res, $sqlLowLimit, $sqlHighLimit );
  201. }
  202. /* End Block */
  203. $result = new XMLResult( $res );
  204. return $result;
  205. } elseif (1 === preg_match( '/^\s*DELETE\s+FROM\s+`?([^`]+?)`?(?:\s+WHERE\s+([\w\W]+?))?\s*$/im', $sql, $matches )) {
  206. $sqlFrom = isset( $matches[1] ) ? $matches[1] : '';
  207. $sqlWhere = isset( $matches[2] ) ? $matches[2] : '1';
  208. /* Start Block: WHERE*/
  209. /*Start Block: Replace the operator */
  210. $blocks = preg_split( '/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', $sqlWhere, - 1, PREG_SPLIT_DELIM_CAPTURE );
  211. $sqlWhere = '';
  212. for ($r = 0; $r < sizeof( $blocks ); $r ++) {
  213. if (($r % 2) === 0) {
  214. $blocks[$r] = str_replace( '=', '==', $blocks[$r] );
  215. $blocks[$r] = str_replace( '<>', '!=', $blocks[$r] );
  216. $blocks[$r] = str_replace( 'AND', '&&', $blocks[$r] );
  217. $blocks[$r] = str_replace( 'and', '&&', $blocks[$r] );
  218. $blocks[$r] = str_replace( 'OR', '||', $blocks[$r] );
  219. $blocks[$r] = str_replace( 'or', '||', $blocks[$r] );
  220. $blocks[$r] = str_replace( 'NOT', '!', $blocks[$r] );
  221. $blocks[$r] = str_replace( 'not', '!', $blocks[$r] );
  222. $blocks[$r] = preg_replace( '/\b[a-zA-Z_][\w\.]*\b/im', '$res[$r][\'$0\']', $blocks[$r] );
  223. $blocks[$r] = preg_replace( '/\$res\[\$r\]\[\'(like)\'\]/im', '$1', $blocks[$r] );
  224. }
  225. $sqlWhere .= $blocks[$r];
  226. }
  227. /* End Block */
  228. $sqlWhere = preg_replace_callback( '/(.+)\s+like\s+("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', array ('XMLConnection','sqlWhereLike'
  229. ), $sqlWhere );
  230. $sqlWhere = preg_replace_callback( '/"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'/im', array ('XMLConnection','sqlString'
  231. ), $sqlWhere );
  232. /*Start Block: Removing fields */
  233. $xmlFrom = '/' . str_replace( '.', '/', $sqlFrom );
  234. $node = & $this->xmldoc->findNode( $xmlFrom );
  235. if (! isset( $node )) {
  236. $err = new DB_Error( "$xmlFrom node not found!." );
  237. return $err;
  238. } else {
  239. $res = $this->fetchChildren( $node );
  240. }
  241. $newRes = array ();
  242. for ($r = 0; $r < sizeof( $res ); $r ++) {
  243. $evalWhere = false;
  244. @eval( '$evalWhere = ' . $sqlWhere . ';' );
  245. if ($evalWhere) {
  246. unset( $node->children[$r] );
  247. $newRes[] = $res[$r];
  248. }
  249. }
  250. //Re-index
  251. $node->children = array_values( $node->children );
  252. /* End Block */
  253. $this->xmldoc->save( $this->xmlFile );
  254. $result = new XMLResult( $newRes );
  255. return $result;
  256. } elseif (1 === preg_match( '/^\s*INSERT\s+INTO\s+`?([^`]+?)`?\s*\(([\w\W]+?)\)\s+VALUES\s*\(([\w\W]+?)\)\s*$/im', $sql, $matches )) {
  257. $sqlFrom = isset( $matches[1] ) ? $matches[1] : '';
  258. $sqlColumns = isset( $matches[2] ) ? $matches[2] : '1';
  259. $sqlValues = isset( $matches[3] ) ? $matches[3] : '1';
  260. $xmlFrom = '/' . str_replace( '.', '/', $sqlFrom );
  261. $node = & $this->xmldoc->findNode( $xmlFrom );
  262. /* Start Block: Fields list */
  263. $count = preg_match_all( '/([\w\.]+)/im', $sqlColumns, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE );
  264. $fieldsList = array ();
  265. for ($r = 0; $r < $count; $r ++) {
  266. $fieldsList[] = $match[1][$r][0];
  267. }
  268. /* End Block */
  269. /* Start Block: Fields Values */
  270. $count = preg_match_all( '/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'|\d+)/im', $sqlValues, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE );
  271. $fieldsValues = array ();
  272. for ($r = 0; $r < $count; $r ++) {
  273. if (substr( $match[1][$r][0], 0, 1 ) === '"') {
  274. $match[1][$r][0] = substr( $match[1][$r][0], 1, - 1 );
  275. $match[1][$r][0] = str_replace( '""', '"', $match[1][$r][0] );
  276. $match[1][$r][0] = str_replace( "''", "'", $match[1][$r][0] );
  277. }
  278. if (substr( $match[1][$r][0], 0, 1 ) === "'") {
  279. $match[1][$r][0] = substr( $match[1][$r][0], 1, - 1 );
  280. $match[1][$r][0] = str_replace( "''", "'", $match[1][$r][0] );
  281. $match[1][$r][0] = str_replace( '""', '"', $match[1][$r][0] );
  282. }
  283. $fieldsValues[$fieldsList[$r]] = $match[1][$r][0];
  284. }
  285. /* End Block */
  286. $AAA = getNames( $this->xmldoc->children[0]->children );
  287. $this->insertRow( $node, $fieldsValues );
  288. $DDD = getNames( $this->xmldoc->children[0]->children );
  289. $this->xmldoc->save( $this->xmlFile );
  290. $result = new XMLResult( array ($fieldsValues
  291. ) );
  292. return $result;
  293. } elseif (1 === preg_match( '/^\s*UPDATE\s+`?([^`]+?)`?\s+SET\s+((?:(?:[a-z][\w\.]*)\s*=\s*(?:"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'|\d+)\s*(?:,\s*)?)+)(?:\s+WHERE\s+([\w\W]+?))?\s*$/im', $sql, $matches )) {
  294. $sqlFrom = isset( $matches[1] ) ? $matches[1] : '';
  295. $sqlColumns = isset( $matches[2] ) ? $matches[2] : '';
  296. $sqlWhere = isset( $matches[3] ) ? $matches[3] : '1';
  297. $count = preg_match_all( '/([a-z][\w\.]*)\s*=\s*("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'|\d+)/im', $sqlColumns, $match, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE );
  298. $fieldsValues = array ();
  299. for ($r = 0; $r < $count; $r ++) {
  300. if (substr( $match[2][$r][0], 0, 1 ) === '"') {
  301. $match[2][$r][0] = substr( $match[2][$r][0], 1, - 1 );
  302. $match[2][$r][0] = str_replace( '""', '"', $match[2][$r][0] );
  303. $match[2][$r][0] = str_replace( "''", "'", $match[2][$r][0] );
  304. }
  305. if (substr( $match[2][$r][0], 0, 1 ) === "'") {
  306. $match[2][$r][0] = substr( $match[2][$r][0], 1, - 1 );
  307. $match[2][$r][0] = str_replace( "''", "'", $match[2][$r][0] );
  308. $match[2][$r][0] = str_replace( '""', '"', $match[2][$r][0] );
  309. }
  310. $fieldsValues[$match[1][$r][0]] = $match[2][$r][0];
  311. }
  312. /* Start Block: WHERE*/
  313. /*Start Block: Replace the operator */
  314. $blocks = preg_split( '/("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', $sqlWhere, - 1, PREG_SPLIT_DELIM_CAPTURE );
  315. $sqlWhere = '';
  316. for ($r = 0; $r < sizeof( $blocks ); $r ++) {
  317. if (($r % 2) === 0) {
  318. $blocks[$r] = str_replace( '=', '==', $blocks[$r] );
  319. $blocks[$r] = str_replace( '<>', '!=', $blocks[$r] );
  320. $blocks[$r] = str_replace( 'AND', '&&', $blocks[$r] );
  321. $blocks[$r] = str_replace( 'and', '&&', $blocks[$r] );
  322. $blocks[$r] = str_replace( 'OR', '||', $blocks[$r] );
  323. $blocks[$r] = str_replace( 'or', '||', $blocks[$r] );
  324. $blocks[$r] = str_replace( 'NOT', '!', $blocks[$r] );
  325. $blocks[$r] = str_replace( 'not', '!', $blocks[$r] );
  326. $blocks[$r] = preg_replace( '/\b[a-zA-Z_][\w\.]*\b/im', '$res[$r][\'$0\']', $blocks[$r] );
  327. $blocks[$r] = preg_replace( '/\$res\[\$r\]\[\'(like)\'\]/im', '$1', $blocks[$r] );
  328. }
  329. $sqlWhere .= $blocks[$r];
  330. }
  331. /* End Block */
  332. $sqlWhere = preg_replace_callback( '/(.+)\s+like\s+("(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\')/im', array ('XMLConnection','sqlWhereLike'
  333. ), $sqlWhere );
  334. $sqlWhere = preg_replace_callback( '/"(?:(?:[^"]|"")*)"|\'(?:(?:[^\']|\'\')*)\'/im', array ('XMLConnection','sqlString'
  335. ), $sqlWhere );
  336. /*Start Block: Removing fields */
  337. $xmlFrom = '/' . str_replace( '.', '/', $sqlFrom );
  338. $node = & $this->xmldoc->findNode( $xmlFrom );
  339. if (! isset( $node )) {
  340. $err = new DB_Error( "$xmlFrom node not found in $dsn." );
  341. return $err;
  342. } else {
  343. $res = $this->fetchChildren( $node );
  344. }
  345. $newRes = array ();
  346. for ($r = 0; $r < sizeof( $res ); $r ++) {
  347. $evalWhere = false;
  348. @eval( '$evalWhere = ' . $sqlWhere . ';' );
  349. if ($evalWhere) {
  350. $this->updateRow( $node->children[$r], $fieldsValues );
  351. $newRes[] = array_merge( $res[$r], $fieldsValues );
  352. }
  353. }
  354. /* End Block */
  355. $nodeTEST = & $this->xmldoc->findNode( $xmlFrom );
  356. $this->xmldoc->save( $this->xmlFile );
  357. $result = new XMLResult( $newRes );
  358. return $result;
  359. } else {
  360. echo ($sql);
  361. $err = new DB_Error( "SQL Query is not well formed." );
  362. return $err;
  363. }
  364. }
  365. /**
  366. * sqlLike
  367. *
  368. * @param string $a
  369. * @return void $b
  370. */
  371. public function sqlLike ($a, $b)
  372. {
  373. $b = addcslashes( $b, '[]()\/{}.?' );
  374. $b = str_replace( "%", '.*', $b );
  375. $b = '/^' . $b . '$/im';
  376. return preg_match( $b, $a );
  377. }
  378. /**
  379. * expandFields
  380. *
  381. * @param string $resRow
  382. * @param string $fieldsList
  383. * @return array $res
  384. */
  385. public function expandFields ($resRow, $fieldsList)
  386. {
  387. $res = array ();
  388. foreach ($fieldsList as $key => $value) {
  389. if ($key === '*') {
  390. foreach ($resRow as $k => $v) {
  391. $res[$k] = $v;
  392. }
  393. } else {
  394. $res[$key] = array_key_exists( $value, $resRow ) ? $resRow[$value] : null;
  395. }
  396. }
  397. return $res;
  398. }
  399. /**
  400. * fetchNode
  401. *
  402. * @param object &$node
  403. * @return array $res
  404. */
  405. public function fetchNode (&$node)
  406. {
  407. $res = array ('XMLNODE_NAME' => $node->name,'XMLNODE_TYPE' => $node->type,'XMLNODE_VALUE' => $node->value
  408. );
  409. foreach ($node->attributes as $name => $value) {
  410. if ($this->caseFolding) {
  411. $name = strtoupper( $name );
  412. }
  413. $res[$name] = $value;
  414. }
  415. return $res;
  416. }
  417. /**
  418. * fetchChildren
  419. *
  420. * @param string &$node
  421. * @return array $res
  422. */
  423. public function fetchChildren (&$node)
  424. {
  425. $res = array ();
  426. foreach ($node->children as $name => $child) {
  427. $res[] = $this->fetchNode( $child );
  428. }
  429. return $res;
  430. }
  431. /**
  432. * disconnect
  433. *
  434. * @return void
  435. */
  436. public function disconnect ()
  437. {
  438. unset( $this->xmldoc );
  439. }
  440. /**
  441. *
  442. * @param array $match
  443. * @return object(DB_Error) $err
  444. */
  445. public function sqlWhereLike ($match)
  446. {
  447. switch (substr( $match[2], 0, 1 )) {
  448. case '"':
  449. return ' $this->sqlLike( ' . $match[1] . ', ' . $match[2] . ' ) ';
  450. break;
  451. case "'":
  452. return ' $this->sqlLike( ' . $match[1] . ', ' . $match[2] . ' ) ';
  453. break;
  454. default:
  455. $err = new DB_Error( "XMLDB: Syntax error on $match[0]" );
  456. die();
  457. return $err;
  458. }
  459. }
  460. /**
  461. * sqlString
  462. *
  463. * @param array $match
  464. * @return object(DB_Error) $err
  465. */
  466. public function sqlString ($match)
  467. {
  468. switch (substr( $match[0], 0, 1 )) {
  469. case '"':
  470. $match[0] = substr( $match[0], 1, - 1 );
  471. $match[0] = str_replace( '""', '"', $match[0] );
  472. $match[0] = str_replace( "''", "'", $match[0] );
  473. $match[0] = addcslashes( $match[0], '\\\'' );
  474. return "'$match[0]'";
  475. break;
  476. case "'":
  477. $match[0] = substr( $match[0], 1, - 1 );
  478. $match[0] = str_replace( "''", "'", $match[0] );
  479. $match[0] = str_replace( '""', '"', $match[0] );
  480. $match[0] = addcslashes( $match[0], '\\\'' );
  481. return "'$match[0]'";
  482. break;
  483. default:
  484. $err = new DB_Error( "XMLDB: Syntax error on $match[0]" );
  485. die();
  486. return $err;
  487. }
  488. }
  489. /**
  490. * insertRow
  491. *
  492. * @param string &$node
  493. * @param object $values
  494. * @return void
  495. */
  496. public function insertRow (&$node, $values)
  497. {
  498. $attributes = array ();
  499. foreach ($values as $field => $value) {
  500. switch ($field) {
  501. case 'XMLNODE_NAME':
  502. case 'XMLNODE_TYPE':
  503. case 'XMLNODE_VALUE':
  504. break;
  505. default:
  506. $attributes[strtolower( $field )] = $value;
  507. }
  508. }
  509. $values['XMLNODE_NAME'] = ! isset( $values['XMLNODE_NAME'] ) ? '' : $values['XMLNODE_NAME'];
  510. $values['XMLNODE_TYPE'] = ! isset( $values['XMLNODE_TYPE'] ) ? 'open' : $values['XMLNODE_TYPE'];
  511. $values['XMLNODE_VALUE'] = ! isset( $values['XMLNODE_VALUE'] ) ? '' : $values['XMLNODE_VALUE'];
  512. $node->addChildNode( new Xml_Node( $values['XMLNODE_NAME'], $values['XMLNODE_TYPE'], $values['XMLNODE_VALUE'], $attributes ) );
  513. }
  514. /**
  515. * updateRow
  516. *
  517. * @param string &$node
  518. * @param object $values
  519. * @return void
  520. */
  521. public function updateRow (&$node, $values)
  522. {
  523. foreach ($values as $field => $value) {
  524. switch ($field) {
  525. case 'XMLNODE_NAME':
  526. $node->name = $value;
  527. break;
  528. case 'XMLNODE_TYPE':
  529. $node->type = $value;
  530. break;
  531. case 'XMLNODE_VALUE':
  532. $node->value = $value;
  533. break;
  534. default:
  535. $node->attributes[strtolower( $field )] = $value;
  536. }
  537. }
  538. }
  539. }
  540. /**
  541. * XMLResult
  542. *
  543. * ProcessMaker Open Source Edition
  544. *
  545. * @copyright (C) 2004 - 2008 Colosa Inc.23
  546. * @package workflow.engine.ProcessMaker
  547. *
  548. */
  549. class XMLResult
  550. {
  551. var $result = array ();
  552. var $cursor = 0;
  553. /**
  554. * XMLResult
  555. *
  556. * @param array $result
  557. * @return void
  558. */
  559. public function XMLResult ($result = array())
  560. {
  561. $this->result = $result;
  562. $this->cursor = 0;
  563. }
  564. /**
  565. * numRows
  566. *
  567. * @return integer sizeof($this->result)
  568. */
  569. public function numRows ()
  570. {
  571. return sizeof( $this->result );
  572. }
  573. /**
  574. * fetchRow
  575. *
  576. * @param string $const
  577. * @return integer $this->result[ $this->cursor-1 ];
  578. */
  579. public function fetchRow ($const)
  580. {
  581. if ($this->cursor >= $this->numRows()) {
  582. return null;
  583. }
  584. $this->cursor ++;
  585. return $this->result[$this->cursor - 1];
  586. }
  587. }
  588. /**
  589. * getNames
  590. *
  591. * @param object $children
  592. * @return array $names
  593. */
  594. function getNames ($children)
  595. {
  596. $names = array ();
  597. $r = 0;
  598. foreach ($children as $child) {
  599. $names[$r] = $child->name;
  600. $r ++;
  601. }
  602. return $names;
  603. }