]> gitweb.factorcode.org Git - factor.git/commitdiff
raw sql queries work again
authorDoug Coleman <erg@jobim.local>
Mon, 13 Apr 2009 20:37:29 +0000 (15:37 -0500)
committerDoug Coleman <erg@jobim.local>
Mon, 13 Apr 2009 20:37:29 +0000 (15:37 -0500)
extra/db2/connections/connections.factor
extra/db2/db2.factor
extra/db2/sqlite/connections/connections.factor
extra/db2/sqlite/errors/errors.factor
extra/db2/sqlite/lib/lib.factor
extra/db2/sqlite/result-sets/result-sets.factor
extra/db2/sqlite/statements/statements.factor
extra/db2/statements/statements-tests.factor
extra/db2/statements/statements.factor

index 0caee547260bcc1d85abdfa8e8bdf7b29e4e5777..7957cb918ae770a1c04329316ef40ee2b661f755 100644 (file)
@@ -11,7 +11,6 @@ TUPLE: db-connection handle ;
 
 GENERIC: db-open ( db -- db-connection )
 GENERIC: db-close ( handle  -- )
-HOOK: parse-db-error db-connection ( error -- error' )
 
 M: db-connection dispose ( db-connection -- )
     [ db-close ] [ f >>handle drop ] bi ;
index 16afbd2782fda0803a9dacacc5371cab24d47053..e1723160c095406f8aeee5adf88364cc531772ab 100644 (file)
@@ -18,3 +18,4 @@ PRIVATE>
 
 : sql-query ( sql -- sequence )
     f f <statement> [ statement>result-sequence ] with-disposal ;
+
index ba9869633b63dc39e7b306fc50c223828ccdbf33..b99603f4efbb6e4d5cd30b843796ff2f2f6b00fc 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors combinators db2.connections db2.sqlite
-db2.sqlite.errors db2.sqlite.lib kernel ;
+db2.sqlite.errors db2.sqlite.lib kernel db2.errors ;
 IN: db2.sqlite.connections
 
 TUPLE: sqlite-db-connection < db-connection ;
@@ -15,7 +15,7 @@ M: sqlite-db db-open ( db -- db-connection )
 M: sqlite-db-connection db-close ( db-connection -- )
     handle>> sqlite-close ;
 
-M: sqlite-db-connection parse-db-error ( error -- error' )
+M: sqlite-db-connection parse-sql-error ( error -- error' )
     dup n>> {
         { 1 [ string>> parse-sqlite-sql-error ] }
         [ drop ]
index eff73b679651b9143c9271619e16f3d3deb675c4..61e70f210deb33d0b40fef19037c867d844c4c64 100644 (file)
@@ -8,9 +8,6 @@ IN: db2.sqlite.errors
 ERROR: sqlite-error < db-error n string ;
 ERROR: sqlite-sql-error < sql-error n string ;
 
-: throw-sqlite-error ( n -- * )
-    dup sqlite-error-messages nth sqlite-error ;
-
 : sqlite-statement-error ( -- * )
     SQLITE_ERROR
     db-connection get handle>> sqlite3_errmsg sqlite-sql-error ;
@@ -18,20 +15,21 @@ ERROR: sqlite-sql-error < sql-error n string ;
 TUPLE: unparsed-sqlite-error error ;
 C: <unparsed-sqlite-error> unparsed-sqlite-error
 
-: sqlite-table-error ( table message -- error )
-    {
-        { sql-table-exists [ <sql-table-exists> ] }
-    } case ;
-
 EBNF: parse-sqlite-sql-error
 
-TableMessage = " already exists" => [[ sql-table-exists ]]
+TableMessage = " already exists"
+SyntaxError = ": syntax error"
 
 SqliteError =
     "table " (!(TableMessage).)+:table TableMessage:message
-      => [[ table >string message sqlite-table-error ]]
+      => [[ table >string <sql-table-exists> ]]
+    | "near " (!(SyntaxError).)+:syntax SyntaxError:message
+      => [[ syntax >string <sql-syntax-error> ]]
     | "no such table: " .+:table
       => [[ table >string <sql-table-missing> ]]
     | .*:error
       => [[ error >string <unparsed-sqlite-error> ]]
 ;EBNF
+
+: throw-sqlite-error ( n -- * )
+    dup sqlite-error-messages nth sqlite-error ;
index f3e305858250ded6f9528ca8cf14706f8477c756..34918efb8de94bf9517908f969c42158557c2d08 100644 (file)
@@ -8,7 +8,6 @@ IN: db2.sqlite.lib
 
 : ?when ( object quot -- object' ) dupd when ; inline
 
-
 : sqlite-check-result ( n -- )
     {
         { SQLITE_OK [ ] }
index 14e8e52f0e5beb41b352ab5a123c0dd8dd15d5db..a8bf11fc568597d9963cb10857b505e9d606d5fb 100644 (file)
@@ -1,7 +1,27 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: db2.result-sets ;
+USING: accessors db2.result-sets db2.sqlite.statements
+db2.statements kernel db2.sqlite.lib destructors ;
 IN: db2.sqlite.result-sets
 
 TUPLE: sqlite-result-set < result-set has-more? ;
 
+M: sqlite-result-set dispose
+    f >>handle drop ;
+
+M: sqlite-statement statement>result-set*
+    sqlite-maybe-prepare
+    dup handle>> sqlite-result-set new-result-set
+    dup advance-row ;
+
+M: sqlite-result-set advance-row ( result-set -- )
+    dup handle>> sqlite-next >>has-more? drop ;
+
+M: sqlite-result-set more-rows? ( result-set -- )
+    has-more?>> ;
+
+M: sqlite-result-set #columns ( result-set -- n )
+    handle>> sqlite-#columns ;
+
+M: sqlite-result-set column ( result-set n -- obj )
+    [ handle>> ] [ sqlite-column ] bi* ;
index fde2de7bf6ac4111238ea5b9d2ab2f98ffac4f85..a856c48075d133eb47d801f7e2e692c89de16772 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: db2.connections db2.statements db2.sqlite.connections
-db2.sqlite.lib ;
+USING: accessors db2.connections db2.sqlite.connections
+db2.sqlite.ffi db2.sqlite.lib db2.statements destructors kernel
+namespaces ;
 IN: db2.sqlite.statements
 
 TUPLE: sqlite-statement < statement ;
@@ -9,3 +10,12 @@ TUPLE: sqlite-statement < statement ;
 M: sqlite-db-connection <statement> ( string in out -- obj )
     sqlite-statement new-statement ;
 
+M: sqlite-statement dispose
+    handle>>
+    [ [ sqlite3_reset drop ] [ sqlite-finalize ] bi ] when* ;
+
+: sqlite-maybe-prepare ( statement -- statement )
+    dup handle>> [
+        db-connection get handle>> over sql>> sqlite-prepare
+        >>handle
+    ] unless ;
index 548300b417b5096880a7c66ac213e2adce0d86b0..43564c8b2986e107234e7a0b437440930522eb6d 100644 (file)
@@ -1,13 +1,38 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: tools.test db2.statements kernel ;
+USING: tools.test db2.statements kernel db2 db2.tester
+continuations db2.errors ;
 IN: db2.statements.tests
 
 { 1 0 } [ [ drop ] statement-each ] must-infer-as
 { 1 1 } [ [ ] statement-map ] must-infer-as
 
-[ ]
-[
-    "insert into computer (name, os) values('rocky', 'mac');"
+
+: test-sql-command ( -- )
+    [ "drop table computer;" sql-command ] ignore-errors
+
+    [ ] [
+        "create table computer(name varchar, os varchar);"
+        sql-command
+    ] unit-test
     
-] unit-test
+    [ ] [
+        "insert into computer (name, os) values('rocky', 'mac');"
+        sql-command
+    ] unit-test
+    
+    [ { { "rocky" "mac" } } ]
+    [
+        "select name, os from computer;" sql-query
+    ] unit-test
+
+    [ "insert into" sql-command ]
+    [ sql-syntax-error? ] must-fail-with
+
+    [ "selectt" sql-query ]
+    [ sql-syntax-error? ] must-fail-with
+
+    ;
+
+[ test-sql-command ] test-dbs
+
index 282fb7d5bf606a068cfc644982326b5d247b3427..006cda3532ef5bfdaabf20af4ccdd516f7f76a99 100644 (file)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors continuations destructors fry kernel
-sequences db2.result-sets db2.connections ;
+sequences db2.result-sets db2.connections db2.errors ;
 IN: db2.statements
 
-TUPLE: statement handle sql in out ;
+TUPLE: statement handle sql in out type ;
 
 : new-statement ( sql in out class -- statement )
     new
@@ -13,12 +13,15 @@ TUPLE: statement handle sql in out ;
         swap >>sql ;
 
 HOOK: <statement> db-connection ( sql in out -- statement )
+GENERIC: statement>result-set* ( statement -- result-set )
 GENERIC: execute-statement* ( statement type -- )
-GENERIC: statement>result-set ( statement -- result-set )
+
+: statement>result-set ( statement -- result-set )
+    [ statement>result-set* ]
+    [ dup sql-error? [ parse-sql-error ] when rethrow ] recover ;
 
 M: object execute-statement* ( statement type -- )
-    drop '[ _ statement>result-set dispose ]
-    [ parse-db-error rethrow ] recover ;
+    drop statement>result-set dispose ;
 
 : execute-one-statement ( statement -- )
     dup type>> execute-statement* ;