DB_Tableで利用されているMDB2について

DB_Tableで利用されているMDB2についてのメモ。

DB_TableではバックエンドのコネクションにMDB2を利用することができる。
この辺いろいろ複雑だけどメモメモ。

実際にDB_Tableを利用してselectとか発行すると
DB/Table/Base.phpの

// get the result
if ($this->backend == 'mdb2') {
$result = $db->extended->$method($sql, null, $params);   // この辺
} else {
switch ($method) {

この辺が呼ばれる。
これの$db->extendedって MDB2/Extended.phpで、

function getAll($query, $types = null, $params = array(),
$param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT,
$rekey = false, $force_array = false, $group = false)
{
$db =& $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
settype($params, 'array');
if (empty($params)) {
return $db->queryAll($query, $types, $fetchmode, true, $force_array\
, $group);
}

この辺が呼ばれる。getDBInstance()はMDB2.phpにあって、

function &getDBInstance()
{
if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
$result =& $GLOBALS['_MDB2_databases'][$this->db_index];
} else {
$result =& MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'could not find MDB2 instance');
}
return $result;
}

こんな感じ。
で、グローバル変数の$GLOBALS[‘_MDB2_databases’]とかってある。
ほんでこの$dbを使ってqueryAll()を呼び出してる。
queryAllはExtended.phpにあって、

function queryAll($query, $types = null, $fetchmode = MDB2_FETCHMODE_DEFAUL
T,
$rekey = false, $force_array = false, $group = false)
{
$result = $this->query($query, $types);
if (!MDB2::isResultCommon($result)) {
return $result;
}

$all = $result->fetchAll($fetchmode, $rekey, $force_array, $group);
$result->free();
return $all;
}

// }}}
}

こんな感じ。
そんで$this->queryはMDB2.phpにあって

function &query($query, $types = null, $result_class = true, $result_wrap_class = false)
{
$offset = $this->offset;
$limit = $this->limit;
$this->offset = $this->limit = 0;
$query = $this->_modifyQuery($query, false, $limit, $offset);

$connection = $this->getConnection();  // このへん!
if (PEAR::isError($connection)) {
return $connection;
}

$result =& $this->_doQuery($query, false, $connection, $this->database_name);
if (PEAR::isError($result)) {
return $result;
}

$result =& $this->_wrapResult($result, $types, $result_class, $result_wrap_class, $limit, $offset);
return $result;
}

で、これの”このへん!”のところでgetConnection()してるけどコイツがMDB2.phpの

function getConnection()
{
$result = $this->connect();
if (PEAR::isError($result)) {
return $result;
}
return $this->connection;
}

これで、$this->connect()がMDB2/Driver/mysql.phpとかにあって

function connect()
{
if (is_resource($this->connection)) {
//if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
if (MDB2::areEquals($this->connected_dsn, $this->dsn)
&& $this->opened_persistent == $this->options['persistent']
) {
return MDB2_OK;
}
$this->disconnect(false);
}

$connection = $this->_doConnect(
$this->dsn['username'],

このへんにありますよ!ってお話!

疲れたー。

コメントを残す