diff --git a/extra/db/postgresql/postgresql.factor b/extra/db/postgresql/postgresql.factor index f0a008d065..50704ea974 100755 --- a/extra/db/postgresql/postgresql.factor +++ b/extra/db/postgresql/postgresql.factor @@ -3,7 +3,8 @@ USING: arrays assocs alien alien.syntax continuations io kernel math math.parser namespaces prettyprint quotations sequences debugger db db.postgresql.lib db.postgresql.ffi -db.tuples db.types tools.annotations math.ranges ; +db.tuples db.types tools.annotations math.ranges +combinators ; IN: db.postgresql TUPLE: postgresql-db host port pgopts pgtty db user pass ; @@ -52,8 +53,16 @@ M: postgresql-result-set #columns ( result-set -- n ) M: postgresql-result-set row-column ( result-set n -- obj ) >r dup result-set-handle swap result-set-n r> PQgetvalue ; -M: postgresql-result-set row-column ( result-set n -- obj ) - >r dup result-set-handle swap result-set-n r> PQgetvalue ; +M: postgresql-result-set row-column-typed ( result-set n type -- obj ) + >r row-column r> sql-type>factor-type ; + +M: postgresql-result-set sql-type>factor-type ( obj type -- newobj ) + { + { INTEGER [ string>number ] } + { BIG_INTEGER [ string>number ] } + { DOUBLE [ string>number ] } + [ drop ] + } case ; M: postgresql-statement insert-statement ( statement -- id ) query-results [ break 0 row-column ] with-disposal ; diff --git a/extra/db/sqlite/ffi/ffi.factor b/extra/db/sqlite/ffi/ffi.factor index 3d37348709..8c957108e1 100755 --- a/extra/db/sqlite/ffi/ffi.factor +++ b/extra/db/sqlite/ffi/ffi.factor @@ -125,6 +125,8 @@ FUNCTION: void* sqlite3_column_blob ( sqlite3_stmt* pStmt, int col ) ; FUNCTION: int sqlite3_column_bytes ( sqlite3_stmt* pStmt, int col ) ; FUNCTION: char* sqlite3_column_decltype ( sqlite3_stmt* pStmt, int col ) ; FUNCTION: int sqlite3_column_int ( sqlite3_stmt* pStmt, int col ) ; +FUNCTION: sqlite3_int64 sqlite3_column_int64 ( sqlite3_stmt* pStmt, int col ) ; +FUNCTION: double sqlite3_column_double ( sqlite3_stmt* pStmt, int col ) ; FUNCTION: int sqlite3_column_name ( sqlite3_stmt* pStmt, int col ) ; FUNCTION: char* sqlite3_column_text ( sqlite3_stmt* pStmt, int col ) ; FUNCTION: int sqlite3_column_type ( sqlite3_stmt* pStmt, int col ) ; diff --git a/extra/db/sqlite/lib/lib.factor b/extra/db/sqlite/lib/lib.factor index dfa8a4b2dc..85aa671d4d 100755 --- a/extra/db/sqlite/lib/lib.factor +++ b/extra/db/sqlite/lib/lib.factor @@ -96,6 +96,14 @@ IN: db.sqlite.lib : sqlite-column ( handle index -- string ) sqlite3_column_text ; +: sqlite-column-typed ( handle index type -- obj ) + { + { INTEGER [ sqlite3_column_int ] } + { BIG_INTEGER [ sqlite3_column_int64 ] } + { TEXT [ sqlite3_column_text ] } + { DOUBLE [ sqlite3_column_double ] } + } case ; + ! TODO : sqlite-row ( handle -- seq ) dup sqlite-#columns [ sqlite-column ] with map ; diff --git a/extra/db/sqlite/sqlite.factor b/extra/db/sqlite/sqlite.factor index 298220b3ca..5e1bf0fa6f 100755 --- a/extra/db/sqlite/sqlite.factor +++ b/extra/db/sqlite/sqlite.factor @@ -63,6 +63,9 @@ M: sqlite-result-set #columns ( result-set -- n ) M: sqlite-result-set row-column ( result-set n -- obj ) >r result-set-handle r> sqlite-column ; +M: sqlite-result-set row-column-typed ( result-set n type -- obj ) + >r result-set-handle r> sqlite-column-typed ; + M: sqlite-result-set advance-row ( result-set -- ) [ result-set-handle sqlite-next ] keep set-sqlite-result-set-has-more? ; diff --git a/extra/db/tuples/tuples.factor b/extra/db/tuples/tuples.factor index 74726f12aa..9b94c16672 100755 --- a/extra/db/tuples/tuples.factor +++ b/extra/db/tuples/tuples.factor @@ -46,6 +46,9 @@ HOOK: update-sql* db ( columns table -- sql ) HOOK: delete-sql* db ( columns table -- sql ) HOOK: select-sql* db ( columns table -- sql ) +HOOK: row-column-typed db ( result-set n type -- sql ) +HOOK: sql-type>factor-type db ( obj type -- obj ) + : insert-sql ( columns class -- statement ) db get db-insert-statements [ insert-sql* ] cache-statement ;