📄 adodb-xmlschema.inc.php
字号:
<?PHP
// Copyright (c) 2003 ars Cognita Inc., all rights reserved
/* ******************************************************************************
Released under both BSD license and Lesser GPL library license.
Whenever there is any discrepancy between the two licenses,
the BSD license will take precedence.
*******************************************************************************/
/**
* xmlschema is a class that allows the user to quickly and easily
* build a database on any ADOdb-supported platform using a simple
* XML schema.
*
* @author Richard Tango-Lowy
* @version $Revision: 1.2 $
*/
/**
* Debug on or off
*/
if (!defined('XMLS_DEBUG')) define( 'XMLS_DEBUG', FALSE );
/**
* Include the main ADODB library
*/
if (!defined( '_ADODB_LAYER' ) ) {
require( dirname(__FILE__) . '/adodb.inc.php' );
}
/**
* Maximum length allowed for object prefix
*
* @access private
*/
define( 'XMLS_PREFIX_MAXLEN', 10 );
/**
* Creates a table object in ADOdb's datadict format
*
* This class stores information about a database table. As charactaristics
* of the table are loaded from the external source, methods and properties
* of this class are used to build up the table description in ADOdb's
* datadict format.
*
* @access private
*/
class dbTable {
/**
* @var string Table name
*/
var $tableName;
/**
* @var array Field specifier: Meta-information about each field
*/
var $fieldSpec;
/**
* @var array Table options: Table-level options
*/
var $tableOpts;
/**
* @var string Field index: Keeps track of which field is currently being processed
*/
var $currentField;
/**
* @var string If set (to 'ALTER' or 'REPLACE'), upgrade an existing database
* @access private
*/
var $upgrade;
/**
* @var array Array of legacy metadata. Used for REPLACE upgrades.
* @access private
*/
var $legacyFieldMetadata;
/**
* @var boolean Mark table for destruction
* @access private
*/
var $dropTable;
/**
* @var boolean Mark field for destruction (not yet implemented)
* @access private
*/
var $dropField;
/**
* Constructor. Iniitializes a new table object.
*
* If the table already exists, there are two methods available to upgrade it.
* To upgrade an existing table the new schema by ALTERing the table, set the upgradeTable
* argument to "ALTER." To force the new table to replace the current table, set the upgradeTable
* argument to "REPLACE."
*
* @param string $name Table name
* @param string $upgradeTable Upgrade method (NULL, ALTER, or REPLACE)
*/
function dbTable( $name, $upgrade = NULL ) {
logMsg( "+++dbTable( $name, $upgrade )" );
$dbconn = $GLOBALS['AXMLS_DBCONN'];
$dbdict = $GLOBALS['AXMLS_DBDICT'];
$this->tableName = $name;
// If upgrading, set and handle the upgrade method
if( isset( $upgrade ) ) {
$upgrade = strtoupper( $upgrade );
switch( $upgrade ) {
case "ALTER":
$this->upgrade = strtoupper( $upgrade );
logMsg( "Upgrading table '$name' using {$this->upgrade}" );
break;
case "REPLACE":
$this->upgrade = strtoupper( $upgrade );
logMsg( "Upgrading table '$name' using {$this->upgrade}" );
// Need to fetch column names, run them through the case handler (for MySQL),
// create the new column, migrate the data, then drop the old column.
$this->legacyFieldMetadata = $dbconn->MetaColumns( $name );
logMsg( $this->legacyFieldMetadata, "Legacy Metadata" );
break;
default:
unset( $this->upgrade );
break;
}
} else {
logMsg( "Creating table '$name'" );
}
logMsg( " ---dbTable" );
}
/**
* Adds a field to a table object
*
* $name is the name of the table to which the field should be added.
* $type is an ADODB datadict field type. The following field types
* are supported as of ADODB 3.40:
* - C: varchar
* - X: CLOB (character large object) or largest varchar size
* if CLOB is not supported
* - C2: Multibyte varchar
* - X2: Multibyte CLOB
* - B: BLOB (binary large object)
* - D: Date (some databases do not support this, and we return a datetime type)
* - T: Datetime or Timestamp
* - L: Integer field suitable for storing booleans (0 or 1)
* - I: Integer (mapped to I4)
* - I1: 1-byte integer
* - I2: 2-byte integer
* - I4: 4-byte integer
* - I8: 8-byte integer
* - F: Floating point number
* - N: Numeric or decimal number
*
* @param string $name Name of the table to which the field will be added.
* @param string $type ADODB datadict field type.
* @param string $size Field size
* @param array $opts Field options array
* @return array Field specifier array
*/
function addField( $name, $type, $size = NULL, $opts = NULL ) {
logMsg( " +++addField( $name, $type, $size, $opts )" );
// Set the field index so we know where we are
$this->currentField = $name;
// Set the field type (required)
$this->fieldSpec[$name]['TYPE'] = $type;
// Set the field size (optional)
if( isset( $size ) ) {
$this->fieldSpec[$name]['SIZE'] = $size;
}
// Set the field options
if( isset( $opts ) ) $this->fieldSpec[$name]['OPTS'] = $opts;
// Return array containing field specifier
logMsg( " ---addField" );
return $this->fieldSpec;
}
/**
* Adds a field option to the current field specifier
*
* This method adds a field option allowed by the ADOdb datadict
* and appends it to the given field.
*
* @param string $field Field name
* @param string $opt ADOdb field option
* @param mixed $value Field option value
* @return array Field specifier array
*/
function addFieldOpt( $field, $opt, $value = NULL ) {
logMsg( " +++addFieldOpt( $field, $opt, $value )" );
// Add the option to the field specifier
if( $value === NULL ) { // No value, so add only the option
$this->fieldSpec[$field]['OPTS'][] = $opt;
} else { // Add the option and value
$this->fieldSpec[$field]['OPTS'][] = array( "$opt" => "$value" );
}
// Return array containing field specifier
logMsg( " ---addFieldOpt( $field )" );
return $this->fieldSpec;
}
/**
* Adds an option to the table
*
*This method takes a comma-separated list of table-level options
* and appends them to the table object.
*
* @param string $opt Table option
* @return string Option list
*/
function addTableOpt( $opt ) {
logMsg( " +++addTableOpt( $opt )" );
$optlist = &$this->tableOpts;
$optlist ? ( $optlist .= ", $opt" ) : ($optlist = $opt );
// Return the options list
logMsg( " ---addTableOpt( $opt )" );
return $optlist;
}
/**
* Generates the SQL that will create the table in the database
*
* Returns SQL that will create the table represented by the object.
*
* @param object $dict ADOdb data dictionary
* @return array Array containing table creation SQL
*/
function create( $dict ) {
logMsg( " +++<b>create</b>( $dict )" );
// Drop the table
if( $this->dropTable ) {
$sqlArray[] = "DROP TABLE {$this->tableName}";
return $sqlArray;
}
// Loop through the field specifier array, building the associative array for the field options
$fldarray = array();
$i = 0;
foreach( $this->fieldSpec as $field => $finfo ) {
$i++;
// Set an empty size if it isn't supplied
if( !isset( $finfo['SIZE'] ) ) $finfo['SIZE'] = '';
// Initialize the field array with the type and size
$fldarray[$i] = array( $field, $finfo['TYPE'], $finfo['SIZE'] );
// Loop through the options array and add the field options.
if( isset( $finfo['OPTS'] ) ) {
foreach( $finfo['OPTS'] as $opt ) {
if( is_array( $opt ) ) { // Option has an argument.
$key = key( $opt );
$value = $opt[key( $opt ) ];
$fldarray[$i][$key] = $value;
} else { // Option doesn't have arguments
array_push( $fldarray[$i], $opt );
}
}
}
}
// Check for existing table
$legacyTables = $dict->MetaTables();
if( is_array( $legacyTables ) and count( $legacyTables > 0 ) ) {
foreach( $dict->MetaTables() as $table ) {
$this->legacyTables[ strtoupper( $table ) ] = $table;
}
if( isset( $this->legacyTables ) and is_array( $this->legacyTables ) and count( $this->legacyTables > 0 ) ) {
if( array_key_exists( strtoupper( $this->tableName ), $this->legacyTables ) ) {
$existingTableName = $this->legacyTables[strtoupper( $this->tableName )];
logMsg( "Upgrading $existingTableName using '{$this->upgrade}'" );
}
}
}
// Build table array
if( !isset( $this->upgrade ) or !isset( $existingTableName ) ) {
// Create the new table
$sqlArray = $dict->CreateTableSQL( $this->tableName, $fldarray, $this->tableOpts );
logMsg( $sqlArray, "Generated CreateTableSQL" );
} else {
// Upgrade an existing table
switch( $this->upgrade ) {
case 'ALTER':
// Use ChangeTableSQL
$sqlArray = $dict->ChangeTableSQL( $this->tableName, $fldarray, $this->tableOpts );
logMsg( $sqlArray, "Generated ChangeTableSQL (ALTERing table)" );
break;
case 'REPLACE':
logMsg( "Doing upgrade REPLACE (testing)" );
$sqlArray = $dict->ChangeTableSQL( $this->tableName, $fldarray, $this->tableOpts );
$this->replace( $dict );
break;
default:
}
}
// Return the array containing the SQL to create the table
logMsg( " ---create" );
return $sqlArray;
}
/**
* Generates the SQL that will drop the table or field from the database
*
* @param object $dict ADOdb data dictionary
* @return array Array containing table creation SQL
*/
function drop( $dict ) {
if( isset( $this->currentField ) ) {
// Drop the current field
logMsg( "Dropping field '{$this->currentField}' from table '{$this->tableName}'" );
$this->dropField = TRUE;
$sqlArray = $dict->DropColumnSQL( $this->tableName, $this->currentField );
} else {
// Drop the current table
logMsg( "Dropping table '{$this->tableName}'" );
$this->dropTable = TRUE;
$sqlArray = false;
}
return $sqlArray;
}
/**
* Generates the SQL that will replace an existing table in the database
*
* Returns SQL that will replace the table represented by the object.
*
* @return array Array containing table replacement SQL
*/
function replace( $dict ) {
logMsg( " +++replace( $dict )" );
// Identify new columns
logMsg( " ---replace)" );
}
/**
* Destructor
*/
function destroy() {
logMsg( "===destroy" );
unset( $this );
}
}
/**
* Creates an index object in ADOdb's datadict format
*
* This class stores information about a database index. As charactaristics
* of the index are loaded from the external source, methods and properties
* of this class are used to build up the index description in ADOdb's
* datadict format.
*
* @access private
*/
class dbIndex {
/**
* @var string Index name
*/
var $indexName;
/**
* @var array Index options: Index-level options
*/
var $indexOpts;
/**
* @var string Name of the table this index is attached to
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -