/** * all the RDBMS specific things needed close a DB connection * * @access private */ function _doQuery($query, $first = 0, $limit = 0, $prepared_query = 0) { $lobs = 0; $success = MDB_OK; $result = 0; $descriptors = array(); if ($prepared_query) { $columns = ''; $variables = ''; for (reset($this->clobs[$prepared_query]), $clob = 0; $clob < count($this->clobs[$prepared_query]); $clob++, next($this->clobs[$prepared_query])) { $position = key($this->clobs[$prepared_query]); if (gettype($descriptors[$position] = @OCINewDescriptor($this->connection, OCI_D_LOB)) != 'object') { $success = $this->raiseError(MDB_ERROR, NULL, NULL, 'Do query: Could not create descriptor for clob parameter'); break; } $columns .= ($lobs == 0 ? ' RETURNING ' : ',') . $this->prepared_queries[$prepared_query - 1]['Fields'][$position - 1]; $variables .= ($lobs == 0 ? ' INTO ' : ',') . ':clob' . $position; $lobs++; } if (!MDB::isError($success)) { for (reset($this->blobs[$prepared_query]), $blob = 0; $blob < count($this->blobs[$prepared_query]); $blob++, next($this->blobs[$prepared_query])) { $position = key($this->blobs[$prepared_query]); if (gettype($descriptors[$position] = @OCINewDescriptor($this->connection, OCI_D_LOB)) != 'object') { $success = $this->raiseError(MDB_ERROR, NULL, NULL, 'Do query: Could not create descriptor for blob parameter'); break; } $columns .= ($lobs == 0 ? ' RETURNING ' : ',') . $this->prepared_queries[$prepared_query - 1]['Fields'][$position - 1]; $variables .= ($lobs == 0 ? ' INTO ' : ',') . ':blob' . $position; $lobs++; } $query .= $columns . $variables; } } if (!MDB::isError($success)) { if ($statement = @OCIParse($this->connection, $query)) { if ($lobs) { for (reset($this->clobs[$prepared_query]), $clob = 0; $clob < count($this->clobs[$prepared_query]); $clob++, next($this->clobs[$prepared_query])) { $position = key($this->clobs[$prepared_query]); if (!@OCIBindByName($statement, ':clob' . $position, $descriptors[$position], -1, OCI_B_CLOB)) { $success = $this->oci8RaiseError(NULL, 'Do query: Could not bind clob upload descriptor'); break; } } if (!MDB::isError($success)) { for (reset($this->blobs[$prepared_query]), $blob = 0; $blob < count($this->blobs[$prepared_query]); $blob++, next($this->blobs[$prepared_query])) { $position = key($this->blobs[$prepared_query]); if (!@OCIBindByName($statement, ':blob' . $position, $descriptors[$position], -1, OCI_B_BLOB)) { $success = $this->oci8RaiseError(NULL, 'Do query: Could not bind blob upload descriptor'); break; } } } } if (!MDB::isError($success)) { if ($result = @OCIExecute($statement, $lobs == 0 && $this->auto_commit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT)) { if ($lobs) { for (reset($this->clobs[$prepared_query]), $clob = 0; $clob < count($this->clobs[$prepared_query]); $clob++, next($this->clobs[$prepared_query])) { $position = key($this->clobs[$prepared_query]); $clob_stream = $this->prepared_queries[$prepared_query - 1]['Values'][$position - 1]; for ($value = ''; !$this->endOfLOB($clob_stream);) { if ($this->readLOB($clob_stream, $data, $this->getOption('lob_buffer_length')) < 0) { $success = $this->raiseError(); break; } $value .= $data; } if (!MDB::isError($success) && !$descriptors[$position]->save($value)) { $success = $this->oci8RaiseError(NULL, 'Do query: Could not upload clob data'); } } if (!MDB::isError($success)) { for (reset($this->blobs[$prepared_query]), $blob = 0; $blob < count($this->blobs[$prepared_query]); $blob++, next($this->blobs[$prepared_query])) { $position = key($this->blobs[$prepared_query]); $blob_stream = $this->prepared_queries[$prepared_query - 1]['Values'][$position - 1]; for ($value = ''; !$this->endOfLOB($blob_stream);) { if ($this->readLOB($blob_stream, $data, $this->getOption('lob_buffer_length')) < 0) { $success = $this->raiseError(); break; } $value .= $data; } if (!MDB::isError($success) && !$descriptors[$position]->save($value)) { $success = $this->oci8RaiseError(NULL, 'Do query: Could not upload blob data'); } } } } if ($this->auto_commit) { if ($lobs) { if (MDB::isError($success)) { if (!@OCIRollback($this->connection)) { $success = $this->oci8RaiseError(NULL, 'Do query: ' . $success->getUserinfo() . ' and then could not rollback LOB updating transaction'); } } else { if (!@OCICommit($this->connection)) { $success = $this->oci8RaiseError(NULL, 'Do query: Could not commit pending LOB updating transaction'); } } } } else { $this->uncommitedqueries++; } if (!MDB::isError($success)) { switch (@OCIStatementType($statement)) { case 'SELECT': $result_value = intval($statement); $this->current_row[$result_value] = -1; if ($limit > 0) { $this->limits[$result_value] = array($first, $limit, 0); } $this->highest_fetched_row[$result_value] = -1; break; default: $this->affected_rows = @OCIRowCount($statement); @OCIFreeCursor($statement); break; } $result = $statement; } } else { return $this->oci8RaiseError($statement, 'Do query: Could not execute query'); } } } else { return $this->oci8RaiseError(NULL, 'Do query: Could not parse query'); } } for (reset($descriptors), $descriptor = 0; $descriptor < count($descriptors); $descriptor++, next($descriptors)) { @OCIFreeDesc($descriptors[key($descriptors)]); } return $result; }
function DoQuery($query, $first = 0, $limit = 0, $prepared_query = 0) { $lobs = 0; $success = 1; $result = 0; $descriptors = array(); if ($prepared_query) { $columns = ""; $variables = ""; for (Reset($this->clobs[$prepared_query]), $clob = 0; $clob < count($this->clobs[$prepared_query]); $clob++, Next($this->clobs[$prepared_query])) { $position = Key($this->clobs[$prepared_query]); if (GetType($descriptors[$position] = OCINewDescriptor($this->connection, OCI_D_LOB)) != "object") { $this->SetError("Do query", "Could not create descriptor for clob parameter"); $success = 0; break; } $columns .= ($lobs == 0 ? " RETURNING " : ",") . $this->prepared_queries[$prepared_query - 1]["Fields"][$position - 1]; $variables .= ($lobs == 0 ? " INTO " : ",") . ":clob" . $position; $lobs++; } if ($success) { for (Reset($this->blobs[$prepared_query]), $blob = 0; $blob < count($this->blobs[$prepared_query]); $blob++, Next($this->blobs[$prepared_query])) { $position = Key($this->blobs[$prepared_query]); if (GetType($descriptors[$position] = OCINewDescriptor($this->connection, OCI_D_LOB)) != "object") { $this->SetError("Do query", "Could not create descriptor for blob parameter"); $success = 0; break; } $columns .= ($lobs == 0 ? " RETURNING " : ",") . $this->prepared_queries[$prepared_query - 1]["Fields"][$position - 1]; $variables .= ($lobs == 0 ? " INTO " : ",") . ":blob" . $position; $lobs++; } $query .= $columns . $variables; } } if ($success) { if ($statement = OCIParse($this->connection, $query)) { if ($lobs) { for (Reset($this->clobs[$prepared_query]), $clob = 0; $clob < count($this->clobs[$prepared_query]); $clob++, Next($this->clobs[$prepared_query])) { $position = Key($this->clobs[$prepared_query]); if (!OCIBindByName($statement, ":clob" . $position, $descriptors[$position], -1, OCI_B_CLOB)) { $this->SetOCIError("Do query", "Could not bind clob upload descriptor", OCIError($statement)); $success = 0; break; } } if ($success) { for (Reset($this->blobs[$prepared_query]), $blob = 0; $blob < count($this->blobs[$prepared_query]); $blob++, Next($this->blobs[$prepared_query])) { $position = Key($this->blobs[$prepared_query]); if (!OCIBindByName($statement, ":blob" . $position, $descriptors[$position], -1, OCI_B_BLOB)) { $this->SetOCIError("Do query", "Could not bind blob upload descriptor", OCIError($statement)); $success = 0; break; } } } } if ($success) { if ($result = @OCIExecute($statement, $lobs == 0 && $this->auto_commit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT)) { if ($lobs) { for (Reset($this->clobs[$prepared_query]), $clob = 0; $clob < count($this->clobs[$prepared_query]); $clob++, Next($this->clobs[$prepared_query])) { $position = Key($this->clobs[$prepared_query]); $clob_stream = $this->prepared_queries[$prepared_query - 1]["Values"][$position - 1]; for ($value = ""; !MetabaseEndOfLOB($clob_stream);) { if (MetabaseReadLOB($clob_stream, $data, $this->lob_buffer_length) < 0) { $this->SetError("Do query", MetabaseLOBError($clob)); $success = 0; break; } $value .= $data; } if ($success && !$descriptors[$position]->save($value)) { $this->SetOCIError("Do query", "Could not upload clob data", OCIError($statement)); $success = 0; } } if ($success) { for (Reset($this->blobs[$prepared_query]), $blob = 0; $blob < count($this->blobs[$prepared_query]); $blob++, Next($this->blobs[$prepared_query])) { $position = Key($this->blobs[$prepared_query]); $blob_stream = $this->prepared_queries[$prepared_query - 1]["Values"][$position - 1]; for ($value = ""; !MetabaseEndOfLOB($blob_stream);) { if (MetabaseReadLOB($blob_stream, $data, $this->lob_buffer_length) < 0) { $this->SetError("Do query", MetabaseLOBError($blob)); $success = 0; break; } $value .= $data; } if ($success && !$descriptors[$position]->save($value)) { $this->SetOCIError("Do query", "Could not upload blob data", OCIError($statement)); $success = 0; } } } } if ($this->auto_commit) { if ($lobs) { if ($success) { if (!OCICommit($this->connection)) { $this->SetOCIError("Do query", "Could not commit pending LOB updating transaction", OCIError()); $success = 0; } } else { if (!OCIRollback($this->connection)) { $this->SetOCIError("Do query", $this->Error() . " and then could not rollback LOB updating transaction", OCIError()); } } } } else { $this->uncommitedqueries++; } if ($success) { switch (OCIStatementType($statement)) { case "SELECT": $result_value = intval($statement); $this->current_row[$result_value] = -1; if ($limit > 0) { $this->limits[$result_value] = array($first, $limit, 0); } $this->highest_fetched_row[$result_value] = -1; break; default: $this->affected_rows = OCIRowCount($statement); OCIFreeCursor($statement); break; } $result = $statement; } } else { $this->SetOCIError("Do query", "Could not execute query", OCIError($statement)); } } } else { $this->SetOCIError("Do query", "Could not parse query", OCIError($statement)); } } for (Reset($descriptors), $descriptor = 0; $descriptor < count($descriptors); $descriptor++, Next($descriptors)) { @OCIFreeDesc($descriptors[Key($descriptors)]); } return $result; }