📄 adodb-xmlschema.inc.php
字号:
$this->upgradeMethod = 'ALTER';
break;
case 'REPLACE':
$this->upgradeMethod = 'REPLACE';
break;
case 'BEST':
$this->upgradeMethod = 'ALTER';
break;
case 'NONE':
$this->upgradeMethod = '';
break;
default:
// Fail out if no legitimate method is passed.
return FALSE;
}
return $method;
}
/**
* Loads and parses an XML file
*
* This method accepts a path to an xmlschema-compliant XML file,
* loads it, parses it, and uses it to create the SQL to generate the objects
* described by the XML file.
*
* @param string $file XML file
* @return array Array of SQL queries, ready to execute
*/
function ParseSchema( $file ) {
logMsg( "+++ParseSchema( $file )" );
// Create the parser
$this->xmlParser = &$xmlParser;
$xmlParser = xml_parser_create();
xml_set_object( $xmlParser, $this );
// Initialize the XML callback functions
xml_set_element_handler( $xmlParser, "_xmlcb_startElement", "_xmlcb_endElement" );
xml_set_character_data_handler( $xmlParser, "_xmlcb_cData" );
// Open the file
if( !( $fp = fopen( $file, "r" ) ) ) {
die( "Unable to open file" );
}
// Process the file
while( $data = fread( $fp, 4096 ) ) {
if( !xml_parse( $xmlParser, $data, feof( $fp ) ) ) {
die( sprintf( "XML error: %s at line %d",
xml_error_string( xml_get_error_code( $xmlParser ) ),
xml_get_current_line_number( $xmlParser ) ) );
}
}
// Return the array of queries
logMsg( "---ParseSchema" );
return $this->sqlArray;
}
/**
* Loads a schema into the database
*
* Accepts an array of SQL queries generated by the parser
* and executes them.
*
* @param array $sqlArray Array of SQL statements
* @param boolean $continueOnErr Don't fail out if an error is encountered
* @returns integer 0 if failed, 1 if errors, 2 if successful
*/
function ExecuteSchema( $sqlArray, $continueOnErr = TRUE ) {
logMsg( "+++ExecuteSchema( $sqlArray, $continueOnErr )" );
$err = $this->dict->ExecuteSQLArray( $sqlArray, $continueOnErr );
// Return the success code
logMsg( "---ExecuteSchema" );
return $err;
}
/**
* XML Callback to process start elements
*
* @access private
*/
function _xmlcb_startElement( $parser, $name, $attrs ) {
isset( $this->upgradeMethod ) ? ( $upgradeMethod = $this->upgradeMethod ) : ( $upgradeMethod = '' );
$dbType = $this->dbType;
if( isset( $this->table ) ) $table = &$this->table;
if( isset( $this->index ) ) $index = &$this->index;
if( isset( $this->querySet ) ) $querySet = &$this->querySet;
$this->currentElement = $name;
// Process the element. Ignore unimportant elements.
if( in_array( trim( $name ), array( "SCHEMA", "DESCR", "COL", "CONSTRAINT" ) ) ) {
return FALSE;
}
switch( $name ) {
case "CLUSTERED": // IndexOpt
case "BITMAP": // IndexOpt
case "UNIQUE": // IndexOpt
case "FULLTEXT": // IndexOpt
case "HASH": // IndexOpt
if( isset( $this->index ) ) $this->index->addIndexOpt( $name );
break;
case "TABLE": // Table element
if( !isset( $attrs['PLATFORM'] ) or $this->supportedPlatform( $attrs['PLATFORM'] ) ) {
isset( $this->objectPrefix ) ? ( $tableName = $this->objectPrefix . $attrs['NAME'] ) : ( $tableName = $attrs['NAME'] );
$this->table = new dbTable( $tableName, $upgradeMethod );
} else {
unset( $this->table );
}
break;
case "FIELD": // Table field
if( isset( $this->table ) ) {
$fieldName = $attrs['NAME'];
$fieldType = $attrs['TYPE'];
isset( $attrs['SIZE'] ) ? ( $fieldSize = $attrs['SIZE'] ) : ( $fieldSize = NULL );
isset( $attrs['OPTS'] ) ? ( $fieldOpts = $attrs['OPTS'] ) : ( $fieldOpts = NULL );
$this->table->addField( $fieldName, $fieldType, $fieldSize, $fieldOpts );
}
break;
case "KEY": // Table field option
if( isset( $this->table ) ) {
$this->table->addFieldOpt( $this->table->currentField, 'KEY' );
}
break;
case "NOTNULL": // Table field option
if( isset( $this->table ) ) {
$this->table->addFieldOpt( $this->table->currentField, 'NOTNULL' );
}
break;
case "AUTOINCREMENT": // Table field option
if( isset( $this->table ) ) {
$this->table->addFieldOpt( $this->table->currentField, 'AUTOINCREMENT' );
}
break;
case "DEFAULT": // Table field option
if( isset( $this->table ) ) {
$this->table->addFieldOpt( $this->table->currentField, 'DEFAULT', $attrs['VALUE'] );
}
break;
case "INDEX": // Table index
if( !isset( $attrs['PLATFORM'] ) or $this->supportedPlatform( $attrs['PLATFORM'] ) ) {
if (isset($attrs['TABLE']))
isset( $this->objectPrefix) ? ( $tableName = $this->objectPrefix . $attrs['TABLE'] ) : ( $tableName = $attrs['TABLE'] );
else
$tableName = '';
$this->index = new dbIndex( $attrs['NAME'], $tableName, $upgradeMethod );
} else {
if( isset( $this->index ) ) unset( $this->index );
}
break;
case "SQL": // Freeform SQL queryset
if( !isset( $attrs['PLATFORM'] ) or $this->supportedPlatform( $attrs['PLATFORM'] ) ) {
$this->querySet = new dbQuerySet( $attrs );
} else {
if( isset( $this->querySet ) ) unset( $this->querySet );
}
break;
case "QUERY": // Queryset SQL query
if( isset( $this->querySet ) ) {
// Ignore this query set if a platform is specified and it's different than the
// current connection platform.
if( !isset( $attrs['PLATFORM'] ) or $this->supportedPlatform( $attrs['PLATFORM'] ) ) {
$this->querySet->buildQuery();
} else {
if( isset( $this->querySet->query ) ) unset( $this->querySet->query );
}
}
break;
default:
if( $this->debug ) print "OPENING ELEMENT '$name'<BR/>\n";
}
}
/**
* XML Callback to process cDATA elements
*
* @access private
*/
function _xmlcb_cData( $parser, $data ) {
$element = &$this->currentElement;
if( trim( $data ) == "" ) return;
// Process the data depending on the element
switch( $element ) {
case "COL": // Index column
if( isset( $this->index ) ) $this->index->addField( $data );
break;
case "DESCR": // Description element
// Display the description information
if( isset( $this->table ) ) {
$name = "({$this->table->tableName}): ";
} elseif( isset( $this->index ) ) {
$name = "({$this->index->indexName}): ";
} else {
$name = "";
}
if( $this->debug ) print "<LI> $name $data\n";
break;
case "QUERY": // Query SQL data
if( isset( $this->querySet ) and isset( $this->querySet->query ) ) $this->querySet->buildQuery( $data );
break;
case "CONSTRAINT": // Table constraint
if( isset( $this->table ) ) $this->table->addTableOpt( $data );
break;
default:
if( $this->debug ) print "<UL><LI>CDATA ($element) $data</UL>\n";
}
}
/**
* XML Callback to process end elements
*
* @access private
*/
function _xmlcb_endElement( $parser, $name ) {
// Process the element. Ignore unimportant elements.
if( in_array( trim( $name ),
array( "SCHEMA", "DESCR", "KEY", "AUTOINCREMENT", "FIELD",
"DEFAULT", "NOTNULL", "CONSTRAINT", "COL" ) ) ) {
return FALSE;
}
switch( trim( $name ) ) {
case "TABLE": // Table element
if( isset( $this->table ) ) {
$tableSQL = $this->table->create( $this->dict );
// Handle case changes in MySQL
// Get the metadata from the database, convert old and new table names to the
// same case and compare. If they're the same, pop a RENAME onto the query stack.
$tableName = $this->table->tableName;
if( $this->dict->upperName == 'MYSQL'
and is_array( $this->legacyTables )
and array_key_exists( strtoupper( $tableName ), $this->legacyTables )
and $oldTableName = $this->legacyTables[ strtoupper( $tableName ) ] ) {
if( $oldTableName != $tableName ) {
logMsg( "RENAMING table $oldTableName to $tableName" );
array_push( $this->sqlArray, "RENAME TABLE $oldTableName TO $tableName" );
}
}
foreach( $tableSQL as $query ) {
array_push( $this->sqlArray, $query );
}
$this->table->destroy();
}
break;
case "DROP": // Drop an item
logMsg( "DROPPING" );
if( isset( $this->table ) ) {
// Drop a table or field
$dropSQL = $this->table->drop( $this->dict );
}
if( isset( $this->index ) ) {
// Drop an index
$dropSQL = $this->index->drop();
}
break;
case "INDEX": // Index element
if( isset( $this->index ) ) {
$indexSQL = $this->index->create( $this->dict );
foreach( $indexSQL as $query ) {
array_push( $this->sqlArray, $query );
}
$this->index->destroy();
}
break;
case "QUERY": // Queryset element
if( isset( $this->querySet ) and isset( $this->querySet->query ) ) $this->querySet->addQuery();
break;
case "SQL": // Query SQL element
if( isset( $this->querySet ) ) {
$querySQL = $this->querySet->create();
$this->sqlArray = array_merge( $this->sqlArray, $querySQL );;
$this->querySet->destroy();
}
break;
default:
if( $this->debug ) print "<LI>CLOSING $name</UL>\n";
}
}
/**
* Set object prefix
*
* Sets a standard prefix that will be prepended to all database tables during
* database creation. Calling setPrefix with no arguments clears the prefix.
*
* @param string $prefix Prefix
* @return boolean TRUE if successful, else FALSE
*/
function setPrefix( $prefix = '' ) {
if( !preg_match( '/[^\w]/', $prefix ) and strlen( $prefix < XMLS_PREFIX_MAXLEN ) ) {
$this->objectPrefix = $prefix;
logMsg( "Prepended prefix: $prefix" );
return TRUE;
} else {
logMsg( "No prefix" );
return FALSE;
}
}
/**
* Checks if element references a specific platform
*
* Returns TRUE is no platform is specified or if we are currently
* using the specified platform.
*
* @param string $platform Requested platform
* @returns boolean TRUE if platform check succeeds
*
* @access private
*/
function supportedPlatform( $platform = NULL ) {
$dbType = $this->dbType;
$regex = "/^(\w*\|)*" . $dbType . "(\|\w*)*$/";
if( !isset( $platform ) or preg_match( $regex, $platform ) ) {
logMsg( "Platform $platform is supported" );
return TRUE;
} else {
logMsg( "Platform $platform is NOT supported" );
return FALSE;
}
}
/**
* Destructor: Destroys an adoSchema object.
*
* You should call this to clean up when you're finished with adoSchema.
*/
function Destroy() {
xml_parser_free( $this->xmlParser );
set_magic_quotes_runtime( $this->mgq );
unset( $this );
}
}
/**
* Message loggging function
*
* @access private
*/
function logMsg( $msg, $title = NULL ) {
if( XMLS_DEBUG ) {
print "<PRE>";
if( isset( $title ) ) {
print "<H3>$title</H3>";
}
if( isset( $this ) ) {
print "[" . get_class( $this ) . "] ";
}
if( is_array( $msg ) or is_object( $msg ) ) {
print_r( $msg );
print "<BR/>";
} else {
print "$msg<BR/>";
}
print "</PRE>";
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -