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
00074 class tx_dbal_handler_xmldb extends t3lib_sqlengine {
00075
00076 var $config = array();
00077 var $pObj;
00078
00079
00080 var $DBdir = '';
00081 var $DBstructure = array(
00082 'tables' => array()
00083 );
00084
00092 function init($config, &$pObj) {
00093 $this->config = $config['config'];
00094
00095 $dbStorage = t3lib_div::getFileAbsFileName($this->config['DBstorageDir']);
00096 if ($dbStorage && @is_dir($dbStorage) && ($dbStorage{strlen($dbStorage)-1} == '/')) {
00097 $this->DBdir = $dbStorage;
00098
00099
00100 if (@is_file($this->DBdir.'_STRUCTURE.xml')) {
00101 $this->xmlDB_readStructure();
00102 if (is_array($this->DBstructure)) {
00103 return TRUE;
00104 } else {
00105 $this->errorStatus = 'The database structure array could not be loaded correctly. "_STRUCTURE.xml" may be corrupt';
00106 }
00107 } else {
00108 $this->xmlDB_writeStructure();
00109 if (@is_file($this->DBdir.'_STRUCTURE.xml')) {
00110 return TRUE;
00111 } else {
00112 $this->errorStatus = 'The database structure file could not be created in dir "'.$dbStorage.'"';
00113 }
00114 }
00115
00116
00117 } else $this->errorStatus = 'The database storage dir "'.$dbStorage.'" did not exist!';
00118
00119 debug($this->errorStatus,'XMLDB connect ERROR:');
00120 return FALSE;
00121 }
00122
00129 function readDataSource($table) {
00130
00131 if (!$this->DBdir) {
00132 $this->errorStatus = 'XMLdatabase not connected';
00133 return FALSE;
00134 }
00135
00136
00137 if (is_array($this->DBstructure['tables'][$table])) {
00138 if (!isset($this->data[$table])) {
00139 $newTableFile = 'TABLE_'.$table.'.xml';
00140 if (@is_file($this->DBdir.$newTableFile)) {
00141 $this->data[$table] = t3lib_div::xml2array(t3lib_div::getUrl($this->DBdir.$newTableFile));
00142 if (!is_array($this->data[$table])) $this->data[$table] = array();
00143 return TRUE;
00144 } else {
00145 $this->data[$table] = array();
00146 $this->errorStatus = 'Tablefile for "'.$table.'" not found';
00147 }
00148 }
00149 } else $this->errorStatus = 'Table "'.$table.'" not found';
00150 }
00151
00158 function saveDataSource($table) {
00159
00160 if (!$this->DBdir) {
00161 $this->errorStatus = 'XMLdatabase not connected';
00162 return FALSE;
00163 }
00164
00165
00166 if (is_array($this->DBstructure['tables'][$table])) {
00167 $newTableFile = 'TABLE_'.$table.'.xml';
00168 if (t3lib_div::getFileAbsFileName($this->DBdir.$newTableFile) && @is_file($this->DBdir.$newTableFile)) {
00169
00170 $storeInCharset = $GLOBALS['LANG']->charSet;
00171 $xmlValue = t3lib_div::array2xml($this->data[$table],'',0,'T3xmlDB',0,array('useIndexTagForNum'=>'rec'));
00172 $content = '<?xml version="1.0" encoding="'.$storeInCharset.'" standalone="yes" ?>'.chr(10).$xmlValue;
00173 t3lib_div::writeFile($this->DBdir.$newTableFile,$content);
00174
00175 return TRUE;
00176 } else $this->errorStatus = 'Tablefile for "'.$table.'" not found';
00177 } else $this->errorStatus = 'Table "'.$table.'" not found';
00178 }
00179
00185 function xmlDB_writeStructure() {
00186 t3lib_div::writeFile($this->DBdir.'_STRUCTURE.xml', t3lib_div::array2xml($this->DBstructure,'',0,'T3xmlDBStructure',0,array('useIndexTagForNum'=>'item')));
00187 }
00188
00194 function xmlDB_readStructure() {
00195 $this->DBstructure = t3lib_div::xml2array(t3lib_div::getUrl($this->DBdir.'_STRUCTURE.xml'));
00196 }
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00218 function admin_get_tables() {
00219
00220 if (!$this->DBdir) {
00221 $this->errorStatus = 'XMLdatabase not connected';
00222 return FALSE;
00223 }
00224
00225 $whichTables = array();
00226
00227
00228 if (is_array($this->DBstructure['tables'])) {
00229 foreach($this->DBstructure['tables'] as $tableName => $tableInfo) {
00230 $whichTables[$tableName] = $tableName;
00231 }
00232 }
00233
00234 return $whichTables;
00235 }
00236
00243 function admin_get_fields($tableName) {
00244
00245 if (!$this->DBdir) {
00246 $this->errorStatus = 'XMLdatabase not connected';
00247 return FALSE;
00248 }
00249
00250 $output = array();
00251
00252
00253 if (is_array($this->DBstructure['tables'][$tableName]) && is_array($this->DBstructure['tables'][$tableName]['FIELDS'])) {
00254 foreach($this->DBstructure['tables'][$tableName]['FIELDS'] as $fieldName => $fieldInfo) {
00255 $output[$fieldName] = array(
00256 'Field' => $fieldName,
00257 'Type' => $fieldInfo['definition']['fieldType'].
00258 ($fieldInfo['definition']['value']?'('.$fieldInfo['definition']['value'].')':'').
00259 (isset($fieldInfo['definition']['featureIndex']['UNSIGNED']) ? ' '.$fieldInfo['definition']['featureIndex']['UNSIGNED']['keyword'] : ''),
00260 'Null' => isset($fieldInfo['definition']['featureIndex']['NOTNULL']) ? '' : 'Yes',
00261 'Key' => '',
00262 'Default' => $fieldInfo['definition']['featureIndex']['DEFAULT']['value'][0],
00263 'Extra' => isset($fieldInfo['definition']['featureIndex']['AUTO_INCREMENT']) ? 'auto_increment' : '',
00264 );
00265 }
00266 }
00267
00268 return $output;
00269 }
00270
00277 function admin_get_keys($tableName) {
00278
00279 if (!$this->DBdir) {
00280 $this->errorStatus = 'XMLdatabase not connected';
00281 return FALSE;
00282 }
00283
00284 $output = array();
00285
00286
00287 if (is_array($this->DBstructure['tables'][$tableName]) && is_array($this->DBstructure['tables'][$tableName]['KEYS'])) {
00288 foreach($this->DBstructure['tables'][$tableName]['KEYS'] as $keyName => $keyInfo) {
00289 foreach($keyInfo as $seq => $keyField) {
00290 $output[] = array(
00291 'Table' => $tableName,
00292 'Non_unique' => ($keyName=='PRIMARYKEY' ? 0 : 1),
00293 'Key_name' => ($keyName=='PRIMARYKEY' ? 'PRIMARY' : $keyName),
00294 'Seq_in_index' => $seq+1,
00295 'Column_name' => $keyField,
00296 'Collation' => 'A',
00297 'Cardinality' => '',
00298 'Sub_part' => '',
00299 'Packed' => '',
00300 'Comment' => '',
00301 );
00302 }
00303 }
00304 }
00305
00306 return $output;
00307 }
00308
00315 function admin_query($query) {
00316
00317 if (!$this->DBdir) {
00318 $this->errorStatus = 'XMLdatabase not connected';
00319 return FALSE;
00320 }
00321
00322 $parsedQuery = $this->parseSQL($query);
00323 $table = $parsedQuery['TABLE'];
00324
00325 if (is_array($parsedQuery)) {
00326
00327 switch($parsedQuery['type']) {
00328 case 'CREATETABLE':
00329 if (!is_array($this->DBstructure['tables'][$table])) {
00330 $newTableFile = 'TABLE_'.$table.'.xml';
00331 if (!@is_file($this->DBdir.$newTableFile)) {
00332
00333
00334 t3lib_div::writeFile($this->DBdir.$newTableFile, '');
00335 if (@is_file($this->DBdir.$newTableFile)) {
00336
00337
00338 if (!is_array($this->DBstructure['tables'])) $this->DBstructure['tables']=array();
00339 $this->DBstructure['tables'][(string)$table] = $parsedQuery;
00340
00341 $this->xmlDB_writeStructure();
00342 return TRUE;
00343 } else $this->errorStatus = 'Table file "'.$this->DBdir.$newTableFile.'" could not be created! Cannot create table!';
00344 } else $this->errorStatus = 'Table file "'.$this->DBdir.$newTableFile.'" already exists! Cannot create table!';
00345 } else $this->errorStatus = 'Table "'.$table.'" already exists!';
00346 break;
00347 case 'ALTERTABLE':
00348 if (is_array($this->DBstructure['tables'][$table])) {
00349 switch($parsedQuery['action']) {
00350 case 'ADD':
00351 if (!is_array($this->DBstructure['tables'][$table]['FIELDS'][$parsedQuery['FIELD']])) {
00352 $this->DBstructure['tables'][$table]['FIELDS'][$parsedQuery['FIELD']]['definition'] = $parsedQuery['definition'];
00353 $this->xmlDB_writeStructure();
00354 return TRUE;
00355
00356
00357 } else $this->errorStatus = 'Field "'.$parsedQuery['FIELD'].'" already exists!';
00358 break;
00359 case 'CHANGE':
00360 if (is_array($this->DBstructure['tables'][$table]['FIELDS'])) {
00361 if (is_array($this->DBstructure['tables'][$table]['FIELDS'][$parsedQuery['FIELD']])) {
00362 $newFieldInfo = array();
00363 foreach($this->DBstructure['tables'][$table]['FIELDS'] as $fieldName => $fieldDefinition) {
00364 if (!strcmp($fieldName,$parsedQuery['FIELD'])) {
00365
00366
00367 if ($parsedQuery['newField']) {
00368 if (!is_array($this->DBstructure['tables'][$table]['FIELDS'][$parsedQuery['newField']])) {
00369 $fieldName = $parsedQuery['newField'];
00370 } else {
00371 $this->errorStatus = 'A field in the table was already named "'.$parsedQuery['newField'].'"';
00372 return FALSE;
00373 }
00374 }
00375
00376 $fieldDefinition['definition'] = $parsedQuery['definition'];
00377 }
00378
00379
00380 $newFieldInfo[$fieldName] = $fieldDefinition;
00381 }
00382 $this->DBstructure['tables'][$table]['FIELDS'] = $newFieldInfo;
00383 $this->xmlDB_writeStructure();
00384 return TRUE;
00385
00386
00387 } else $this->errorStatus = 'Field "'.$parsedQuery['FIELD'].'" does not exist!';
00388 } else $this->errorStatus = 'There are not fields in the table - strange!';
00389 break;
00390 case 'DROP':
00391 if (is_array($this->DBstructure['tables'][$table]['FIELDS'][$parsedQuery['FIELD']])) {
00392 unset($this->DBstructure['tables'][$table]['FIELDS'][$parsedQuery['FIELD']]);
00393 $this->xmlDB_writeStructure();
00394 return TRUE;
00395
00396
00397 } else $this->errorStatus = 'Field "'.$parsedQuery['FIELD'].'" does not exist!';
00398 break;
00399 }
00400 } else $this->errorStatus = 'Table "'.$table.'" does not exist!';
00401 break;
00402 case 'DROPTABLE':
00403
00404
00405 debug($parsedQuery);
00406
00407
00408 break;
00409 default:
00410 $this->errorStatus = 'Query type "'.$parsedQuery['type'].'" was not supported!';
00411 break;
00412 }
00413
00414 } else $this->errorStatus = 'SQL parse error: '.$parsedQuery;
00415
00416 return FALSE;
00417 }
00418 }
00419
00420
00421 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/dbal/handlers/class.tx_dbal_handler_xmldb.php']) {
00422 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/dbal/handlers/class.tx_dbal_handler_xmldb.php']);
00423 }
00424 ?>