protected function createMongoDBConfig($update_from_config_alt) { require_once "I2CE_MagicDataStorageMongoDB.php"; $db = MDB2::singleton(); if (!($db_name = $db->database_name)) { I2CE::raiseError("No database to connect to MongoDB"); return false; } if (!($db_password = $db->dsn['password'])) { I2CE::raiseError("No password to connect to MongoDB"); return false; } if (!($db_user = $db->dsn['username'])) { I2CE::raiseError("No user to connect to MongoDB"); return false; } $conn_string = "mongodb://localhost"; try { $m = new Mongo($conn_string); } catch (Exception $e) { I2CE::raiseError("Could not connect to mongodb using: " . $conn_string); return false; } if (!is_array($dbs = $m->listDBs()) || !array_key_exists('databases', $dbs) || !is_array($dbs['databases'])) { I2CE::raiseError("MongoDB: {$db_name} needs to be created"); //this is done automatically when we select below } else { $found = false; foreach ($dbs['databases'] as $info) { if (!is_array($info) || !array_key_exists('name', $info) || !($info['name'] = $db_name)) { continue; } $found = true; } if (!$found) { I2CE::raiseError("MongoDB: The database {$db_name} needs to be created:" . print_r($dbs, true)); } } $new_coll = false; if (!($mdb = $m->selectDB($db_name)) instanceof MongoDB) { I2CE::raiseError("Cannont connect to mongo database {$db_name}"); return false; } if (!is_array($mcolls = $mdb->listCollections()) || count($mcolls) == 0 || !in_array($db_name . ".config", $mcolls)) { I2CE::raiseError("MongoDB: collection {$db_name}.config needs to be created"); //this is done automatically when we select below $new_coll = true; } if (!($mcoll = $mdb->selectCollection('config')) instanceof MongoCollection) { I2CE::raiseError("Cannot connect to config collection of mongo database {$db_name}"); return false; } if (!I2CE_MagicDataStorageMongoDB::setupIndices($mcoll)) { I2CE::raiseError("Could not setup indices"); return false; } $qry = 'SHOW TABLES LIKE "config_alt"'; $result = $db->query($qry); if (I2CE::pearError($result, "Cannot access database")) { return false; } if ($result->numRows() < 1) { $update_from_config_alt = false; } if ($update_from_config_alt && $new_coll) { $qry_nodes = "SELECT IF( LENGTH(p.parent) > 1, concat(p.parent,'/',p.name),IF (LENGTH(p.name) > 1, CONCAT('/',p.name), '')) as path, p.value as value, p.type as type, \nGROUP_CONCAT(c.name SEPARATOR '/') AS children\nfrom config_alt AS p LEFT JOIN\n config_alt c \nON c.parent = IF( \n LENGTH(p.parent) > 1,\n concat(p.parent,'/',p.name),\n IF( LENGTH(p.name) > 1, CONCAT('/',p.name), CONCAT('/',p.name))\n) \nGROUP BY path"; $res = $db->query($qry_nodes); if (PEAR::isError($res)) { I2CE::raiseError("Could not query existing config_alt"); return false; } I2CE::raiseError("Populating mongodb from config_alt table"); while ($row = $res->fetchRow(MDB2_FETCHMODE_ASSOC)) { if ($row['type'] == '0') { $children = preg_split('/\\//', $row['children'], -1, PREG_SPLIT_NO_EMPTY); } else { $children = null; } $data = array(I2CE_MagicDataStorageMongoDB::PATH => $row['path'], I2CE_MagicDataStorageMongoDB::TYPE => $row['type'], I2CE_MagicDataStorageMongoDB::VALUE => $row['value'], I2CE_MagicDataStorageMongoDB::CHILDREN => $children); if (!is_array($r = $mcoll->insert($data, array("safe" => true))) || array_key_exists('err', $r) && $r['err']) { I2CE::raiseError("Could not inset new node:" . print_r($r, true)); return false; } } } if (!$this->setupMagicDataStorage()) { I2CE::raiseError("Could not setup magic data storage"); } return true; }
/** * Creates the magic data instance. * Sets the mafic data storage mechanisms to be used. * @param boolean $set_config. Defaults to true meaning we set the magic data storage for I2CE * @param boolean $set_config. Defaults to false meaning we dont replace the magic data instance * @returns I2CE_MagicData on success, null on failure */ public static function setupMagicData($set_config = true, $replace = false) { $config_protocol = self::getRuntimeVariable('I2CE_CONFIG_PROTOCOL', 'config_alt'); switch (strtolower($config_protocol)) { case 'mongodb': require_once 'I2CE_MagicDataStorageMongoDB.php'; $config = I2CE_MagicData::instance("config", $replace); $store_mongo = new I2CE_MagicDataStorageMongoDB("config"); if (!$store_mongo->isAvailable()) { I2CE::raiseError("MongoDB config not available. Trying to use original config_alt table"); //the alternative config table has not been created. the config table may be there, so let's try it require_once 'I2CE_MagicDataStorageDBAlt.php'; $store_db = new I2CE_MagicDataStorageDBAlt("config"); if (!$store_db || !$store_db->isAvailable()) { I2CE::raiseError("No persistent caching storage mechanism (apc or memchached) is available. Adding simple memory storage"); require_once 'I2CE_MagicDataStorageMem.php'; $config->addStorage(new I2CE_MagicDataStorageMem()); } else { I2CE::raiseError("Added persistent caching storage mechanism config_alt"); $config->addStorage($store_db); } } else { require_once 'I2CE_MagicDataStorageAPC.php'; $db = MDB2::singleton(); $store_mem = new I2CE_MagicDataStorageAPC($db->database_name . "_config"); if ($store_mem->isAvailable()) { $config->addStorage($store_mem); } } $config->addStorage($store_mongo); //store_mongo may not be available. that's OK on initialization if ($set_config) { self::setConfig($config); } return $config; default: $db = MDB2::singleton(); require_once 'I2CE_MagicDataStorageAPC.php'; require_once 'I2CE_MagicDataStorageDBAlt.php'; $store_db = new I2CE_MagicDataStorageDBAlt("config"); if (!$store_db->isAvailable()) { I2CE::raiseError("Alt config table not available. Trying to use original config table"); //the alternative config table has not been created. the config table may be there, so let's try it require_once 'I2CE_MagicDataStorageDB.php'; $store_db = new I2CE_MagicDataStorageDB("config"); } $config = I2CE_MagicData::instance("config", $replace); $store_mem = new I2CE_MagicDataStorageAPC($db->database_name . "_config"); if ($store_mem->isAvailable()) { $config->addStorage($store_mem); } require_once 'I2CE_MagicDataStorageMemcached.php'; $store_memcached = new I2CE_MagicDataStorageMemcached($db->database_name . '_config'); if ($store_memcached->isAvailable()) { $config->addStorage($store_memcached); } else { I2CE::raiseError("No memcached"); } if (!$store_mem->isAvailable() && !$store_memcached->isAvailable()) { I2CE::raiseError("No persistent caching storage mechanism (apc or memchached) is available. Adding simple memory storage"); require_once 'I2CE_MagicDataStorageMem.php'; $config->addStorage(new I2CE_MagicDataStorageMem()); } $config->addStorage($store_db); //store_dn may not be available. that's OK on initialization if ($set_config) { self::setConfig($config); } return $config; } }