00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00092 require_once(PATH_t3lib.'class.t3lib_sqlparser.php');
00093
00094
00104 class t3lib_sqlengine extends t3lib_sqlparser {
00105
00106
00107 var $data = array();
00108
00109
00110
00111 var $errorStatus = '';
00112 var $lastInsertedId = 0;
00113 var $lastAffectedRows = 0;
00114
00115
00116
00117
00118
00126 function init($config, &$pObj) {
00127 }
00128
00134 function resetStatusVars() {
00135 $this->errorStatus = '';
00136 $this->lastInsertedId = 0;
00137 $this->lastAffectedRows = 0;
00138 }
00139
00150 function processAccordingToConfig(&$value,$fInfo) {
00151 $options = $this->parseFieldDef($fInfo['Type']);
00152
00153 switch(strtolower($options['fieldType'])) {
00154 case 'int':
00155 case 'smallint':
00156 case 'tinyint':
00157 case 'mediumint':
00158 $value = intval($value);
00159 if ($options['featureIndex']['UNSIGNED']) {
00160 $value = t3lib_div::intInRange($value,0);
00161 }
00162 break;
00163 case 'double':
00164 $value = (double)$value;
00165 break;
00166 case 'varchar':
00167 case 'char':
00168 $value = substr($value,0,trim($options['value']));
00169 break;
00170 case 'text':
00171 case 'blob':
00172 $value = substr($value,0,65536);
00173 break;
00174 case 'tinytext':
00175 case 'tinyblob':
00176 $value = substr($value,0,256);
00177 break;
00178 case 'mediumtext':
00179 case 'mediumblob':
00180
00181 break;
00182 }
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00205 function exec_INSERTquery($table,$fields_values) {
00206
00207
00208 $this->resetStatusVars();
00209
00210
00211 $this->readDataSource($table);
00212
00213
00214 if (is_array($this->data[$table])) {
00215
00216 $fieldInformation = $this->admin_get_fields($table);
00217
00218
00219 $saveArray = array();
00220 foreach($fieldInformation as $fInfo) {
00221
00222
00223 $fN = $fInfo['Field'];
00224
00225
00226
00227 $saveArray[$fN] = isset($fields_values[$fN]) ? $fields_values[$fN] : $options['Default'];
00228
00229
00230 $this->processAccordingToConfig($saveArray[$fN], $fInfo);
00231
00232
00233 if ($fInfo['Extra'] == 'auto_increment') {
00234
00235
00236 $uidArray = array();
00237 foreach($this->data[$table] as $r) {
00238 $uidArray[] = $r[$fN];
00239 }
00240
00241
00242 if (!$saveArray[$fN] || in_array(intval($saveArray[$fN]), $uidArray)) {
00243 if (count($uidArray)) {
00244 $saveArray[$fN] = max($uidArray)+1;
00245 } else $saveArray[$fN] = 1;
00246 }
00247
00248
00249 $this->lastInsertedId = $saveArray[$fN];
00250 }
00251 }
00252
00253
00254 $this->data[$table][] = $saveArray;
00255
00256
00257 $this->saveDataSource($table);
00258
00259 return TRUE;
00260 } else $this->errorStatus = 'No data loaded.';
00261
00262 return FALSE;
00263 }
00264
00273 function exec_UPDATEquery($table,$where,$fields_values) {
00274
00275
00276 $this->resetStatusVars();
00277
00278
00279 $this->readDataSource($table);
00280
00281
00282 if (is_array($this->data[$table])) {
00283
00284
00285 $where = $this->parseWhereClause($where);
00286
00287 if (is_array($where)) {
00288
00289
00290 $fieldInformation = $this->admin_get_fields($table);
00291
00292
00293 foreach($fields_values as $fName => $fValue) {
00294 $this->processAccordingToConfig($fields_values[$fName],$fieldInformation[$fName]);
00295 }
00296
00297
00298 $itemKeys = $this->selectFromData($table,$where);
00299
00300
00301 $this->lastAffectedRows = count($itemKeys);
00302
00303
00304 if ($this->lastAffectedRows) {
00305
00306 foreach($itemKeys as $dataArrayKey) {
00307
00308
00309 foreach($fields_values as $fName => $fValue) {
00310 $this->data[$table][$dataArrayKey][$fName] = $fValue;
00311 }
00312 }
00313
00314
00315 $this->saveDataSource($table);
00316 }
00317
00318 return TRUE;
00319 } else $this->errorStatus = 'WHERE clause contained errors: '.$where;
00320 } else $this->errorStatus = 'No data loaded.';
00321
00322 return FALSE;
00323 }
00324
00332 function exec_DELETEquery($table,$where) {
00333
00334
00335 $this->resetStatusVars();
00336
00337
00338 $this->readDataSource($table);
00339
00340
00341 if (is_array($this->data[$table])) {
00342
00343
00344 $where = $this->parseWhereClause($where);
00345
00346 if (is_array($where)) {
00347
00348
00349 $itemKeys = $this->selectFromData($table,$where);
00350
00351
00352 $this->lastAffectedRows = count($itemKeys);
00353
00354
00355 if ($this->lastAffectedRows) {
00356
00357 foreach($itemKeys as $dataArrayKey) {
00358 unset($this->data[$table][$dataArrayKey]);
00359 }
00360
00361
00362 $this->saveDataSource($table);
00363 }
00364
00365 return TRUE;
00366 } else $this->errorStatus = 'WHERE clause contained errors: '.$where;
00367 } else $this->errorStatus = 'No data loaded.';
00368
00369 return FALSE;
00370 }
00371
00383 function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit) {
00384
00385
00386 $this->resetStatusVars();
00387
00388
00389 $sqlObj = t3lib_div::makeInstance('t3lib_sqlengine_resultobj');
00390 $sqlObj->result = array();
00391
00392
00393 $tableArray = $this->parseFromTables($from_table);
00394 $table = $tableArray[0]['table'];
00395
00396
00397 $this->readDataSource($table);
00398
00399
00400 if (is_array($this->data[$table])) {
00401
00402
00403 $where = $this->parseWhereClause($where_clause);
00404 if (is_array($where)) {
00405
00406
00407 $itemKeys = $this->selectFromData($table,$where);
00408
00409
00410 $sqlObj->result = $this->getResultSet($itemKeys,$table,'*');
00411
00412 reset($sqlObj->result);
00413 return $sqlObj;
00414 } else $this->errorStatus = 'WHERE clause contained errors: '.$where;
00415 } else $this->errorStatus = 'No data loaded: '.$this->errorStatus;
00416
00417 return FALSE;
00418 }
00419
00426 function sql_query($query) {
00427 $res = t3lib_div::makeInstance('t3lib_sqlengine_resultobj');
00428 $res->result = array();
00429 return $res;
00430 }
00431
00437 function sql_error() {
00438 return $this->errorStatus;
00439 }
00440
00446 function sql_insert_id() {
00447 return $this->lastInsertedId;
00448 }
00449
00455 function sql_affected_rows() {
00456 return $this->lastAffectedRows;
00457 }
00458
00465 function quoteStr($str) {
00466 return addslashes($str);
00467 }
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00491 function admin_get_tables() {
00492 $whichTables = array();
00493 return $whichTables;
00494 }
00495
00502 function admin_get_fields($tableName) {
00503 $output = array();
00504 return $output;
00505 }
00506
00513 function admin_get_keys($tableName) {
00514 $output = array();
00515 return $output;
00516 }
00517
00524 function admin_query($query) {
00525 return $this->sql_query($query);
00526 }
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00549 function readDataSource($table) {
00550 $this->data[$table] = array();
00551 }
00552
00561 function saveDataSource($table) {
00562 debug($this->data[$table]);
00563 }
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00591 function selectFromData($table,$where) {
00592
00593 $output = array();
00594 if (is_array($this->data[$table])) {
00595
00596
00597 $OR_index = 0;
00598
00599 foreach($where as $config) {
00600
00601 if (strtoupper($config['operator'])=='OR') {
00602 $OR_index++;
00603 }
00604
00605 if (!isset($itemKeys[$OR_index])) $itemKeys[$OR_index] = array_keys($this->data[$table]);
00606
00607 $this->select_evalSingle($table,$config,$itemKeys[$OR_index]);
00608 }
00609
00610 foreach($itemKeys as $uidKeys) {
00611 $output = array_merge($output, $uidKeys);
00612 }
00613 $output = array_unique($output);
00614 }
00615
00616 return $output;
00617 }
00618
00629 function select_evalSingle($table,$config,&$itemKeys) {
00630 $neg = preg_match('/^AND[[:space:]]+NOT$/',trim($config['operator']));
00631
00632 if (is_array($config['sub'])) {
00633 $subSelKeys = $this->selectFromData($table,$config['sub']);
00634 if ($neg) {
00635 foreach($itemKeys as $kk => $vv) {
00636 if (in_array($vv,$subSelKeys)) {
00637 unset($itemKeys[$kk]);
00638 }
00639 }
00640 } else {
00641 $itemKeys = array_intersect($itemKeys, $subSelKeys);
00642 }
00643 } else {
00644 $comp = strtoupper(str_replace(array(' ',"\t","\r","\n"),'',$config['comparator']));
00645 $mod = strtoupper($config['modifier']);
00646 switch($comp) {
00647 case 'NOTLIKE':
00648 case 'LIKE':
00649 $like_value = strtolower($config['value'][0]);
00650 if (substr($like_value,0,1)=='%') {
00651 $wildCard_begin = TRUE;
00652 $like_value = substr($like_value,1);
00653 }
00654 if (substr($like_value,-1)=='%') {
00655 $wildCard_end = TRUE;
00656 $like_value = substr($like_value,0,-1);
00657 }
00658 break;
00659 case 'NOTIN':
00660 case 'IN':
00661 $in_valueArray = array();
00662 foreach($config['value'] as $vParts) {
00663 $in_valueArray[] = (string)$vParts[0];
00664 }
00665 break;
00666 }
00667
00668 foreach($itemKeys as $kk => $v) {
00669 $field_value = $this->data[$table][$v][$config['field']];
00670
00671
00672 if ($config['calc']=='&') {
00673 $field_value&=intval($config['calc_value']);
00674 }
00675
00676
00677 switch($comp) {
00678 case '<=':
00679 $bool = $field_value <= $config['value'][0];
00680 break;
00681 case '>=':
00682 $bool = $field_value >= $config['value'][0];
00683 break;
00684 case '<':
00685 $bool = $field_value < $config['value'][0];
00686 break;
00687 case '>':
00688 $bool = $field_value > $config['value'][0];
00689 break;
00690 case '=':
00691 $bool = !strcmp($field_value,$config['value'][0]);
00692 break;
00693 case '!=':
00694 $bool = strcmp($field_value,$config['value'][0]);
00695 break;
00696 case 'NOTIN':
00697 case 'IN':
00698 $bool = in_array((string)$field_value, $in_valueArray);
00699 if ($comp=='NOTIN') $bool = !$bool;
00700 break;
00701 case 'NOTLIKE':
00702 case 'LIKE':
00703 if (!strlen($like_value)) {
00704 $bool = TRUE;
00705 } elseif ($wildCard_begin && !$wildCard_end) {
00706 $bool = !strcmp(substr(strtolower($field_value),-strlen($like_value)),$like_value);
00707 } elseif (!$wildCard_begin && $wildCard_end) {
00708 $bool = !strcmp(substr(strtolower($field_value),0,strlen($like_value)),$like_value);
00709 } elseif ($wildCard_begin && $wildCard_end) {
00710 $bool = strstr($field_value,$like_value);
00711 } else {
00712 $bool = !strcmp(strtolower($field_value),$like_value);
00713 }
00714 if ($comp=='NOTLIKE') $bool = !$bool;
00715 break;
00716 default:
00717 $bool = $field_value ? TRUE : FALSE;
00718 break;
00719 }
00720
00721
00722 if ($neg) $bool = !$bool;
00723
00724
00725 switch($mod) {
00726 case 'NOT':
00727 case '!':
00728 $bool = !$bool;
00729 break;
00730 }
00731
00732
00733 if (!$bool) {
00734 unset($itemKeys[$kk]);
00735 }
00736 }
00737 }
00738 }
00739
00748 function getResultSet($keys, $table, $fieldList) {
00749 $fields = t3lib_div::trimExplode(',',$fieldList);
00750
00751 $output = array();
00752 foreach($keys as $kValue) {
00753 if ($fieldList=='*') {
00754 $output[$kValue] = $this->data[$table][$kValue];
00755 } else {
00756 foreach($fields as $fieldName) {
00757 $output[$kValue][$fieldName] = $this->data[$table][$kValue][$fieldName];
00758 }
00759 }
00760 }
00761
00762 return $output;
00763 }
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00791 function debug_printResultSet($array) {
00792
00793 if (count($array)) {
00794 $tRows=array();
00795 $fields = array_keys(current($array));
00796 $tCell[]='
00797 <td>IDX</td>';
00798 foreach($fields as $fieldName) {
00799 $tCell[]='
00800 <td>'.htmlspecialchars($fieldName).'</td>';
00801 }
00802 $tRows[]='<tr>'.implode('',$tCell).'</tr>';
00803
00804
00805 foreach($array as $index => $rec) {
00806
00807 $tCell=array();
00808 $tCell[]='
00809 <td>'.htmlspecialchars($index).'</td>';
00810 foreach($fields as $fieldName) {
00811 $tCell[]='
00812 <td>'.htmlspecialchars($rec[$fieldName]).'</td>';
00813 }
00814 $tRows[]='<tr>'.implode('',$tCell).'</tr>';
00815 }
00816
00817 return '<table border="1">'.implode('',$tRows).'</table>';
00818 } else 'Empty resultset';
00819 }
00820 }
00821
00822
00830 class t3lib_sqlengine_resultobj {
00831
00832
00833 var $result = array();
00834
00835 var $TYPO3_DBAL_handlerType = '';
00836 var $TYPO3_DBAL_tableList = '';
00837
00838
00844 function sql_num_rows() {
00845 return count($this->result);
00846 }
00847
00853 function sql_fetch_assoc() {
00854 $row = current($this->result);
00855 next($this->result);
00856 return $row;
00857 }
00858
00864 function sql_fetch_row() {
00865 $resultRow = $this->sql_fetch_assoc();
00866
00867 if (is_array($resultRow)) {
00868 $numArray = array();
00869 foreach($resultRow as $value) {
00870 $numArray[]=$value;
00871 }
00872 return $numArray;
00873 }
00874 }
00875
00882 function sql_data_seek($pointer) {
00883 reset($this->result);
00884 for ($a=0;$a<$pointer;$a++) {
00885 next($this->result);
00886 }
00887 return TRUE;
00888 }
00889
00895 function sql_field_type() {
00896 return '';
00897 }
00898 }
00899
00900
00901
00902 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_sqlengine.php']) {
00903 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_sqlengine.php']);
00904 }
00905 ?>