📄 adodb-xmlschema.inc.php
字号:
*/
var $tableName;
/**
* @var array Indexed fields: Table columns included in this index
*/
var $fields;
/**
* @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
* @access private
*/
var $upgrade;
/**
* @var boolean Mark index for destruction
* @access private
*/
var $dropIndex;
/**
* Constructor. Initialize the index and table names.
*
* If the upgrade argument is set to ALTER or REPLACE, axmls will attempt to drop the index
* before and replace it with the new one.
*
* @param string $name Index name
* @param string $table Name of indexed table
* @param string $upgrade Upgrade method (NULL, ALTER, or REPLACE)
*/
function dbIndex( $name, $table, $upgrade = NULL ) {
logMsg( "===dbIndex( $name, $table )" );
$this->indexName = $name;
$this->tableName = $table;
$this->dropIndex = FALSE;
// If upgrading, set the upgrade method
if( isset( $upgrade ) ) {
$upgrade = strtoupper( $upgrade );
if( $upgrade == 'ALTER' or $upgrade == 'REPLACE' ) {
$this->upgrade = strtoupper( $upgrade );
// Drop the old index
logMsg( "Dropping old index '$name' using {$this->upgrade}" );
} else {
unset( $this->upgrade );
}
} else {
logMsg( "Creating index '$name'" );
}
}
/**
* Adds a field to the index
*
* This method adds the specified column to an index.
*
* @param string $name Field name
* @return string Field list
*/
function addField( $name ) {
logMsg( " +++addField( $name )" );
$fieldlist = &$this->fields;
$fieldlist ? ( $fieldlist .=" , $name" ) : ( $fieldlist = $name );
// Return the field list
logMsg( " ---addField" );
return $fieldlist;
}
/**
* Adds an option to the index
*
*This method takes a comma-separated list of index-level options
* and appends them to the index object.
*
* @param string $opt Index option
* @return string Option list
*/
function addIndexOpt( $opt ) {
logMsg( " +++addIndexOpt( $opt )" );
$optlist = &$this->indexOpts;
$optlist ? ( $optlist .= ", $opt" ) : ( $optlist = $opt );
// Return the options list
logMsg( " ---addIndexOpt" );
return $optlist;
}
/**
* Generates the SQL that will create the index in the database
*
* Returns SQL that will create the index represented by the object.
*
* @param object $dict ADOdb data dictionary object
* @return array Array containing index creation SQL
*/
function create( $dict ) {
logMsg( " +++create( $dict )" );
// Drop the index
if( $this->dropIndex == TRUE ) {
$sqlArray = array( "DROP INDEX {$this->indexName}" );
return $sqlArray;
}
if (isset($this->indexOpts) ) {
// CreateIndexSQL requires an array of options.
$indexOpts_arr = explode(",",$this->indexOpts);
} else {
$indexOpts_arr = NULL;
}
// Build index SQL array
$sqlArray = $dict->CreateIndexSQL( $this->indexName, $this->tableName, $this->fields, $indexOpts_arr );
// If upgrading, prepend SQL to drop the old index
if( isset( $this->upgrade ) ) {
$dropSql = "DROP INDEX {$this->indexName} ON {$this->tableName}";
array_unshift( $sqlArray, $dropSql );
}
// Return the array containing the SQL to create the table
logMsg( " ---create" );
return $sqlArray;
}
/**
* Marks an index for destruction
*/
function drop() {
logMsg( "Marking index '{$this->indexName}' from '{$this->tableName}' for drop" );
$this->dropIndex = TRUE;
}
/**
* Destructor
*/
function destroy() {
logMsg( "===destroy" );
unset( $this );
}
}
/**
* Creates the SQL to execute a list of provided SQL queries
*
* This class compiles a list of SQL queries specified in the external file.
*
* @access private
*/
class dbQuerySet {
/**
* @var array List of SQL queries
*/
var $querySet;
/**
* @var string String used to build of a query line by line
*/
var $query;
/**
* Constructor. Initializes the queries array
*/
function dbQuerySet() {
logMsg( "===dbQuerySet" );
$this->querySet = array();
$this->query = '';
}
/**
* Appends a line to a query that is being built line by line
*
* $param string $data Line of SQL data or NULL to initialize a new query
*/
function buildQuery( $data = NULL ) {
logMsg( " +++buildQuery( $data )" );
isset( $data ) ? ( $this->query .= " " . trim( $data ) ) : ( $this->query = '' );
logMsg( " ---buildQuery" );
}
/**
* Adds a completed query to the query list
*
* @return string SQL of added query
*/
function addQuery() {
logMsg( " +++addQuery" );
// Push the query onto the query set array
$finishedQuery = $this->query;
array_push( $this->querySet, $finishedQuery );
// Return the query set array
logMsg( " ---addQuery" );
return $finishedQuery;
}
/**
* Creates and returns the current query set
*
* @return array Query set
*/
function create() {
logMsg( " ===create" );
return $this->querySet;
}
/**
* Destructor
*/
function destroy() {
logMsg( "===destroy" );
unset( $this );
}
}
/**
* Loads and parses an XML file, creating an array of "ready-to-run" SQL statements
*
* This class is used to load and parse the XML file, to create an array of SQL statements
* that can be used to build a database, and to build the database using the SQL array.
*
* @author Richard Tango-Lowy
* @version $Revision: 1.2 $
* @copyright (c) 2003 ars Cognita, Inc., all rights reserved
*/
class adoSchema {
/**
* @var array Array containing SQL queries to generate all objects
*/
var $sqlArray;
/**
* @var object XML Parser object
* @access private
*/
var $xmlParser;
/**
* @var object ADOdb connection object
* @access private
*/
var $dbconn;
/**
* @var string Database type (platform)
* @access private
*/
var $dbType;
/**
* @var object ADOdb Data Dictionary
* @access private
*/
var $dict;
/**
* @var object Temporary dbTable object
* @access private
*/
var $table;
/**
* @var object Temporary dbIndex object
* @access private
*/
var $index;
/**
* @var object Temporary dbQuerySet object
* @access private
*/
var $querySet;
/**
* @var string Current XML element
* @access private
*/
var $currentElement;
/**
* @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
* @access private
*/
var $upgradeMethod;
/**
* @var mixed Existing tables before upgrade
* @access private
*/
var $legacyTables;
/**
* @var string Optional object prefix
* @access private
*/
var $objectPrefix;
/**
* @var long Original Magic Quotes Runtime value
* @access private
*/
var $mgq;
/**
* @var long System debug
* @access private
*/
var $debug;
/**
* Constructor. Initializes the xmlschema object.
*
* adoSchema provides methods to parse and process the XML schema file. The dbconn argument
* is a database connection object created by ADONewConnection. To upgrade an existing database to
* the provided schema, set the upgradeSchema flag to TRUE. By default, adoSchema will attempt to
* upgrade tables by ALTERing them on the fly. If your RDBMS doesn't support direct alteration
* (e.g., PostgreSQL), setting the forceReplace flag to TRUE will replace existing tables rather than
* altering them, copying data from each column in the old table to the like-named column in the
* new table.
*
* @param object $dbconn ADOdb connection object
* @param object $upgradeSchema Upgrade the database (deprecated)
* @param object $forceReplace If upgrading, REPLACE tables (deprecated)
*/
function adoSchema( $dbconn, $upgradeSchema = FALSE, $forceReplace = FALSE ) {
logMsg( "+++<b>adoSchema</b>( $dbconn, $upgradeSchema, $forceReplace )" );
// Initialize the environment
$this->mgq = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
$this->dbconn = &$dbconn;
$this->dbType = $dbconn->databaseType;
$this->sqlArray = array();
$this->debug = $this->dbconn->debug;
// Create an ADOdb dictionary object
$this->dict = NewDataDictionary( $dbconn );
$GLOBALS['AXMLS_DBCONN'] = $this->dbconn;
$GLOBALS['AXMLS_DBDICT'] = $this->dict;
// If upgradeSchema is set, we will be upgrading an existing database to match
// the provided schema. If forceReplace is set, objects are marked for replacement
// rather than alteration. Both these options are deprecated in favor of the
// upgradeSchema method.
if( $upgradeSchema == TRUE ) {
if( $forceReplace == TRUE ) {
logMsg( "upgradeSchema option deprecated. Use adoSchema->upgradeSchema('REPLACE') method instead" );
$method = 'REPLACE';
} else {
logMsg( "upgradeSchema option deprecated. Use adoSchema->upgradeSchema() method instead" );
$method = 'BEST';
}
$method = $this->upgradeSchema( $method );
logMsg( "Upgrading database using '$method'" );
} else {
logMsg( "Creating new database schema" );
unset( $this->upgradeMethod );
}
logMsg( "---<b>adoSchema</b>" );
}
/**
* Upgrades an existing schema rather than creating a new one
*
* Upgrades an exsiting database to match the provided schema. The method
* option can be set to ALTER, REPLACE, BEST, or NONE. ALTER attempts to
* alter each database object directly, REPLACE attempts to rebuild each object
* from scratch, BEST attempts to determine the best upgrade method for each
* object, and NONE disables upgrading.
*
* @param string $method Upgrade method (ALTER|REPLACE|BEST|NONE)
* @returns string Upgrade method used
*/
function upgradeSchema( $method = 'BEST' ) {
// Get the metadata from existing tables, then map the names back to case-insensitive
// names (for RDBMS' like MySQL,. that are case specific.)
$legacyTables = $this->dict->MetaTables();
if( is_array( $legacyTables ) and count( $legacyTables > 0 ) ) {
foreach( $this->dict->MetaTables() as $table ) {
$this->legacyTables[ strtoupper( $table ) ] = $table;
}
logMsg( $this->legacyTables, "Legacy Tables Map" );
}
// Handle the upgrade methods
switch( strtoupper( $method ) ) {
case 'ALTER':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -