table = NULL; $this->type = XMLDB_STATEMENT_INCORRECT; $this->sentences = array(); } /** * Get the statement table */ function getTable() { return $this->table; } /** * Get the statement type */ function getType() { return $this->type; } /** * Get the statement sentences */ function &getSentences() { return $this->sentences; } /** * Set the statement table */ function setTable($table) { $this->table = $table; } /** * Set the statement type */ function setType($type) { $this->type = $type; } /** * Add one statement sentence */ function addSentence($sentence) { $this->sentences[] = $sentence; } /** * Load data from XML to the index */ function arr2XMLDBStatement($xmlarr) { $result = true; /// Debug the table /// traverse_xmlize($xmlarr); //Debug /// print_object ($GLOBALS['traverse_array']); //Debug /// $GLOBALS['traverse_array']=""; //Debug /// Process key attributes (table, type, comment, previous, next) if (isset($xmlarr['@']['TABLE'])) { $this->table = strtolower(trim($xmlarr['@']['TABLE'])); } else { $this->errormsg = 'Missing TABLE attribute'; $this->debug($this->errormsg); $result = false; } if (isset($xmlarr['@']['TYPE'])) { /// Check for valid type $type = $this->getXMLDBStatementType(trim($xmlarr['@']['TYPE'])); if ($type) { $this->type = $type; } else { $this->errormsg = 'Invalid TYPE attribute'; $this->debug($this->errormsg); $result = false; } } else { $this->errormsg = 'Missing TYPE attribute'; $this->debug($this->errormsg); $result = false; } /// Look for sentences $sentencesarr = array(); if (isset($xmlarr['#']['SENTENCES'])) { $sentences = $xmlarr['#']['SENTENCES'][0]['#']['SENTENCE']; if ($sentences) { foreach ($sentences as $sentence) { if (isset($sentence['@']['TEXT'])) { $sentencesarr[] = trim($sentence['@']['TEXT']); } else { $this->errormsg = 'Missing TEXT attribute in sentence'; $this->debug($this->errormsg); $result = false; } } } } /// Finally, set the array of sentences $this->sentences = $sentencesarr; /// Now, perform some validations over sentences /// XMLDB_STATEMENT_INSERT checks if ($this->type == XMLDB_STATEMENT_INSERT) { /// Separate fields and values into two arrays if ($this->sentences) { foreach ($this->sentences as $sentence) { $fields = $this->getFieldsFromInsertSentence($sentence); $values = $this->getValuesFromInsertSentence($sentence); /// Check that we aren't inserting the id field if (in_array('id', $fields)) { $this->errormsg = 'Cannot insert the "id" field. It is an autonumeric column'; $this->debug($this->errormsg); $result = false; } if ($result && count($fields) == 0) { $this->errormsg = 'Missing fields in sentence "' . $sentence . '"'; $this->debug($this->errormsg); $result = false; } if ($result && count($values) == 0) { $this->errormsg = 'Missing values in sentence "' . $sentence . '"'; $this->debug($this->errormsg); $result = false; } if ($result && count($fields) != count($values)) { $this->errormsg = 'Incorrect number of fields (' .implode(', ', $fields) . ') or values (' . implode(', ', $values) . ')'; $this->debug($this->errormsg); $result = false; } } } } else { /// Sentences different from INSERT are not valid for now $this->errormsg = 'Only INSERT statements are supported'; $this->debug($this->errormsg); $result = false; } if (isset($xmlarr['@']['COMMENT'])) { $this->comment = trim($xmlarr['@']['COMMENT']); } if (isset($xmlarr['@']['PREVIOUS'])) { $this->previous = trim($xmlarr['@']['PREVIOUS']); } if (isset($xmlarr['@']['NEXT'])) { $this->next = trim($xmlarr['@']['NEXT']); } /// Set some attributes if ($result) { $this->loaded = true; } $this->calculateHash(); return $result; } /** * This function returns the correct XMLDB_STATEMENT_XXX value for the * string passed as argument */ function getXMLDBStatementType($type) { $result = XMLDB_STATEMENT_INCORRECT; switch (strtolower($type)) { case 'insert': $result = XMLDB_STATEMENT_INSERT; break; case 'update': $result = XMLDB_STATEMENT_UPDATE; break; case 'delete': $result = XMLDB_STATEMENT_DELETE; break; case 'custom': $result = XMLDB_STATEMENT_CUSTOM; break; } /// Return the normalized XMLDB_STATEMENT return $result; } /** * This function returns the correct name value for the * XMLDB_STATEMENT_XXX passed as argument */ function getXMLDBStatementName($type) { $result = ''; switch (strtolower($type)) { case XMLDB_STATEMENT_INSERT: $result = 'insert'; break; case XMLDB_STATEMENT_UPDATE: $result = 'update'; break; case XMLDB_STATEMENT_DELETE: $result = 'delete'; break; case XMLDB_STATEMENT_CUSTOM: $result = 'custom'; break; } /// Return the normalized name return $result; } /** * This function calculate and set the hash of one XMLDBStatement */ function calculateHash($recursive = false) { if (!$this->loaded) { $this->hash = NULL; } else { $key = $this->table . $this->type . implode (', ', $this->sentences); $this->hash = md5($key); } } /** * This function will output the XML text for one statement */ function xmlOutput() { $o = ''; $o.= ' comment) { $o.= ' COMMENT="' . htmlspecialchars($this->comment) . '"'; } if ($this->previous) { $o.= ' PREVIOUS="' . $this->previous . '"'; } if ($this->next) { $o.= ' NEXT="' . $this->next . '"'; } if ($this->sentences) { $o.= '>' . "\n"; $o.= ' ' . "\n"; foreach ($this->sentences as $sentence) { $o.= ' ' . "\n"; } $o.= ' ' . "\n"; $o.= ' ' . "\n"; } else { $o.= '/>' . "\n"; } return $o; } /** * This function will set all the attributes of the XMLDBIndex object * based on information passed in one ADOindex */ function setFromADOIndex($adoindex) { /// Set the unique field $this->unique = false; /// Set the fields $this->fields = $adoindex['columns']; /// Some more fields $this->loaded = true; $this->changed = true; } /** * Shows info in a readable format */ function readableInfo() { $o = ''; /// unique if ($this->unique) { $o .= 'unique'; } else { $o .= 'not unique'; } /// fields $o .= ' (' . implode(', ', $this->fields) . ')'; return $o; } /** * This function will return an array of fields from one INSERT sentence */ function getFieldsFromInsertSentence($sentence) { $fields = array(); /// Get first part from the sentence (before VALUES) preg_match('/^\((.*)\)\s+VALUES/is', $sentence, $matches); if (isset($matches[1])) { $part = $matches[1]; /// Convert the comma separated string to an array $arr = $this->comma2array($part); if ($arr) { $fields = $arr; } } return $fields; } /** * This function will return an array of values from one INSERT sentence */ function getValuesFromInsertSentence($sentence) { $values = array(); /// Get second part from the sentence (after VALUES) preg_match('/VALUES\s*\((.*)\)$/is', $sentence, $matches); if (isset($matches[1])) { $part = $matches[1]; /// Convert the comma separated string to an array $arr = $this->comma2array($part); if ($arr) { $values = $arr; } } return $values; } /** * This function will return the code needed to execute a collection * of sentences present inside one statement for the specified BD * and prefix. * For now it only supports INSERT statements */ function getExecuteStatementSQL ($dbtype, $prefix, $statement_end=true) { $results = array(); /// Based on statement type switch ($this->type) { case XMLDB_STATEMENT_INSERT: $results = $this->getExecuteInsertSQL($dbtype, $prefix, $statement_end); break; case XMLDB_STATEMENT_UPDATE: break; case XMLDB_STATEMENT_DELETE: break; case XMLDB_STATEMENT_CUSTOM: break; } return $results; } /** * This function will return the code needed to execute a collection * of insert sentences present inside the statement for the specified BD * and prefix. Just one simple wrapper over generators. */ function getExecuteInsertSQL ($dbtype, $prefix, $statement_end=true) { $results = array(); $classname = 'XMLDB' . $dbtype; $generator = new $classname(); $generator->setPrefix($prefix); $results = $generator->getExecuteInsertSQL($this); if ($statement_end) { $results = $generator->getEndedStatements($results); } return $results; } } ?>