📄 oci8.php
字号:
*
* @return DB statement resource
*/
function prepare($query)
{
$tokens = split('[\&\?]', $query);
$token = 0;
$types = array();
for ($i = 0; $i < strlen($query); $i++) {
switch ($query[$i]) {
case '?':
$types[$token++] = DB_PARAM_SCALAR;
break;
case '&':
$types[$token++] = DB_PARAM_OPAQUE;
break;
}
}
$binds = sizeof($tokens) - 1;
for ($i = 0; $i < $binds; $i++) {
$newquery .= $tokens[$i] . ":bind" . $i;
}
$newquery .= $tokens[$i];
$this->last_query = $query;
$newquery = $this->modifyQuery($newquery);
$stmt = @OCIParse($this->connection, $newquery);
$this->prepare_types[$stmt] = $types;
$this->manip_query[(int)$stmt] = DB::isManip($query);
return $stmt;
}
// }}}
// {{{ execute()
/**
* Executes a DB statement prepared with prepare().
*
* @param $stmt a DB statement resource (returned from prepare())
* @param $data data to be used in execution of the statement
*
* @return int returns an oci8 result resource for successful
* SELECT queries, DB_OK for other successful queries. A DB error
* code is returned on failure.
*/
function execute($stmt, $data = false)
{
$types=&$this->prepare_types[$stmt];
if (($size = sizeof($types)) != sizeof($data)) {
return $this->raiseError(DB_ERROR_MISMATCH);
}
for ($i = 0; $i < $size; $i++) {
if (is_array($data)) {
$pdata[$i] = &$data[$i];
}
else {
$pdata[$i] = &$data;
}
if ($types[$i] == DB_PARAM_OPAQUE) {
$fp = fopen($pdata[$i], "r");
$pdata = '';
if ($fp) {
while (($buf = fread($fp, 4096)) != false) {
$pdata[$i] .= $buf;
}
}
}
if (!@OCIBindByName($stmt, ":bind" . $i, $pdata[$i], -1)) {
return $this->oci8RaiseError($stmt);
}
}
if ($this->autoCommit) {
$success = @OCIExecute($stmt, OCI_COMMIT_ON_SUCCESS);
}
else {
$success = @OCIExecute($stmt, OCI_DEFAULT);
}
if (!$success) {
return $this->oci8RaiseError($stmt);
}
$this->last_stmt = $stmt;
if ($this->manip_query[(int)$stmt]) {
return DB_OK;
} else {
return new DB_result($this, $stmt);
}
}
// }}}
// {{{ autoCommit()
/**
* Enable/disable automatic commits
*
* @param $onoff true/false whether to autocommit
*/
function autoCommit($onoff = false)
{
$this->autoCommit = (bool)$onoff;;
return DB_OK;
}
// }}}
// {{{ commit()
/**
* Commit transactions on the current connection
*
* @return DB_ERROR or DB_OK
*/
function commit()
{
$result = @OCICommit($this->connection);
if (!$result) {
return $this->oci8RaiseError();
}
return DB_OK;
}
// }}}
// {{{ rollback()
/**
* Roll back all uncommitted transactions on the current connection.
*
* @return DB_ERROR or DB_OK
*/
function rollback()
{
$result = @OCIRollback($this->connection);
if (!$result) {
return $this->oci8RaiseError();
}
return DB_OK;
}
// }}}
// {{{ affectedRows()
/**
* Gets the number of rows affected by the last query.
* if the last query was a select, returns 0.
*
* @return number of rows affected by the last query or DB_ERROR
*/
function affectedRows()
{
if ($this->last_stmt === false) {
return $this->oci8RaiseError();
}
$result = @OCIRowCount($this->last_stmt);
if ($result === false) {
return $this->oci8RaiseError($this->last_stmt);
}
return $result;
}
// }}}
// {{{ modifyQuery()
function modifyQuery($query)
{
// "SELECT 2+2" must be "SELECT 2+2 FROM dual" in Oracle
if (preg_match('/^\s*SELECT/i', $query) &&
!preg_match('/\sFROM\s/i', $query)) {
$query .= " FROM dual";
}
return $query;
}
// }}}
// {{{ modifyLimitQuery()
/**
* Emulate the row limit support altering the query
*
* @param string $query The query to treat
* @param int $from The row to start to fetch from
* @param int $count The offset
* @return string The modified query
*
* @author Tomas V.V.Cox <cox@idecnet.com>
*/
function modifyLimitQuery($query, $from, $count)
{
// Find fields (supports UNIONs also)
$t = preg_split('/\s+FROM\s+/is', $query);
$f = preg_replace('/^\s*SELECT\s+/is', '', $t[0]);
// Put the "Order by" statement at the end of the final query
if (preg_match('/\s+ORDER\s+BY\s+.*/is', $query, $match)) {
$orderby = $match[0];
$query = substr($query, 0, -1 * strlen($orderby));
} else {
$orderby = '';
}
// Field parsing: Try to find final column names
$fa = array();
$grab = true;
$tmpbuff = '';
for ($i = 0; $i < strlen($f); $i++) {
// Probably doesn't work if the query contains a funcion without
// alias ("AS"), for ex: to_char(...) as date
if ($f{$i} == '(') { //don't parse commas acting as func params
$grab = false;
} elseif ($f{$i} == ')') {
$grab = true;
}
if (preg_match('/\sAS\s/i', substr($tmpbuff, -4))) {
$tmpbuff = '';
}
if ($f{$i} == ',' && $grab) {
$fa[] = $tmpbuff;
$tmpbuff = '';
continue;
}
$tmpbuff .= $f{$i};
}
$fa[] = $tmpbuff;
$fields = implode(', ', $fa);
// Construct the query
// more at: http://marc.theaimsgroup.com/?l=php-db&m=99831958101212&w=2
$query = "SELECT $fields FROM".
" (SELECT rownum as linenum, $fields FROM".
" ($query)".
" ) ".
"WHERE linenum BETWEEN $from AND ". ($from + $count) .
"$orderby";
return $query;
}
// }}}
// {{{ nextId()
/**
* Get the next value in a sequence. We emulate sequences
* for MySQL. Will create the sequence if it does not exist.
*
* @access public
*
* @param $seq_name the name of the sequence
*
* @param $ondemand whether to create the sequence table on demand
* (default is true)
*
* @return a sequence integer, or a DB error
*/
function nextId($seq_name, $ondemand = true)
{
$sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name);
$repeat = 0;
do {
$result = $this->query("SELECT ${sqn}_seq.nextval FROM dual");
if ($ondemand && DB::isError($result) &&
$result->getCode() == DB_ERROR_NOSUCHTABLE) {
$repeat = 1;
$result = $this->createSequence($seq_name);
if (DB::isError($result)) {
return $result;
}
} else {
$repeat = 0;
}
} while ($repeat);
if (DB::isError($result)) {
return $result;
}
$arr = $result->fetchRow(DB_FETCHMODE_ORDERED);
return $arr[0];
}
// }}}
// {{{ createSequence()
function createSequence($seq_name)
{
$sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name);
return $this->query("CREATE SEQUENCE ${sqn}_seq");
}
// }}}
// {{{ dropSequence()
function dropSequence($seq_name)
{
$sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name);
return $this->query("DROP SEQUENCE ${sqn}_seq");
}
// }}}
// {{{ oci8RaiseError()
function oci8RaiseError($errno = null)
{
if ($errno === null) {
$error = @OCIError($this->connection);
return $this->raiseError($this->errorCode($error['code']),
null, null, null, $error['message']);
} elseif (is_resource($errno)) {
$error = @OCIError($errno);
return $this->raiseError($this->errorCode($error['code']),
null, null, null, $error['message']);
}
return $this->raiseError($this->errorCode($errno));
}
// }}}
// {{{ getSpecialQuery()
/**
* Returns the query needed to get some backend info
* @param string $type What kind of info you want to retrieve
* @return string The SQL query string
*/
function getSpecialQuery($type)
{
switch ($type) {
case 'tables':
$sql = "SELECT table_name FROM user_tables";
break;
default:
return null;
}
return $sql;
}
// }}}
}
// Local variables:
// tab-width: 4
// c-basic-offset: 4
// End:
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -