DB::sqlite update
| From: | Mika Tuupola | Date: | Tue, 01 Jul 2003 10:46:13 +0000 |
| Subject: | DB::sqlite update | ||
| Groups: | php.pear.dev | ||
| Request: | Send a blank email to pear-dev+get-17874@lists.php.net to get a copy of this message | ||
I have working support for sequences for DB::sqlite driver
waiting for commit. Should I go ahead?
The test for sequences fails only because of differing error
message
-cut-
tests/driver#cat 05sequences.diff
001- DB Error: no such table
001+ DB Error: no error
002- DB Error: no such table <- good error catched
002+ DB Error: no error <- good error catched
-cut-
AFAIK sqlite returns
#define SQLITE_ERROR 1
trying to query again nonexistant table. Here are the rest
of the tests.
Running selected tests.
PASS DB_driver::connect test [01connect.phpt]
PASS DB_driver::fetch test [02fetch.phpt]
PASS DB_driver::simpleQuery test [03simplequery.phpt]
PASS DB_driver::numCols test [04numcols.phpt]
FAIL DB_driver::sequences [05sequences.phpt]
PASS DB_driver::prepare/execute test [06prepexec.phpt]
PASS DB_driver::affectedRows test [08affectedrows.phpt]
PASS DB_driver::numRows test [09numrows.phpt]
FAIL DB_driver::error mapping [10errormap.phpt]
FAIL DB_driver::row limit [13limit.phpt]
PASS DB_driver::fetchmode object [14fetchmode_object.phpt]
FAIL DB_driver::escape data test [15quote.phpt]
FAIL DB_driver::bug22328 [bug22328.phpt]
Patch follows (i know it still needs some polishing, but
atleast provides working sequences):
-cut-
--- sqlite.php.org 2003-07-01 13:42:46.970000000 +0300
+++ sqlite.php 2003-07-01 13:30:37.370013000 +0300
@@ -126,9 +126,11 @@
'transactions' => false,
'limit' => 'emulate'
);
+/*
$this->options = array (
'optimize' => 'portability'
);
+*/
// SQLite data types, http://www.sqlite.org/datatypes.html
$this->keywords = array (
@@ -150,8 +152,9 @@
"VARYING" => ""
);
$this->errorcode_map = array(
+ 1 => DB_ERROR_SYNTAX,
+
1004 => DB_ERROR_CANNOT_CREATE,
- 1005 => DB_ERROR_CANNOT_CREATE,
1006 => DB_ERROR_CANNOT_CREATE,
1007 => DB_ERROR_ALREADY_EXISTS,
1008 => DB_ERROR_CANNOT_DROP,
@@ -248,19 +251,22 @@
$ismanip = DB::isManip($query);
$this->last_query = $query;
$query = $this->_modifyQuery($query);
-
$result = @sqlite_query($query, $this->connection);
$this->result = $result;
- if (!$this->result ) {
+ if (!$this->result ) {
$errno = sqlite_last_error($this->connection );
if (!$errno) {
return null;
}
return $this->sqliteRaiseError($errno);
}
-
- if (gettype($result) === "resource") {
+
+ /* sqlite_query() seems to allways return a resource */
+ /* so cant use that */
+ if (!$ismanip) {
$numRows = $this->numRows($result);
+
+ /* if numRows() returnet PEAR_Error */
if (is_object($numRows )) {
return $numRows;
}
@@ -400,7 +406,7 @@
*/
function numRows($result) {
$rows = @sqlite_num_rows($result);
- if (!$rows) {
+ if (!is_integer($rows)) {
return $this->raiseError();
}
return $rows;
@@ -430,6 +436,53 @@
return sqlite_last_insert_rowid($this->connection );
}
+ function dropSequence($seq_name)
+ {
+ $seqname = $this->getSequenceName($seq_name);
+ return $this->query("DROP TABLE $seqname");
+ }
+
+
+ function createSequence($seq_name)
+ {
+ $seqname = $this->getSequenceName($seq_name);
+ $query = 'CREATE TABLE ' . $seqname .
+ ' (id INTEGER UNSIGNED PRIMARY KEY) ';
+ $result = $this->query($query);
+ if (DB::isError($result)) {
+ return($result);
+ }
+ }
+
+ function nextId($seq_name, $ondemand = true)
+ {
+ $seqname = $this->getSequenceName($seq_name);
+
+ do {
+ $repeat = 0;
+ $this->pushErrorHandling(PEAR_ERROR_RETURN);
+ $result = $this->query("INSERT INTO $seqname VALUES (NULL)");
+ $this->popErrorHandling();
+ if ($result == DB_OK) {
+ $id = sqlite_last_insert_rowid($this->connection);
+ if ($id != 0) {
+ return $id;
+ }
+ } elseif ($ondemand && DB::isError($result) &&
+ $result->getCode() == 1) {
+ $result = $this->createSequence($seq_name);
+ if (DB::isError($result)) {
+ return $this->raiseError($result);
+ } else {
+ $repeat = 1;
+ }
+ }
+ } while ($repeat);
+
+ return $this->raiseError($result);
+ }
+
+
// }}}
// {{{ getSpecialQuery()
-cut-
--
Mika Tuupola http://www.appelsiini.net/~tuupola/