Beispiel #1
0
 /**
  * Autoload or manually load the table definitions
  *
  *
  * usage :
  * DB_DataObject::databaseStructure(  'databasename',
  *                                    parse_ini_file('mydb.ini',true), 
  *                                    parse_ini_file('mydb.link.ini',true)); 
  *
  * obviously you dont have to use ini files.. (just return array similar to ini files..)
  *  
  * It should append to the table structure array 
  *
  *     
  * @param optional string  name of database to assign / read
  * @param optional array   structure of database, and keys
  * @param optional array  table links
  *
  * @access public
  * @return true or PEAR:error on wrong paramenters.. or false if no file exists..
  *              or the array(tablename => array(column_name=>type)) if called with 1 argument.. (databasename)
  */
 function databaseStructure()
 {
     global $_DB_DATAOBJECT;
     // Assignment code
     if ($args = func_get_args()) {
         if (count($args) == 1) {
             // this returns all the tables and their structure..
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Loading Generator as databaseStructure called with args", 1);
             }
             $x = new DB_DataObject();
             $x->_database = $args[0];
             $this->_connect();
             $DB =& $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
             $tables = $DB->getListOf('tables');
             class_exists('DB_DataObject_Generator') ? '' : (require_once 'DB/DataObject/Generator.php');
             foreach ($tables as $table) {
                 $y = new DB_DataObject_Generator();
                 $y->fillTableSchema($x->_database, $table);
             }
             return $_DB_DATAOBJECT['INI'][$x->_database];
         } else {
             $_DB_DATAOBJECT['INI'][$args[0]] = isset($_DB_DATAOBJECT['INI'][$args[0]]) ? $_DB_DATAOBJECT['INI'][$args[0]] + $args[1] : $args[1];
             if (isset($args[1])) {
                 $_DB_DATAOBJECT['LINKS'][$args[0]] = isset($_DB_DATAOBJECT['LINKS'][$args[0]]) ? $_DB_DATAOBJECT['LINKS'][$args[0]] + $args[2] : $args[2];
             }
             return true;
         }
     }
     if (!$this->_database) {
         $this->_connect();
     }
     // loaded already?
     if (!empty($_DB_DATAOBJECT['INI'][$this->_database])) {
         // database loaded - but this is table is not available..
         if (empty($_DB_DATAOBJECT['INI'][$this->_database][$this->__table]) && !empty($_DB_DATAOBJECT['CONFIG']['proxy'])) {
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Loading Generator to fetch Schema", 1);
             }
             class_exists('DB_DataObject_Generator') ? '' : (require_once 'DB/DataObject/Generator.php');
             $x = new DB_DataObject_Generator();
             $x->fillTableSchema($this->_database, $this->__table);
         }
         return true;
     }
     if (empty($_DB_DATAOBJECT['CONFIG'])) {
         DB_DataObject::_loadConfig();
     }
     // if you supply this with arguments, then it will take those
     // as the database and links array...
     $schemas = isset($_DB_DATAOBJECT['CONFIG']['schema_location']) ? array("{$_DB_DATAOBJECT['CONFIG']['schema_location']}/{$this->_database}.ini") : array();
     if (isset($_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"])) {
         $schemas = is_array($_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"]) ? $_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"] : explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"]);
     }
     $_DB_DATAOBJECT['INI'][$this->_database] = array();
     foreach ($schemas as $ini) {
         if (file_exists($ini) && is_file($ini)) {
             $_DB_DATAOBJECT['INI'][$this->_database] = array_merge($_DB_DATAOBJECT['INI'][$this->_database], parse_ini_file($ini, true));
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 if (!is_readable($ini)) {
                     $this->debug("ini file is not readable: {$ini}", "databaseStructure", 1);
                 } else {
                     $this->debug("Loaded ini file: {$ini}", "databaseStructure", 1);
                 }
             }
         } else {
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Missing ini file: {$ini}", "databaseStructure", 1);
             }
         }
     }
     // now have we loaded the structure..
     if (!empty($_DB_DATAOBJECT['INI'][$this->_database][$this->__table])) {
         return true;
     }
     // - if not try building it..
     if (!empty($_DB_DATAOBJECT['CONFIG']['proxy'])) {
         class_exists('DB_DataObject_Generator') ? '' : (require_once 'DB/DataObject/Generator.php');
         $x = new DB_DataObject_Generator();
         $x->fillTableSchema($this->_database, $this->__table);
         // should this fail!!!???
         return true;
     }
     $this->debug("Cant find database schema: {$this->_database}/{$this->__table} \n" . "in links file data: " . print_r($_DB_DATAOBJECT['INI'], true), "databaseStructure", 5);
     // we have to die here!! - it causes chaos if we dont (including looping forever!)
     $this->raiseError("Unable to load schema for database and table (turn debugging up to 5 for full error message)", DB_DATAOBJECT_ERROR_INVALIDARGS, PEAR_ERROR_DIE);
     return false;
 }
 /**
  * Autoload or manually load the table definitions
  *
  *
  * usage :
  * DB_DataObject::databaseStructure(  'databasename',
  *                                    parse_ini_file('mydb.ini',true), 
  *                                    parse_ini_file('mydb.link.ini',true)); 
  *
  * obviously you dont have to use ini files.. (just return array similar to ini files..)
  *  
  * It should append to the table structure array 
  *
  *     
  * @param optional string  name of database to assign / read
  * @param optional array   structure of database, and keys
  * @param optional array  table links
  *
  * @access public
  * @return true or PEAR:error on wrong paramenters.. or false if no file exists..
  *              or the array(tablename => array(column_name=>type)) if called with 1 argument.. (databasename)
  */
 function databaseStructure()
 {
     global $_DB_DATAOBJECT;
     // Assignment code
     if ($args = func_get_args()) {
         if (count($args) == 1) {
             // this returns all the tables and their structure..
             $x = new DB_DataObject();
             $x->_database = $args[0];
             $this->_connect();
             $DB =& $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
             $tables = $DB->getListOf('tables');
             require_once 'DB/DataObject/Generator.php';
             foreach ($tables as $table) {
                 $y = new DB_DataObject_Generator();
                 $y->fillTableSchema($x->_database, $table);
             }
             return $_DB_DATAOBJECT['INI'][$x->_database];
         } else {
             $_DB_DATAOBJECT['INI'][$args[0]] = isset($_DB_DATAOBJECT['INI'][$args[0]]) ? $_DB_DATAOBJECT['INI'][$args[0]] + $args[1] : $args[1];
             if (isset($args[1])) {
                 $_DB_DATAOBJECT['LINKS'][$args[0]] = isset($_DB_DATAOBJECT['LINKS'][$args[0]]) ? $_DB_DATAOBJECT['LINKS'][$args[0]] + $args[2] : $args[2];
             }
             return true;
         }
     }
     if (!$this->_database) {
         $this->_connect();
     }
     // loaded already?
     if (!empty($_DB_DATAOBJECT['INI'][$this->_database])) {
         // database loaded - but this is table is not available..
         if (empty($_DB_DATAOBJECT['INI'][$this->_database][$this->__table])) {
             require_once 'DB/DataObject/Generator.php';
             $x = new DB_DataObject_Generator();
             $x->fillTableSchema($this->_database, $this->__table);
         }
         return true;
     }
     if (empty($_DB_DATAOBJECT['CONFIG'])) {
         DB_DataObject::_loadConfig();
     }
     // if you supply this with arguments, then it will take those
     // as the database and links array...
     $schemas = isset($_DB_DATAOBJECT['CONFIG']['schema_location']) ? array("{$_DB_DATAOBJECT['CONFIG']['schema_location']}/{$this->_database}.ini") : array();
     if (isset($_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"])) {
         $schemas = is_array($_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"]) ? $_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"] : explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"]);
     }
     foreach ($schemas as $ini) {
         $links = isset($_DB_DATAOBJECT['CONFIG']["links_{$this->_database}"]) ? $_DB_DATAOBJECT['CONFIG']["links_{$this->_database}"] : str_replace('.ini', '.links.ini', $ini);
         if (file_exists($ini) && is_file($ini)) {
             $_DB_DATAOBJECT['INI'][$this->_database] = parse_ini_file($ini, true);
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Loaded ini file: {$ini}", "databaseStructure", 1);
             }
         } else {
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Missing ini file: {$ini}", "databaseStructure", 1);
             }
         }
         if (empty($_DB_DATAOBJECT['LINKS'][$this->_database]) && file_exists($links) && is_file($links)) {
             /* not sure why $links = ... here  - TODO check if that works */
             $_DB_DATAOBJECT['LINKS'][$this->_database] = parse_ini_file($links, true);
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Loaded links.ini file: {$links}", "databaseStructure", 1);
             }
         } else {
             if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
                 $this->debug("Missing links.ini file: {$links}", "databaseStructure", 1);
             }
         }
     }
     // now have we loaded the structure.. - if not try building it..
     if (empty($_DB_DATAOBJECT['INI'][$this->_database][$this->__table])) {
         require_once 'DB/DataObject/Generator.php';
         $x = new DB_DataObject_Generator();
         $x->fillTableSchema($this->_database, $this->__table);
     }
     return true;
 }