public static function getQuery($queryid, $params, &$db, $userinfo, $dbtype, $dbSlave) { //init querybuilder if needed if (!isset(self::$queryBuilders[$dbtype])) { $config = vB::getConfig(); $queryClass = 'vB_Db_' . $dbtype . '_QueryBuilder'; self::$queryBuilders[$dbtype] = new $queryClass($db, !empty($config['Misc']['debug_sql']) or !empty($params[self::DEBUG_QUERY])); self::$configDebug = !empty($config['Misc']['debug_sql']); } else { self::$queryBuilders[$dbtype]->setDebugSQL(self::$configDebug or !empty($params[self::DEBUG_QUERY])); } //We need the query type for what happens next. For that we need the querydefs. if (strpos($queryid, ':')) { $values = explode(':', $queryid); if (count($values) > 1) { $class_prefix = $values[0]; $queryid = $values[1]; } } if (isset($class_prefix)) { $classname = $class_prefix . '_dB_' . $dbtype . "_QueryDefs"; $filename = DIR . '/packages/' . strtolower(str_replace('_', '/', $classname)) . '.php'; if (file_exists($filename)) { include_once $filename; } //make sure this is valid if (class_exists($classname, false)) { $class = $classname; } } else { $class = 'vB_Db_' . $dbtype . "_QueryDefs"; } $querydefs = new $class(); $tableData = $querydefs->getTableData(); $queryData = $querydefs->getQueryData(); //First we need to find out what kind of query we have. If it's a table-based query // then we have a "type" in the params array. if (!isset($params[self::TYPE_KEY])) { //We can still recover is this is a method or stored query. if (!empty($queryData[$queryid])) { $params[self::TYPE_KEY] = self::QUERY_STORED; } else { if (method_exists($querydefs, $queryid)) { $params[self::TYPE_KEY] = self::QUERY_METHOD; } else { $params[self::TYPE_KEY] = self::QUERY_SELECT; } } } if (empty($tableData[$queryid]) and in_array($params[self::TYPE_KEY], array(self::QUERY_SELECT, self::QUERY_COUNT, self::QUERY_UPDATE, self::QUERY_INSERT, self::QUERY_INSERTIGNORE, self::QUERY_MULTIPLEINSERT, self::QUERY_DELETE, self::QUERY_REPLACE))) { throw new vB_Exception_Api('invalid_query_definition_x', $queryid); } switch ($params[self::TYPE_KEY]) { case self::QUERY_STORED: $queryClass = 'vB_Db_Query_Stored_' . $dbtype; break; case self::QUERY_SELECT: $queryClass = 'vB_Db_Query_Select_' . $dbtype; break; case self::QUERY_COUNT: $queryClass = 'vB_Db_Query_Count_' . $dbtype; break; case self::QUERY_UPDATE: $queryClass = 'vB_Db_Query_Update_' . $dbtype; break; case self::QUERY_INSERT: $queryClass = 'vB_Db_Query_Insert_' . $dbtype; break; case self::QUERY_INSERTIGNORE: $queryClass = 'vB_Db_Query_InsertIgnore_' . $dbtype; break; case self::QUERY_REPLACE: $queryClass = 'vB_Db_Query_Replace_' . $dbtype; break; case self::QUERY_DELETE: $queryClass = 'vB_Db_Query_Delete_' . $dbtype; break; case self::QUERY_MULTIPLEINSERT: $queryClass = 'vB_Db_Query_MultipleInsert_' . $dbtype; break; case self::QUERY_METHOD: $queryClass = 'vB_Db_Query_Method_' . $dbtype; break; case self::QUERY_CREATE: $queryClass = 'vB_Db_Query_Create_' . $dbtype; break; case self::QUERY_ALTER: $queryClass = 'vB_Db_Query_Alter_' . $dbtype; break; case self::QUERY_DROP: $queryClass = 'vB_Db_Query_Drop_' . $dbtype; break; default: throw new Exception('invalid_query_definition'); } // switch $query = new $queryClass($queryid, $db, $userinfo, $dbSlave); $query->setQueryDefs($querydefs, $queryid); $query->setTableData($tableData, $queryid); $query->setQueryData($queryData); //If we had to build the structure, let's store it and not make another query later. if (!empty($structure)) { $query->setStructure($structure); } return $query; }