xmldbstatement.class.php

来自「很棒的在线教学系统」· PHP 代码 · 共 424 行

PHP
424
字号
<?php // $Id: XMLDBStatement.class.php,v 1.7 2007/10/10 05:25:14 nicolasconnault Exp $/////////////////////////////////////////////////////////////////////////////                                                                       //// NOTICE OF COPYRIGHT                                                   ////                                                                       //// Moodle - Modular Object-Oriented Dynamic Learning Environment         ////          http://moodle.com                                            ////                                                                       //// Copyright (C) 1999 onwards Martin Dougiamas        http://dougiamas.com  ////           (C) 2001-3001 Eloy Lafuente (stronk7) http://contiento.com  ////                                                                       //// This program is free software; you can redistribute it and/or modify  //// it under the terms of the GNU General Public License as published by  //// the Free Software Foundation; either version 2 of the License, or     //// (at your option) any later version.                                   ////                                                                       //// This program is distributed in the hope that it will be useful,       //// but WITHOUT ANY WARRANTY; without even the implied warranty of        //// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         //// GNU General Public License for more details:                          ////                                                                       ////          http://www.gnu.org/copyleft/gpl.html                         ////                                                                       //////////////////////////////////////////////////////////////////////////////// This class represent one XMLDB Statement/// (a group of SQL arbitrary sentences)/// (only INSERT is allowed for now)class XMLDBStatement extends XMLDBObject {    var $table;     // Table we are handling    var $type;      // XMLDB_STATEMENT_TYPE    var $sentences; // Collection of sentences in the statement    /**     * Creates one new XMLDBStatement     */    function XMLDBStatement($name) {        parent::XMLDBObject($name);        $this->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.= '    <STATEMENT NAME="' . $this->name . '" TYPE="' . XMLDBStatement::getXMLDBStatementName($this->type) . '" TABLE="' . $this->table . '"';        if ($this->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.= '      <SENTENCES>' . "\n";            foreach ($this->sentences as $sentence) {                $o.= '        <SENTENCE TEXT="' . htmlspecialchars($sentence) . '" />' . "\n";            }            $o.= '      </SENTENCES>' . "\n";            $o.= '    </STATEMENT>' . "\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;    }}?>

⌨️ 快捷键说明

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