예제 #1
0
 /**
  * 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;
 }
예제 #2
0
 /**
  * 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;
 }
예제 #3
0
 /**
  * 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;
     }
 }
예제 #4
0
 /**
  * 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;
 }
예제 #5
0
 /**
  * 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;
 }
예제 #6
0
 /**
  * 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;
 }
예제 #7
0
 /**
  * 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();
 }