| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social 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 Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  | defined('GNUSOCIAL') || die(); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Extended DB_DataObject to improve a few things: | 
					
						
							|  |  |  |  * - free global resources from destructor | 
					
						
							|  |  |  |  * - remove bogus global references from serialized objects | 
					
						
							|  |  |  |  * - don't leak memory when loading already-used .ini files | 
					
						
							|  |  |  |  *   (eg when using the same schema on thousands of databases) | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-06-06 18:29:15 +02:00
										 |  |  | class Safe_DataObject extends GS_DataObject | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Destructor to free global memory resources associated with | 
					
						
							|  |  |  |      * this data object when it's unset or goes out of scope. | 
					
						
							|  |  |  |      * DB_DataObject doesn't do this yet by itself. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |     public function __destruct() | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->free(); | 
					
						
							|  |  |  |         if (method_exists('DB_DataObject', '__destruct')) { | 
					
						
							|  |  |  |             parent::__destruct(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-15 15:41:57 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Magic function called at clone() time. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * We use this to drop connection with some global resources. | 
					
						
							|  |  |  |      * This supports the fairly common pattern where individual | 
					
						
							|  |  |  |      * items being read in a loop via a single object are cloned | 
					
						
							|  |  |  |      * for individual processing, then fall out of scope when the | 
					
						
							|  |  |  |      * loop comes around again. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * As that triggers the destructor, we want to make sure that | 
					
						
							|  |  |  |      * the original object doesn't have its database result killed. | 
					
						
							|  |  |  |      * It will still be freed properly when the original object | 
					
						
							|  |  |  |      * gets destroyed. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |     public function __clone() | 
					
						
							| 
									
										
										
										
											2010-03-15 15:41:57 -07:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->_DB_resultid = false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Magic function called at serialize() time. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * We use this to drop a couple process-specific references | 
					
						
							|  |  |  |      * from DB_DataObject which can cause trouble in future | 
					
						
							|  |  |  |      * processes. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array of variable names to include in serialization. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |     public function __sleep() | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $vars = array_keys(get_object_vars($this)); | 
					
						
							|  |  |  |         $skip = array('_DB_resultid', '_link_loaded'); | 
					
						
							|  |  |  |         return array_diff($vars, $skip); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Magic function called at unserialize() time. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Clean out some process-specific variables which might | 
					
						
							|  |  |  |      * be floating around from a previous process's cached | 
					
						
							|  |  |  |      * objects. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Old cached objects may still have them. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |     public function __wakeup() | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         // Refers to global state info from a previous process.
 | 
					
						
							|  |  |  |         // Clear this out so we don't accidentally break global
 | 
					
						
							|  |  |  |         // state in *this* process.
 | 
					
						
							|  |  |  |         $this->_DB_resultid = null; | 
					
						
							|  |  |  |         // We don't have any local DBO refs, so clear these out.
 | 
					
						
							|  |  |  |         $this->_link_loaded = false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-19 12:38:14 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Magic function called when someone attempts to call a method | 
					
						
							|  |  |  |      * that doesn't exist. DB_DataObject uses this to implement | 
					
						
							|  |  |  |      * setters and getters for fields, but neglects to throw an error | 
					
						
							|  |  |  |      * when you just misspell an actual method name. This leads to | 
					
						
							|  |  |  |      * silent failures which can cause all kinds of havoc. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $method | 
					
						
							|  |  |  |      * @param array $params | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      * @throws Exception | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |     public function __call($method, $params) | 
					
						
							| 
									
										
										
										
											2010-03-19 12:38:14 -07:00
										 |  |  |     { | 
					
						
							|  |  |  |         $return = null; | 
					
						
							|  |  |  |         // Yes, that's _call with one underscore, which does the
 | 
					
						
							|  |  |  |         // actual implementation.
 | 
					
						
							|  |  |  |         if ($this->_call($method, $params, $return)) { | 
					
						
							|  |  |  |             return $return; | 
					
						
							|  |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2010-07-30 19:15:07 +02:00
										 |  |  |             // Low level exception. No need for i18n as discussed with Brion.
 | 
					
						
							| 
									
										
										
										
											2010-03-19 12:38:14 -07:00
										 |  |  |             throw new Exception('Call to undefined method ' . | 
					
						
							|  |  |  |                 get_class($this) . '::' . $method); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Work around memory-leak bugs... | 
					
						
							|  |  |  |      * Had to copy-paste the whole function in order to patch a couple lines of it. | 
					
						
							|  |  |  |      * Would be nice if this code was better factored. | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |      * @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) | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |     public function databaseStructure() | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         global $_DB_DATAOBJECT; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |         if (!empty($args = func_get_args())) { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             if (count($args) == 1) { | 
					
						
							|  |  |  |                 // this returns all the tables and their structure..
 | 
					
						
							|  |  |  |                 if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                     $this->debug( | 
					
						
							|  |  |  |                         'Loading Generator as databaseStructure called with args', | 
					
						
							|  |  |  |                         1 | 
					
						
							|  |  |  |                     ); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 $x = new DB_DataObject; | 
					
						
							|  |  |  |                 $x->_database = $args[0]; | 
					
						
							|  |  |  |                 $this->_connect(); | 
					
						
							|  |  |  |                 $DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 $tables = $DB->getListOf('tables'); | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |                 class_exists('DB_DataObject_Generator') ? '' : | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                     require_once 'DB/DataObject/Generator.php'; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                 foreach ($tables as $table) { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                     $y = new DB_DataObject_Generator; | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                     $y->fillTableSchema($x->_database, $table); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |                 return $_DB_DATAOBJECT['INI'][$x->_database]; | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 $_DB_DATAOBJECT['INI'][$args[0]] = isset($_DB_DATAOBJECT['INI'][$args[0]]) ? | 
					
						
							|  |  |  |                     $_DB_DATAOBJECT['INI'][$args[0]] + $args[1] : $args[1]; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 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(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         // loaded already?
 | 
					
						
							|  |  |  |         if (!empty($_DB_DATAOBJECT['INI'][$this->_database])) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             // database loaded - but this is table is not available..
 | 
					
						
							|  |  |  |             if ( | 
					
						
							| 
									
										
										
										
											2015-06-06 19:35:10 +02:00
										 |  |  |                     empty($_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()]) | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                     && !empty($_DB_DATAOBJECT['CONFIG']['proxy']) | 
					
						
							|  |  |  |                 ) { | 
					
						
							|  |  |  |                 if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                     $this->debug('Loading Generator to fetch Schema', 1); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |                 class_exists('DB_DataObject_Generator') ? '' : | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                     require_once 'DB/DataObject/Generator.php'; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 $x = new DB_DataObject_Generator; | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                 $x->fillTableSchema($this->_database, $this->tableName()); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         if (empty($_DB_DATAOBJECT['CONFIG'])) { | 
					
						
							| 
									
										
										
										
											2015-06-06 18:29:15 +02:00
										 |  |  |             self::_loadConfig(); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         // if you supply this with arguments, then it will take those
 | 
					
						
							|  |  |  |         // as the database and links array...
 | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         $schemas = isset($_DB_DATAOBJECT['CONFIG']['schema_location']) ? | 
					
						
							|  |  |  |             array("{$_DB_DATAOBJECT['CONFIG']['schema_location']}/{$this->_database}.ini") : | 
					
						
							|  |  |  |             array() ; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         if (isset($_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"])) { | 
					
						
							|  |  |  |             $schemas = is_array($_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"]) ? | 
					
						
							|  |  |  |                 $_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"] : | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                 explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']["ini_{$this->_database}"]); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         /* BEGIN CHANGED FROM UPSTREAM */ | 
					
						
							|  |  |  |         $_DB_DATAOBJECT['INI'][$this->_database] = $this->parseIniFiles($schemas); | 
					
						
							|  |  |  |         /* END CHANGED FROM UPSTREAM */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |         // now have we loaded the structure..
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-06 19:35:10 +02:00
										 |  |  |         if (!empty($_DB_DATAOBJECT['INI'][$this->_database][$this->tableName()])) { | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         // - if not try building it..
 | 
					
						
							|  |  |  |         if (!empty($_DB_DATAOBJECT['CONFIG']['proxy'])) { | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |             class_exists('DB_DataObject_Generator') ? '' : | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                 require_once 'DB/DataObject/Generator.php'; | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             $x = new DB_DataObject_Generator; | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |             $x->fillTableSchema($this->_database, $this->tableName()); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |             // should this fail!!!???
 | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |         $this->debug( | 
					
						
							|  |  |  |             "Can't find database schema: {$this->_database}/{$this->tableName()}\n" | 
					
						
							|  |  |  |             . 'in links file data: ' | 
					
						
							|  |  |  |             . print_r($_DB_DATAOBJECT['INI'], true), | 
					
						
							|  |  |  |             'databaseStructure', | 
					
						
							|  |  |  |             5 | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |         // we have to die here!! - it causes chaos if we don't (including looping forever!)
 | 
					
						
							| 
									
										
										
										
											2010-07-30 19:15:07 +02:00
										 |  |  |         // Low level exception. No need for i18n as discussed with Brion.
 | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |         $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 | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** For parseIniFiles */ | 
					
						
							|  |  |  |     protected static $iniCache = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * When switching site configurations, DB_DataObject was loading its | 
					
						
							|  |  |  |      * .ini files over and over, leaking gobs of memory. | 
					
						
							|  |  |  |      * This refactored helper function uses a local cache of .ini files | 
					
						
							|  |  |  |      * to minimize the leaks. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array of .ini file names $schemas | 
					
						
							|  |  |  |      * @return array | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2013-08-29 10:27:39 +02:00
										 |  |  |     protected function parseIniFiles(array $schemas) | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $key = implode("|", $schemas); | 
					
						
							|  |  |  |         if (!isset(Safe_DataObject::$iniCache[$key])) { | 
					
						
							|  |  |  |             $data = array(); | 
					
						
							|  |  |  |             foreach ($schemas as $ini) { | 
					
						
							|  |  |  |                 if (file_exists($ini) && is_file($ini)) { | 
					
						
							|  |  |  |                     $data = array_merge($data, parse_ini_file($ini, true)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-29 13:18:41 +02:00
										 |  |  |                     if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                         if (!is_readable($ini)) { | 
					
						
							|  |  |  |                             $this->debug( | 
					
						
							|  |  |  |                                 "ini file is not readable: {$ini}", | 
					
						
							|  |  |  |                                 'databaseStructure', | 
					
						
							|  |  |  |                                 1 | 
					
						
							|  |  |  |                             ); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                         } else { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                             $this->debug( | 
					
						
							|  |  |  |                                 "Loaded ini file: {$ini}", | 
					
						
							|  |  |  |                                 'databaseStructure', | 
					
						
							|  |  |  |                                 1 | 
					
						
							|  |  |  |                             ); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { | 
					
						
							| 
									
										
										
										
											2020-09-08 12:42:51 +03:00
										 |  |  |                         $this->debug( | 
					
						
							|  |  |  |                             "Missing ini file: {$ini}", | 
					
						
							|  |  |  |                             'databaseStructure', | 
					
						
							|  |  |  |                             1 | 
					
						
							|  |  |  |                         ); | 
					
						
							| 
									
										
										
										
											2010-02-16 09:01:59 -08:00
										 |  |  |                     } | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             Safe_DataObject::$iniCache[$key] = $data; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return Safe_DataObject::$iniCache[$key]; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |