partial conversion of postgres
parent
896c920d85
commit
4184a3ce54
|
@ -5,7 +5,7 @@ quotations sequences db.postgresql.ffi alien alien.c-types
|
||||||
db.types tools.walker ascii splitting math.parser combinators
|
db.types tools.walker ascii splitting math.parser combinators
|
||||||
libc shuffle calendar.format byte-arrays destructors prettyprint
|
libc shuffle calendar.format byte-arrays destructors prettyprint
|
||||||
accessors strings serialize io.encodings.binary
|
accessors strings serialize io.encodings.binary
|
||||||
io.streams.byte-array ;
|
io.streams.byte-array inspector ;
|
||||||
IN: db.postgresql.lib
|
IN: db.postgresql.lib
|
||||||
|
|
||||||
: postgresql-result-error-message ( res -- str/f )
|
: postgresql-result-error-message ( res -- str/f )
|
||||||
|
@ -28,7 +28,13 @@ IN: db.postgresql.lib
|
||||||
: postgresql-error ( res -- res )
|
: postgresql-error ( res -- res )
|
||||||
dup [ postgresql-error-message throw ] unless ;
|
dup [ postgresql-error-message throw ] unless ;
|
||||||
|
|
||||||
: postgresql-result-ok? ( n -- ? )
|
ERROR: postgresql-result-null ;
|
||||||
|
|
||||||
|
M: postgresql-result-null summary ( obj -- str )
|
||||||
|
drop "PQexec returned f." ;
|
||||||
|
|
||||||
|
: postgresql-result-ok? ( res -- ? )
|
||||||
|
[ postgresql-result-null ] unless*
|
||||||
PQresultStatus
|
PQresultStatus
|
||||||
PGRES_COMMAND_OK PGRES_TUPLES_OK 2array member? ;
|
PGRES_COMMAND_OK PGRES_TUPLES_OK 2array member? ;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ kernel math math.parser namespaces prettyprint quotations
|
||||||
sequences debugger db db.postgresql.lib db.postgresql.ffi
|
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 sequences.lib classes locals words tools.walker
|
combinators sequences.lib classes locals words tools.walker
|
||||||
namespaces.lib accessors ;
|
namespaces.lib accessors random ;
|
||||||
IN: db.postgresql
|
IN: db.postgresql
|
||||||
|
|
||||||
TUPLE: postgresql-db < db
|
TUPLE: postgresql-db < db
|
||||||
|
@ -43,10 +43,9 @@ M: postgresql-statement bind-statement* ( statement -- )
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
M: postgresql-statement bind-tuple ( tuple statement -- )
|
M: postgresql-statement bind-tuple ( tuple statement -- )
|
||||||
[
|
tuck in-params>>
|
||||||
statement-in-params
|
[ slot-name>> swap get-slot-named ] with map
|
||||||
[ sql-spec-slot-name swap get-slot-named ] with map
|
>>bind-params drop ;
|
||||||
] keep set-statement-bind-params ;
|
|
||||||
|
|
||||||
M: postgresql-result-set #rows ( result-set -- n )
|
M: postgresql-result-set #rows ( result-set -- n )
|
||||||
handle>> PQntuples ;
|
handle>> PQntuples ;
|
||||||
|
@ -55,11 +54,11 @@ M: postgresql-result-set #columns ( result-set -- n )
|
||||||
handle>> PQnfields ;
|
handle>> PQnfields ;
|
||||||
|
|
||||||
M: postgresql-result-set row-column ( result-set column -- obj )
|
M: postgresql-result-set row-column ( result-set column -- obj )
|
||||||
>r dup result-set-handle swap result-set-n r> pq-get-string ;
|
>r [ handle>> ] [ n>> ] bi r> pq-get-string ;
|
||||||
|
|
||||||
M: postgresql-result-set row-column-typed ( result-set column -- obj )
|
M: postgresql-result-set row-column-typed ( result-set column -- obj )
|
||||||
dup pick result-set-out-params nth sql-spec-type
|
dup pick result-set-out-params nth sql-spec-type
|
||||||
>r >r [ result-set-handle ] [ result-set-n ] bi r> r> postgresql-column-typed ;
|
>r >r [ handle>> ] [ result-set-n ] bi r> r> postgresql-column-typed ;
|
||||||
|
|
||||||
M: postgresql-statement query-results ( query -- result-set )
|
M: postgresql-statement query-results ( query -- result-set )
|
||||||
dup statement-bind-params [
|
dup statement-bind-params [
|
||||||
|
@ -82,7 +81,7 @@ M: postgresql-statement dispose ( query -- )
|
||||||
f swap set-statement-handle ;
|
f swap set-statement-handle ;
|
||||||
|
|
||||||
M: postgresql-result-set dispose ( result-set -- )
|
M: postgresql-result-set dispose ( result-set -- )
|
||||||
dup result-set-handle PQclear
|
dup handle>> PQclear
|
||||||
0 0 f roll {
|
0 0 f roll {
|
||||||
set-result-set-n set-result-set-max set-result-set-handle
|
set-result-set-n set-result-set-max set-result-set-handle
|
||||||
} set-slots ;
|
} set-slots ;
|
||||||
|
@ -90,7 +89,7 @@ M: postgresql-result-set dispose ( result-set -- )
|
||||||
M: postgresql-statement prepare-statement ( statement -- )
|
M: postgresql-statement prepare-statement ( statement -- )
|
||||||
[
|
[
|
||||||
>r db get handle>> "" r>
|
>r db get handle>> "" r>
|
||||||
dup statement-sql swap statement-in-params
|
[ sql>> ] [ in-params>> ] bi
|
||||||
length f PQprepare postgresql-error
|
length f PQprepare postgresql-error
|
||||||
] keep set-statement-handle ;
|
] keep set-statement-handle ;
|
||||||
|
|
||||||
|
@ -115,7 +114,10 @@ SYMBOL: postgresql-counter
|
||||||
postgresql-counter [ inc ] keep get 0# ;
|
postgresql-counter [ inc ] keep get 0# ;
|
||||||
|
|
||||||
M: postgresql-db bind% ( spec -- )
|
M: postgresql-db bind% ( spec -- )
|
||||||
1, bind-name% ;
|
bind-name% 1, ;
|
||||||
|
|
||||||
|
M: postgresql-db bind# ( spec obj -- )
|
||||||
|
>r bind-name% f swap type>> r> <literal-bind> 1, ;
|
||||||
|
|
||||||
: postgresql-make ( class quot -- )
|
: postgresql-make ( class quot -- )
|
||||||
>r sql-props r>
|
>r sql-props r>
|
||||||
|
@ -125,11 +127,10 @@ M: postgresql-db bind% ( spec -- )
|
||||||
: create-table-sql ( class -- statement )
|
: create-table-sql ( class -- statement )
|
||||||
[
|
[
|
||||||
"create table " 0% 0%
|
"create table " 0% 0%
|
||||||
"(" 0%
|
"(" 0% [ ", " 0% ] [
|
||||||
[ ", " 0% ] [
|
dup column-name>> 0%
|
||||||
dup sql-spec-column-name 0%
|
|
||||||
" " 0%
|
" " 0%
|
||||||
dup sql-spec-type t lookup-type 0%
|
dup type>> t lookup-type 0%
|
||||||
modifiers 0%
|
modifiers 0%
|
||||||
] interleave ");" 0%
|
] interleave ");" 0%
|
||||||
] postgresql-make ;
|
] postgresql-make ;
|
||||||
|
@ -250,6 +251,7 @@ M: postgresql-db <select-by-slots-statement> ( tuple class -- statement )
|
||||||
M: postgresql-db type-table ( -- hash )
|
M: postgresql-db type-table ( -- hash )
|
||||||
H{
|
H{
|
||||||
{ +native-id+ "integer" }
|
{ +native-id+ "integer" }
|
||||||
|
{ +random-id+ "bigint" }
|
||||||
{ TEXT "text" }
|
{ TEXT "text" }
|
||||||
{ VARCHAR "varchar" }
|
{ VARCHAR "varchar" }
|
||||||
{ INTEGER "integer" }
|
{ INTEGER "integer" }
|
||||||
|
@ -265,6 +267,7 @@ M: postgresql-db type-table ( -- hash )
|
||||||
M: postgresql-db create-type-table ( -- hash )
|
M: postgresql-db create-type-table ( -- hash )
|
||||||
H{
|
H{
|
||||||
{ +native-id+ "serial primary key" }
|
{ +native-id+ "serial primary key" }
|
||||||
|
{ +random-id+ "bigint primary key" }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
: postgresql-compound ( str n -- newstr )
|
: postgresql-compound ( str n -- newstr )
|
||||||
|
@ -286,12 +289,16 @@ M: postgresql-db modifier-table ( -- hashtable )
|
||||||
H{
|
H{
|
||||||
{ +native-id+ "primary key" }
|
{ +native-id+ "primary key" }
|
||||||
{ +assigned-id+ "primary key" }
|
{ +assigned-id+ "primary key" }
|
||||||
|
{ +random-id+ "primary key" }
|
||||||
{ +foreign-id+ "references" }
|
{ +foreign-id+ "references" }
|
||||||
{ +autoincrement+ "autoincrement" }
|
{ +autoincrement+ "autoincrement" }
|
||||||
{ +unique+ "unique" }
|
{ +unique+ "unique" }
|
||||||
{ +default+ "default" }
|
{ +default+ "default" }
|
||||||
{ +null+ "null" }
|
{ +null+ "null" }
|
||||||
{ +not-null+ "not null" }
|
{ +not-null+ "not null" }
|
||||||
|
{ system-random-generator "" }
|
||||||
|
{ secure-random-generator "" }
|
||||||
|
{ random-generator "" }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
M: postgresql-db compound-type ( str n -- newstr )
|
M: postgresql-db compound-type ( str n -- newstr )
|
||||||
|
|
|
@ -110,10 +110,16 @@ M: sqlite-db begin-transaction ( -- ) "BEGIN" sql-command ;
|
||||||
M: sqlite-db commit-transaction ( -- ) "COMMIT" sql-command ;
|
M: sqlite-db commit-transaction ( -- ) "COMMIT" sql-command ;
|
||||||
M: sqlite-db rollback-transaction ( -- ) "ROLLBACK" sql-command ;
|
M: sqlite-db rollback-transaction ( -- ) "ROLLBACK" sql-command ;
|
||||||
|
|
||||||
|
|
||||||
|
: maybe-make-retryable ( statement -- statement )
|
||||||
|
dup in-params>> [ generator-bind? ] contains? [
|
||||||
|
make-retryable
|
||||||
|
] when ;
|
||||||
|
|
||||||
: sqlite-make ( class quot -- )
|
: sqlite-make ( class quot -- )
|
||||||
>r sql-props r>
|
>r sql-props r>
|
||||||
[ 0 sql-counter rot with-variable ] { "" { } { } } nmake
|
[ 0 sql-counter rot with-variable ] { "" { } { } } nmake
|
||||||
<simple-statement> ;
|
<simple-statement> maybe-make-retryable ;
|
||||||
|
|
||||||
M: sqlite-db create-sql-statement ( class -- statement )
|
M: sqlite-db create-sql-statement ( class -- statement )
|
||||||
[
|
[
|
||||||
|
@ -124,7 +130,7 @@ M: sqlite-db create-sql-statement ( class -- statement )
|
||||||
dup type>> t lookup-type 0%
|
dup type>> t lookup-type 0%
|
||||||
modifiers 0%
|
modifiers 0%
|
||||||
] interleave ");" 0%
|
] interleave ");" 0%
|
||||||
] sqlite-make ;
|
] sqlite-make dup sql>> . ;
|
||||||
|
|
||||||
M: sqlite-db drop-sql-statement ( class -- statement )
|
M: sqlite-db drop-sql-statement ( class -- statement )
|
||||||
[ "drop table " 0% 0% ";" 0% drop ] sqlite-make ;
|
[ "drop table " 0% 0% ";" 0% drop ] sqlite-make ;
|
||||||
|
@ -151,10 +157,7 @@ M: sqlite-db <insert-native-statement> ( tuple -- statement )
|
||||||
] if
|
] if
|
||||||
] interleave
|
] interleave
|
||||||
");" 0%
|
");" 0%
|
||||||
] sqlite-make
|
] sqlite-make ;
|
||||||
dup in-params>> [ generator-bind? ] contains? [
|
|
||||||
make-retryable
|
|
||||||
] when ;
|
|
||||||
|
|
||||||
M: sqlite-db <insert-nonnative-statement> ( tuple -- statement )
|
M: sqlite-db <insert-nonnative-statement> ( tuple -- statement )
|
||||||
<insert-native-statement> ;
|
<insert-native-statement> ;
|
||||||
|
|
|
@ -346,13 +346,15 @@ C: <secret> secret
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[ t ] [
|
[ t ] [
|
||||||
T{ secret } select-tuples dup . length 3 =
|
T{ secret } select-tuples length 3 =
|
||||||
] unit-test ;
|
] unit-test ;
|
||||||
|
|
||||||
[ test-random-id ] test-sqlite
|
[ test-random-id ] test-sqlite
|
||||||
[ native-person-schema test-tuples ] test-sqlite
|
[ native-person-schema test-tuples ] test-sqlite
|
||||||
[ assigned-person-schema test-tuples ] test-sqlite
|
[ assigned-person-schema test-tuples ] test-sqlite
|
||||||
[ assigned-person-schema test-repeated-insert ] test-sqlite
|
[ assigned-person-schema test-repeated-insert ] test-sqlite
|
||||||
|
|
||||||
|
[ test-random-id ] test-postgresql
|
||||||
[ native-person-schema test-tuples ] test-postgresql
|
[ native-person-schema test-tuples ] test-postgresql
|
||||||
[ assigned-person-schema test-tuples ] test-postgresql
|
[ assigned-person-schema test-tuples ] test-postgresql
|
||||||
[ assigned-person-schema test-repeated-insert ] test-postgresql
|
[ assigned-person-schema test-repeated-insert ] test-postgresql
|
||||||
|
|
|
@ -110,8 +110,7 @@ ERROR: no-sql-type ;
|
||||||
dup array? [
|
dup array? [
|
||||||
first lookup-type*
|
first lookup-type*
|
||||||
] [
|
] [
|
||||||
type-table at*
|
type-table at* [ no-sql-type ] unless
|
||||||
[ no-sql-type ] unless
|
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
: lookup-create-type ( obj -- str )
|
: lookup-create-type ( obj -- str )
|
||||||
|
|
Loading…
Reference in New Issue