! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel math namespaces sequences random
-strings
-math.bitfields.lib namespaces.lib db db.tuples db.types
-math.intervals ;
+strings math.parser math.intervals combinators
+math.bitfields.lib namespaces.lib db db.tuples db.types ;
IN: db.queries
GENERIC: where ( specs obj -- )
: query-make ( class quot -- )
>r sql-props r>
- [ 0 sql-counter rot with-variable ";" 0% ] { "" { } { } } nmake
+ [ 0 sql-counter rot with-variable ] { "" { } { } } nmake
<simple-statement> maybe-make-retryable ; inline
M: db begin-transaction ( -- ) "BEGIN" sql-command ;
" from " 0% 0%
where-clause
] query-make ;
+
+: do-group ( tuple groups -- )
+ [
+ ", " join " group by " prepend append
+ ] curry change-sql drop ;
+
+: do-order ( tuple order -- )
+ [
+ ", " join " order by " prepend append
+ ] curry change-sql drop ;
+
+: do-offset ( tuple n -- )
+ [
+ number>string " offset " prepend append
+ ] curry change-sql drop ;
+
+: do-limit ( tuple n -- )
+ [
+ number>string " limit " prepend append
+ ] curry change-sql drop ;
+
+: make-advanced-statement ( tuple advanced -- )
+ {
+ [ group>> [ do-group ] [ drop ] if* ]
+ [ order>> [ do-order ] [ drop ] if* ]
+ [ limit>> [ do-limit ] [ drop ] if* ]
+ [ offset>> [ do-offset ] [ drop ] if* ]
+ } 2cleave ;
+
+M: db <advanced-select-statement> ( tuple class advanced -- tuple )
+ >r <select-by-slots-statement> r>
+ dupd make-advanced-statement ;
namespaces sequences db.sqlite.ffi db combinators
continuations db.types calendar.format serialize
io.streams.byte-array byte-arrays io.encodings.binary
-io.backend ;
+io.backend db.errors ;
IN: db.sqlite.lib
-: sqlite-error ( n -- * )
- sqlite-error-messages nth throw ;
+ERROR: sqlite-error < db-error n string ;
+ERROR: sqlite-sql-error < sql-error n string ;
-: sqlite-statement-error-string ( -- str )
- db get db-handle sqlite3_errmsg ;
+: throw-sqlite-error ( n -- * )
+ dup sqlite-error-messages nth sqlite-error ;
: sqlite-statement-error ( -- * )
- sqlite-statement-error-string throw ;
+ SQLITE_ERROR
+ db get db-handle sqlite3_errmsg sqlite-sql-error ;
: sqlite-check-result ( n -- )
{
- { [ dup SQLITE_OK = ] [ drop ] }
- { [ dup SQLITE_ERROR = ] [ sqlite-statement-error ] }
- [ sqlite-error ]
- } cond ;
+ { SQLITE_OK [ ] }
+ { SQLITE_ERROR [ sqlite-statement-error ] }
+ [ throw-sqlite-error ]
+ } case ;
: sqlite-open ( path -- db )
normalize-path
HOOK: <update-tuple-statement> db ( class -- obj )
HOOK: <delete-tuples-statement> db ( tuple class -- obj )
HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
+TUPLE: advanced-statement group order offset limit ;
+HOOK: <advanced-select-statement> db ( tuple class advanced -- tuple )
HOOK: insert-tuple* db ( tuple statement -- )