/** * Executes a query. * * @param string $query * @param MDB2_Statement_Common $sth * @return MDB2_Result_Common|integer * @throws PIECE_ORM_ERROR_CANNOT_INVOKE * @throws PIECE_ORM_ERROR_UNEXPECTED_VALUE * @throws PIECE_ORM_ERROR_CONSTRAINT */ function &execute($query, $sth) { $dbh =& $this->_mapper->getConnection(); PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); if (!$this->_isManip) { $result =& $dbh->query($query); } else { if (is_null($sth)) { $result = $dbh->exec($query); } else { if (!is_subclass_of($sth, 'MDB2_Statement_Common')) { PEAR::staticPopErrorHandling(); Piece_ORM_Error::push(PIECE_ORM_ERROR_UNEXPECTED_VALUE, 'An unexpected value detected. executeQuery() with a prepared statement can only receive a MDB2_Statement_Common object.'); $return = null; return $return; } $result = $sth->execute(); } } PEAR::staticPopErrorHandling(); $this->_mapper->setLastQuery($dbh->last_query); if (MDB2::isError($result)) { if ($result->getCode() == MDB2_ERROR_CONSTRAINT) { $code = PIECE_ORM_ERROR_CONSTRAINT; } else { $code = PIECE_ORM_ERROR_CANNOT_INVOKE; } Piece_ORM_Error::pushPEARError($result, $code, "Failed to invoke MDB2_Driver_{$dbh->phptype}::query() for any reasons."); $return = null; return $return; } return $result; }
/** * Loads a value with a result object. * * @param MDB2_Result &$result * @return string * @throws PIECE_ORM_ERROR_CANNOT_INVOKE * @since Method available since Release 0.3.0 */ function _loadValue(&$result) { PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $value = $result->fetchOne(); PEAR::staticPopErrorHandling(); if (MDB2::isError($value)) { Piece_ORM_Error::pushPEARError($value, PIECE_ORM_ERROR_CANNOT_INVOKE, "Failed to invoke MDB2_Driver_{$this->_dbh->phptype}::fetchOne() for any reasons."); return; } return $value; }
/** * Returns the value of an ID field if a table has an ID field. * * @return integer * @throws PIECE_ORM_ERROR_CANNOT_INVOKE * @since Method available since Release 1.1.0 */ function _getLastInsertID() { if ($this->_metadata->hasID()) { $dbh =& $this->_mapper->getConnection(); PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $id = $dbh->lastInsertID($this->_metadata->getTableName(true), $this->_metadata->getPrimaryKey()); PEAR::staticPopErrorHandling(); if (MDB2::isError($id)) { Piece_ORM_Error::pushPEARError($id, PIECE_ORM_ERROR_CANNOT_INVOKE, "Failed to invoke MDB2_Driver_{$this->_dbh->phptype}::lastInsertID() for any reasons."); return; } return $id; } }
/** * Loads the LOB data of this field. * * @return string * @throws PIECE_ORM_ERROR_CANNOT_INVOKE * @throws PIECE_ORM_ERROR_UNEXPECTED_VALUE */ function load() { PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $datatype =& $this->_dbh->loadModule('Datatype'); PEAR::staticPopErrorHandling(); if (MDB2::isError($datatype)) { Piece_ORM_Error::pushPEARError($datatype, PIECE_ORM_ERROR_CANNOT_INVOKE, 'Failed to invoke $dbh->loadModule() for any reasons.'); return; } PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $lob = $datatype->convertResult($this->_value, $this->_metadata->getDatatype($this->_fieldName)); PEAR::staticPopErrorHandling(); if (MDB2::isError($lob)) { Piece_ORM_Error::pushPEARError($lob, PIECE_ORM_ERROR_CANNOT_INVOKE, 'Failed to invoke $datatype->convertResult() for any reasons.'); return; } if (!is_resource($lob)) { Piece_ORM_Error::push(PIECE_ORM_ERROR_UNEXPECTED_VALUE, 'An unexpected value detected. $datatype->convertResult() should return a resource.'); return; } $data = ''; while (!feof($lob)) { $data .= fread($lob, 8192); } $datatype->destroyLOB($lob); return $data; }
/** * Gets the database handle for the current database. * * @return MDB2_Driver_Common * @throws PIECE_ORM_ERROR_CANNOT_INVOKE */ function &getConnection() { PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $dbh =& MDB2::singleton($this->getDSN(), $this->getOptions()); PEAR::staticPopErrorHandling(); if (MDB2::isError($dbh)) { Piece_ORM_Error::pushPEARError($dbh, PIECE_ORM_ERROR_CANNOT_INVOKE, 'Failed to invoke MDB2::singleton() for any reasons.'); $return = null; return $return; } $dbh->setFetchMode(MDB2_FETCHMODE_ASSOC); $nativeTypeMapperClass = 'Piece_ORM_MDB2_NativeTypeMapper_' . ucwords(strtolower(substr(strrchr(get_class($dbh), '_'), 1))); include_once str_replace('_', '/', $nativeTypeMapperClass) . '.php'; $nativeTypeMapper =& new $nativeTypeMapperClass(); $nativeTypeMapper->mapNativeType($dbh); if ($this->getUseMapperNameAsTableName()) { if ($dbh->phptype == 'pgsql') { $dbh->options['quote_identifier'] = true; $dbh->options['portability'] &= ~MDB2_PORTABILITY_FIX_CASE; } elseif ($dbh->phptype == 'mysql') { $dbh->options['portability'] |= MDB2_PORTABILITY_FIX_CASE; $dbh->options['field_case'] = CASE_LOWER; } elseif ($dbh->phptype == 'mssql') { $dbh->options['portability'] |= MDB2_PORTABILITY_FIX_CASE; $dbh->options['field_case'] = CASE_LOWER; } } return $dbh; }
/** * Creates a Piece_ORM_Metadata object from a database. * * @param string $tableName * @return Piece_ORM_Metadata * @throws PIECE_ORM_ERROR_CANNOT_INVOKE * @throws PIECE_ORM_ERROR_NOT_FOUND */ function &_createMetadataFromDatabase($tableName) { $context =& Piece_ORM_Context::singleton(); $dbh =& $context->getConnection(); if (Piece_ORM_Error::hasErrors()) { $return = null; return $return; } PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $result = $dbh->setLimit(1); PEAR::staticPopErrorHandling(); if (MDB2::isError($result)) { Piece_ORM_Error::pushPEARError($result, PIECE_ORM_ERROR_CANNOT_INVOKE, "Failed to invoke MDB2_Driver_{$dbh->phptype}::setLimit() for any reasons."); $return = null; return $return; } PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $result = $dbh->query('SELECT 1 FROM ' . $dbh->quoteIdentifier($tableName)); PEAR::staticPopErrorHandling(); if (MDB2::isError($result)) { if ($result->getCode() != MDB2_ERROR_NOSUCHTABLE) { Piece_ORM_Error::pushPEARError($result, PIECE_ORM_ERROR_CANNOT_INVOKE, "Failed to invoke MDB2_Driver_{$dbh->phptype}::query() for any reasons."); $return = null; return $return; } Piece_ORM_Error::pushPEARError($result, PIECE_ORM_ERROR_NOT_FOUND, "Failed to invoke MDB2_Driver_{$dbh->phptype}::query() for any reasons."); $return = null; return $return; } PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $reverse =& $dbh->loadModule('Reverse'); PEAR::staticPopErrorHandling(); if (MDB2::isError($reverse)) { Piece_ORM_Error::pushPEARError($reverse, PIECE_ORM_ERROR_CANNOT_INVOKE, 'Failed to invoke $dbh->loadModule() for any reasons.'); $return = null; return $return; } if ($dbh->phptype == 'mssql') { include_once 'Piece/ORM/MDB2/Decorator/Reverse/Mssql.php'; $reverse =& new Piece_ORM_MDB2_Decorator_Reverse_Mssql($reverse); } PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $tableInfo = $reverse->tableInfo($tableName); PEAR::staticPopErrorHandling(); if (MDB2::isError($tableInfo)) { Piece_ORM_Error::pushPEARError($tableInfo, PIECE_ORM_ERROR_CANNOT_INVOKE, 'Failed to invoke $reverse->tableInfo() for any reasons.'); $return = null; return $return; } if ($dbh->phptype == 'mysql') { foreach (array_keys($tableInfo) as $fieldName) { if ($tableInfo[$fieldName]['nativetype'] == 'datetime' && $tableInfo[$fieldName]['notnull'] && $tableInfo[$fieldName]['default'] == '0000-00-00 00:00:00') { $tableInfo[$fieldName]['flags'] = str_replace('default_0000-00-00%2000%3A00%3A00', '', $tableInfo[$fieldName]['flags']); $tableInfo[$fieldName]['default'] = ''; } } } $metadata =& new Piece_ORM_Metadata($tableInfo); return $metadata; }
/** * Loads all objects with a result object for the primary query. * * @throws PIECE_ORM_ERROR_CANNOT_INVOKE */ function _loadPrimaryObjects() { $preloadCallback = $this->_mapper->getPreloadCallback(); $preloadCallbackArgs = $this->_mapper->getPreloadCallbackArgs(); PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); for ($i = 0; $row =& $this->_result->fetchRow(); ++$i) { if (MDB2::isError($row)) { PEAR::staticPopErrorHandling(); Piece_ORM_Error::pushPEARError($row, PIECE_ORM_ERROR_CANNOT_INVOKE, "Failed to invoke MDB2_Driver_{$this->_result->db->phptype}::fetchRow() for any reasons."); return; } if (!is_null($preloadCallback)) { $loadObject = call_user_func_array($preloadCallback, array_merge(array(&$row, &$this->_mapper), $preloadCallbackArgs)); } else { $loadObject = true; } if ($loadObject) { $this->_objects[] =& $this->_load($row); } for ($j = 0, $count = count($this->_relationships); $j < $count; ++$j) { $this->_associatedObjectLoaders[$this->_relationships[$j]['type']]->prepareLoading($row, $i, $j); } } PEAR::staticPopErrorHandling(); }