⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mssql.class.php

📁 很棒的在线教学系统
💻 PHP
📖 第 1 页 / 共 2 页
字号:
        $metac = $meta[$fieldname];        $oldtype = strtolower($metac->type);        $oldmetatype = column_type($xmldb_table->getName(), $fieldname);        $oldlength = $metac->max_length;        $olddecimals = empty($metac->scale) ? null : $metac->scale;        $oldnotnull = empty($metac->not_null) ? false : $metac->not_null;        $olddefault = empty($metac->has_default) ? null : strtok($metac->default_value, ':');        $typechanged = true;  //By default, assume that the column type has changed        $lengthchanged = true;  //By default, assume that the column length has changed    /// Detect if we are changing the type of the column        if (($xmldb_field->getType() == XMLDB_TYPE_INTEGER && substr($oldmetatype, 0, 1) == 'I') ||            ($xmldb_field->getType() == XMLDB_TYPE_NUMBER  && $oldmetatype == 'N') ||            ($xmldb_field->getType() == XMLDB_TYPE_FLOAT   && $oldmetatype == 'F') ||            ($xmldb_field->getType() == XMLDB_TYPE_CHAR    && substr($oldmetatype, 0, 1) == 'C') ||            ($xmldb_field->getType() == XMLDB_TYPE_TEXT    && substr($oldmetatype, 0, 1) == 'X') ||            ($xmldb_field->getType() == XMLDB_TYPE_BINARY  && $oldmetatype == 'B')) {            $typechanged = false;        }    /// Detect if we are changing the length of the column, not always necessary to drop defaults    /// if only the length changes, but it's safe to do it always        if ($xmldb_field->getLength() == $oldlength) {            $lengthchanged = false;        }    /// If type or length have changed drop the default if exists        if ($typechanged || $lengthchanged) {            $results = $this->getDropDefaultSQL($xmldb_table, $xmldb_field);        }    /// Just prevent default clauses in this type of sentences for mssql and launch the parent one        $this->alter_column_skip_default = true;        $results = array_merge($results, parent::getAlterFieldSQL($xmldb_table, $xmldb_field)); // Call parent    /// Finally, process the default clause to add it back if necessary        if ($typechanged || $lengthchanged) {            $results = array_merge($results, $this->getCreateDefaultSQL($xmldb_table, $xmldb_field));        }    /// Return results        return $results;    }    /**     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to modify the default of the field in the table     */    function getModifyDefaultSQL($xmldb_table, $xmldb_field) {    /// MSSQL is a bit special with default constraints because it implements them as external constraints so    /// normal ALTER TABLE ALTER COLUMN don't work to change defaults. Because this, we have this method overloaded here        $results = array();    /// Get the quoted name of the table and field        $tablename = $this->getTableName($xmldb_table);        $fieldname = $this->getEncQuoted($xmldb_field->getName());    /// Decide if we are going to create/modify or to drop the default        if ($xmldb_field->getDefault() === null) {            $results = $this->getDropDefaultSQL($xmldb_table, $xmldb_field); //Drop but, under some circumptances, re-enable            if ($this->getDefaultClause($xmldb_field)) { //If getDefaultClause() it must have one default, create it                $results = array_merge($results, $this->getCreateDefaultSQL($xmldb_table, $xmldb_field)); //Create/modify            }        } else {            $results = $this->getDropDefaultSQL($xmldb_table, $xmldb_field); //Drop (only if exists)            $results = array_merge($results, $this->getCreateDefaultSQL($xmldb_table, $xmldb_field)); //Create/modify        }        return $results;    }    /**     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to create its enum      * (usually invoked from getModifyEnumSQL()     */    function getCreateEnumSQL($xmldb_table, $xmldb_field) {    /// All we have to do is to create the check constraint        return array('ALTER TABLE ' . $this->getTableName($xmldb_table) .                     ' ADD ' . $this->getEnumExtraSQL($xmldb_table, $xmldb_field));    }    /**     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to drop its enum     * (usually invoked from getModifyEnumSQL()     */    function getDropEnumSQL($xmldb_table, $xmldb_field) {    /// Let's introspect to know the real name of the check constraint        if ($check_constraints = $this->getCheckConstraintsFromDB($xmldb_table, $xmldb_field)) {            $check_constraint = array_shift($check_constraints); /// Get the 1st (should be only one)            $constraint_name = strtolower($check_constraint->name); /// Extract the REAL name        /// All we have to do is to drop the check constraint            return array('ALTER TABLE ' . $this->getTableName($xmldb_table) .                     ' DROP CONSTRAINT ' . $constraint_name);        } else { /// Constraint not found. Nothing to do            return array();        }    }    /**     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to create its default      * (usually invoked from getModifyDefaultSQL()     */    function getCreateDefaultSQL($xmldb_table, $xmldb_field) {    /// MSSQL is a bit special and it requires the corresponding DEFAULT CONSTRAINT to be dropped        $results = array();    /// Get the quoted name of the table and field        $tablename = $this->getTableName($xmldb_table);        $fieldname = $this->getEncQuoted($xmldb_field->getName());    /// Now, check if, with the current field attributes, we have to build one default        if ($default_clause = $this->getDefaultClause($xmldb_field)) {        /// We need to build the default (Moodle) default, so do it            $results[] = 'ALTER TABLE ' . $tablename . ' ADD' . $default_clause . ' FOR ' . $fieldname;        }        return $results;    }    /**     * Given one XMLDBTable and one XMLDBField, return the SQL statements needded to drop its default      * (usually invoked from getModifyDefaultSQL()     */    function getDropDefaultSQL($xmldb_table, $xmldb_field) {    /// MSSQL is a bit special and it requires the corresponding DEFAULT CONSTRAINT to be dropped        $results = array();    /// Get the quoted name of the table and field        $tablename = $this->getTableName($xmldb_table);        $fieldname = $this->getEncQuoted($xmldb_field->getName());    /// Look for the default contraint and, if found, drop it        if ($defaultname = $this->getDefaultConstraintName($xmldb_table, $xmldb_field)) {            $results[] = 'ALTER TABLE ' . $tablename . ' DROP CONSTRAINT ' . $defaultname;        }         return $results;    }    /**     * Given one XMLDBTable and one XMLDBField, returns the name of its default constraint in DB     * or false if not found     * This function should be considered internal and never used outside from generator     */    function getDefaultConstraintName($xmldb_table, $xmldb_field) {    /// Get the quoted name of the table and field        $tablename = $this->getTableName($xmldb_table);        $fieldname = $this->getEncQuoted($xmldb_field->getName());    /// Look for any default constraint in this field and drop it        if ($default = get_record_sql("SELECT id, object_name(cdefault) AS defaultconstraint                                         FROM syscolumns                                        WHERE id = object_id('{$tablename}')                                          AND name = '{$fieldname}'")) {            return $default->defaultconstraint;        } else {            return false;        }    }    /**     * Given one XMLDBTable returns one array with all the check constrainsts     * in the table (fetched from DB)     * Optionally the function allows one xmldb_field to be specified in     * order to return only the check constraints belonging to one field.     * Each element contains the name of the constraint and its description     * If no check constraints are found, returns an empty array     */    function getCheckConstraintsFromDB($xmldb_table, $xmldb_field = null) {        $results = array();        $tablename = $this->getTableName($xmldb_table);        if ($constraints = get_records_sql("SELECT o.name, c.text AS description                                            FROM sysobjects o,                                                 sysobjects p,                                                 syscomments c                                           WHERE p.id = o.parent_obj                                             AND o.id = c.id                                             AND o.xtype = 'C'                                             AND p.name = '{$tablename}'")) {            foreach ($constraints as $constraint) {                $results[$constraint->name] = $constraint;            }        }    /// Filter by the required field if specified        if ($xmldb_field) {            $filtered_results = array();            $filter = $xmldb_field->getName();        /// Lets clean a bit each constraint description, looking for the filtered field            foreach ($results as $key => $result) {                $description = trim(preg_replace('/[\(\)]/', '',  $result->description));   // Parenthesis out & trim                /// description starts by [$filter] assume it's a constraint beloging to the field                if (preg_match("/^\[{$filter}\]/i", $description)) {                    $filtered_results[$key] = $result;                }            }        /// Assign filtered results to the final results array            $results =  $filtered_results;        }        return $results;    }    /**     * Given one object name and it's type (pk, uk, fk, ck, ix, uix, seq, trg)     * return if such name is currently in use (true) or no (false)     * (invoked from getNameForObject()     */    function isNameInUse($object_name, $type, $table_name) {        switch($type) {            case 'seq':            case 'trg':            case 'pk':            case 'uk':            case 'fk':            case 'ck':                if ($check = get_records_sql("SELECT name                                               FROM sysobjects                                               WHERE lower(name) = '" . strtolower($object_name) . "'")) {                    return true;                }                break;            case 'ix':            case 'uix':                if ($check = get_records_sql("SELECT name                                               FROM sysindexes                                              WHERE lower(name) = '" . strtolower($object_name) . "'")) {                    return true;                }                break;        }        return false; //No name in use found    }    /**     * Returns an array of reserved words (lowercase) for this DB     */    function getReservedWords() {    /// This file contains the reserved words for MSSQL databases    /// from http://msdn2.microsoft.com/en-us/library/ms189822.aspx        $reserved_words = array (            'add', 'all', 'alter', 'and', 'any', 'as', 'asc', 'authorization',            'avg', 'backup', 'begin', 'between', 'break', 'browse', 'bulk',            'by', 'cascade', 'case', 'check', 'checkpoint', 'close', 'clustered',            'coalesce', 'collate', 'column', 'commit', 'committed', 'compute',            'confirm', 'constraint', 'contains', 'containstable', 'continue',            'controlrow', 'convert', 'count', 'create', 'cross', 'current',            'current_date', 'current_time', 'current_timestamp', 'current_user',            'cursor', 'database', 'dbcc', 'deallocate', 'declare', 'default', 'delete',            'deny', 'desc', 'disk', 'distinct', 'distributed', 'double', 'drop', 'dummy',            'dump', 'else', 'end', 'errlvl', 'errorexit', 'escape', 'except', 'exec',            'execute', 'exists', 'exit', 'external', 'fetch', 'file', 'fillfactor', 'floppy',            'for', 'foreign', 'freetext', 'freetexttable', 'from', 'full', 'function',            'goto', 'grant', 'group', 'having', 'holdlock', 'identity', 'identitycol',            'identity_insert', 'if', 'in', 'index', 'inner', 'insert', 'intersect', 'into',            'is', 'isolation', 'join', 'key', 'kill', 'left', 'level', 'like', 'lineno',            'load', 'max', 'min', 'mirrorexit', 'national', 'nocheck', 'nonclustered',            'not', 'null', 'nullif', 'of', 'off', 'offsets', 'on', 'once', 'only', 'open',            'opendatasource', 'openquery', 'openrowset', 'openxml', 'option', 'or', 'order',            'outer', 'over', 'percent', 'perm', 'permanent', 'pipe', 'pivot', 'plan', 'precision',            'prepare', 'primary', 'print', 'privileges', 'proc', 'procedure', 'processexit',            'public', 'raiserror', 'read', 'readtext', 'reconfigure', 'references',            'repeatable', 'replication', 'restore', 'restrict', 'return', 'revoke',            'right', 'rollback', 'rowcount', 'rowguidcol', 'rule', 'save', 'schema',            'select', 'serializable', 'session_user', 'set', 'setuser', 'shutdown', 'some',            'statistics', 'sum', 'system_user', 'table', 'tape', 'temp', 'temporary',            'textsize', 'then', 'to', 'top', 'tran', 'transaction', 'trigger', 'truncate',            'tsequal', 'uncommitted', 'union', 'unique', 'update', 'updatetext', 'use',            'user', 'values', 'varying', 'view', 'waitfor', 'when', 'where', 'while',            'with', 'work', 'writetext'        );        return $reserved_words;    }}?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -