Merge branch 'master' of git://factorcode.org/git/factor
commit
8eec066189
|
@ -439,7 +439,7 @@ install_build_system_port() {
|
||||||
}
|
}
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
echo "usage: $0 install|install-x11|install-macosx|self-update|quick-update|update|bootstrap|net-bootstrap|make-target"
|
echo "usage: $0 install|install-x11|install-macosx|self-update|quick-update|update|bootstrap|dlls|net-bootstrap|make-target"
|
||||||
echo "If you are behind a firewall, invoke as:"
|
echo "If you are behind a firewall, invoke as:"
|
||||||
echo "env GIT_PROTOCOL=http $0 <command>"
|
echo "env GIT_PROTOCOL=http $0 <command>"
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ M: postgresql-result-null summary ( obj -- str )
|
||||||
: param-values ( statement -- seq seq2 )
|
: param-values ( statement -- seq seq2 )
|
||||||
[ bind-params>> ] [ in-params>> ] bi
|
[ bind-params>> ] [ in-params>> ] bi
|
||||||
[
|
[
|
||||||
type>> {
|
>r value>> r> type>> {
|
||||||
{ FACTOR-BLOB [
|
{ FACTOR-BLOB [
|
||||||
dup [ object>bytes malloc-byte-array/length ] [ 0 ] if
|
dup [ object>bytes malloc-byte-array/length ] [ 0 ] if
|
||||||
] }
|
] }
|
||||||
|
@ -150,6 +150,7 @@ M: postgresql-malloc-destructor dispose ( obj -- )
|
||||||
dup array? [ first ] when
|
dup array? [ first ] when
|
||||||
{
|
{
|
||||||
{ +native-id+ [ pq-get-number ] }
|
{ +native-id+ [ pq-get-number ] }
|
||||||
|
{ +random-id+ [ pq-get-number ] }
|
||||||
{ INTEGER [ pq-get-number ] }
|
{ INTEGER [ pq-get-number ] }
|
||||||
{ BIG-INTEGER [ pq-get-number ] }
|
{ BIG-INTEGER [ pq-get-number ] }
|
||||||
{ DOUBLE [ pq-get-number ] }
|
{ DOUBLE [ pq-get-number ] }
|
||||||
|
|
|
@ -39,16 +39,16 @@ M: postgresql-db dispose ( db -- )
|
||||||
M: postgresql-statement bind-statement* ( statement -- )
|
M: postgresql-statement bind-statement* ( statement -- )
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
GENERIC: postgresql-bind-conversion
|
GENERIC: postgresql-bind-conversion ( tuple obj -- low-level-binding )
|
||||||
|
|
||||||
M: sql-spec postgresql-bind-conversion ( tuple spec -- array )
|
M: sql-spec postgresql-bind-conversion ( tuple spec -- obj )
|
||||||
slot-name>> swap get-slot-named ;
|
slot-name>> swap get-slot-named <low-level-binding> ;
|
||||||
|
|
||||||
M: literal-bind postgresql-bind-conversion ( tuple literal-bind -- array )
|
M: literal-bind postgresql-bind-conversion ( tuple literal-bind -- obj )
|
||||||
nip value>> ;
|
nip value>> <low-level-binding> ;
|
||||||
|
|
||||||
M: generator-bind postgresql-bind-conversion ( tuple generate-bind -- array )
|
M: generator-bind postgresql-bind-conversion ( tuple generate-bind -- obj )
|
||||||
nip quot>> call ;
|
nip singleton>> eval-generator <low-level-binding> ;
|
||||||
|
|
||||||
M: postgresql-statement bind-tuple ( tuple statement -- )
|
M: postgresql-statement bind-tuple ( tuple statement -- )
|
||||||
tuck in-params>>
|
tuck in-params>>
|
||||||
|
@ -201,7 +201,16 @@ M: postgresql-db <insert-nonnative-statement> ( class -- statement )
|
||||||
")" 0%
|
")" 0%
|
||||||
|
|
||||||
" values(" 0%
|
" values(" 0%
|
||||||
[ ", " 0% ] [ bind% ] interleave
|
[ ", " 0% ] [
|
||||||
|
dup type>> +random-id+ = [
|
||||||
|
[
|
||||||
|
drop bind-name%
|
||||||
|
f random-id-generator
|
||||||
|
] [ type>> ] bi <generator-bind> 1,
|
||||||
|
] [
|
||||||
|
bind%
|
||||||
|
] if
|
||||||
|
] interleave
|
||||||
");" 0%
|
");" 0%
|
||||||
] query-make ;
|
] query-make ;
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,8 @@ math.bitfields.lib namespaces.lib db db.tuples db.types
|
||||||
math.intervals ;
|
math.intervals ;
|
||||||
IN: db.queries
|
IN: db.queries
|
||||||
|
|
||||||
|
GENERIC: where ( specs obj -- )
|
||||||
|
|
||||||
: maybe-make-retryable ( statement -- statement )
|
: maybe-make-retryable ( statement -- statement )
|
||||||
dup in-params>> [ generator-bind? ] contains? [
|
dup in-params>> [ generator-bind? ] contains? [
|
||||||
make-retryable
|
make-retryable
|
||||||
|
@ -41,10 +43,11 @@ M: db <delete-tuple-statement> ( specs table -- sql )
|
||||||
dup column-name>> 0% " = " 0% bind%
|
dup column-name>> 0% " = " 0% bind%
|
||||||
] query-make ;
|
] query-make ;
|
||||||
|
|
||||||
M: db random-id-quot ( -- quot )
|
M: random-id-generator eval-generator ( singleton -- obj )
|
||||||
[ 63 [ 2^ random ] keep 1 - set-bit ] ;
|
drop
|
||||||
|
system-random-generator get [
|
||||||
GENERIC: where ( specs obj -- )
|
63 [ 2^ random ] keep 1 - set-bit
|
||||||
|
] with-random ;
|
||||||
|
|
||||||
: interval-comparison ( ? str -- str )
|
: interval-comparison ( ? str -- str )
|
||||||
"from" = " >" " <" ? swap [ "= " append ] when ;
|
"from" = " >" " <" ? swap [ "= " append ] when ;
|
||||||
|
@ -95,4 +98,3 @@ M: db <select-by-slots-statement> ( tuple class -- statement )
|
||||||
[ slot-name>> swap get-slot-named ] with subset
|
[ slot-name>> swap get-slot-named ] with subset
|
||||||
dup empty? [ 2drop ] [ where-clause ] if ";" 0%
|
dup empty? [ 2drop ] [ where-clause ] if ";" 0%
|
||||||
] query-make ;
|
] query-make ;
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ M: sqlite-result-set dispose ( result-set -- )
|
||||||
|
|
||||||
M: sqlite-statement low-level-bind ( statement -- )
|
M: sqlite-statement low-level-bind ( statement -- )
|
||||||
[ statement-bind-params ] [ statement-handle ] bi
|
[ statement-bind-params ] [ statement-handle ] bi
|
||||||
swap [ first3 sqlite-bind-type ] with each ;
|
swap [ [ key>> ] [ value>> ] [ type>> ] tri sqlite-bind-type ] with each ;
|
||||||
|
|
||||||
M: sqlite-statement bind-statement* ( statement -- )
|
M: sqlite-statement bind-statement* ( statement -- )
|
||||||
sqlite-maybe-prepare
|
sqlite-maybe-prepare
|
||||||
|
@ -62,16 +62,25 @@ M: sqlite-statement bind-statement* ( statement -- )
|
||||||
|
|
||||||
GENERIC: sqlite-bind-conversion ( tuple obj -- array )
|
GENERIC: sqlite-bind-conversion ( tuple obj -- array )
|
||||||
|
|
||||||
|
TUPLE: sqlite-low-level-binding < low-level-binding key type ;
|
||||||
|
: <sqlite-low-level-binding> ( key value type -- obj )
|
||||||
|
sqlite-low-level-binding new
|
||||||
|
swap >>type
|
||||||
|
swap >>value
|
||||||
|
swap >>key ;
|
||||||
|
|
||||||
M: sql-spec sqlite-bind-conversion ( tuple spec -- array )
|
M: sql-spec sqlite-bind-conversion ( tuple spec -- array )
|
||||||
[ column-name>> ":" prepend ]
|
[ column-name>> ":" prepend ]
|
||||||
[ slot-name>> rot get-slot-named ]
|
[ slot-name>> rot get-slot-named ]
|
||||||
[ type>> ] tri 3array ;
|
[ type>> ] tri <sqlite-low-level-binding> ;
|
||||||
|
|
||||||
M: literal-bind sqlite-bind-conversion ( tuple literal-bind -- array )
|
M: literal-bind sqlite-bind-conversion ( tuple literal-bind -- array )
|
||||||
nip [ key>> ] [ value>> ] [ type>> ] tri 3array ;
|
nip [ key>> ] [ value>> ] [ type>> ] tri
|
||||||
|
<sqlite-low-level-binding> ;
|
||||||
|
|
||||||
M: generator-bind sqlite-bind-conversion ( tuple generate-bind -- array )
|
M: generator-bind sqlite-bind-conversion ( tuple generate-bind -- array )
|
||||||
nip [ key>> ] [ quot>> call ] [ type>> ] tri 3array ;
|
nip [ key>> ] [ singleton>> eval-generator ] [ type>> ] tri
|
||||||
|
<sqlite-low-level-binding> ;
|
||||||
|
|
||||||
M: sqlite-statement bind-tuple ( tuple statement -- )
|
M: sqlite-statement bind-tuple ( tuple statement -- )
|
||||||
[
|
[
|
||||||
|
@ -129,14 +138,10 @@ M: sqlite-db <insert-native-statement> ( tuple -- statement )
|
||||||
") values(" 0%
|
") values(" 0%
|
||||||
[ ", " 0% ] [
|
[ ", " 0% ] [
|
||||||
dup type>> +random-id+ = [
|
dup type>> +random-id+ = [
|
||||||
dup modifiers>> find-random-generator
|
|
||||||
[
|
[
|
||||||
[
|
column-name>> ":" prepend dup 0%
|
||||||
column-name>> ":" prepend
|
random-id-generator
|
||||||
dup 0% random-id-quot
|
] [ type>> ] bi <generator-bind> 1,
|
||||||
] with-random
|
|
||||||
] curry
|
|
||||||
[ type>> ] bi <generator-bind> 1,
|
|
||||||
] [
|
] [
|
||||||
bind%
|
bind%
|
||||||
] if
|
] if
|
||||||
|
@ -158,9 +163,9 @@ M: sqlite-db bind% ( spec -- )
|
||||||
|
|
||||||
M: sqlite-db persistent-table ( -- assoc )
|
M: sqlite-db persistent-table ( -- assoc )
|
||||||
H{
|
H{
|
||||||
{ +native-id+ { "integer primary key" "integer primary key" f } }
|
{ +native-id+ { "integer primary key" "integer primary key" "primary key" } }
|
||||||
{ +assigned-id+ { f f "primary key" } }
|
{ +assigned-id+ { f f "primary key" } }
|
||||||
{ +random-id+ { "integer primary key" "integer primary key" f } }
|
{ +random-id+ { "integer primary key" "integer primary key" "primary key" } }
|
||||||
{ INTEGER { "integer" "integer" "primary key" } }
|
{ INTEGER { "integer" "integer" "primary key" } }
|
||||||
{ BIG-INTEGER { "bigint" "bigint" } }
|
{ BIG-INTEGER { "bigint" "bigint" } }
|
||||||
{ SIGNED-BIG-INTEGER { "bigint" "bigint" } }
|
{ SIGNED-BIG-INTEGER { "bigint" "bigint" } }
|
||||||
|
|
|
@ -342,14 +342,14 @@ C: <secret> secret
|
||||||
[ test-bignum ] test-postgresql
|
[ test-bignum ] test-postgresql
|
||||||
[ test-serialize ] test-postgresql
|
[ test-serialize ] test-postgresql
|
||||||
[ test-intervals ] test-postgresql
|
[ test-intervals ] test-postgresql
|
||||||
! [ test-random-id ] test-postgresql
|
[ test-random-id ] test-postgresql
|
||||||
|
|
||||||
TUPLE: does-not-persist ;
|
TUPLE: does-not-persist ;
|
||||||
|
|
||||||
! [
|
[
|
||||||
! [ does-not-persist create-sql-statement ]
|
[ does-not-persist create-sql-statement ]
|
||||||
! [ class \ not-persistent = ] must-fail-with
|
[ class \ not-persistent = ] must-fail-with
|
||||||
! ] test-sqlite
|
] test-sqlite
|
||||||
|
|
||||||
[
|
[
|
||||||
[ does-not-persist create-sql-statement ]
|
[ does-not-persist create-sql-statement ]
|
||||||
|
|
|
@ -26,11 +26,12 @@ ERROR: not-persistent ;
|
||||||
|
|
||||||
: set-primary-key ( key tuple -- )
|
: set-primary-key ( key tuple -- )
|
||||||
[
|
[
|
||||||
class db-columns find-primary-key sql-spec-slot-name
|
class db-columns find-primary-key slot-name>>
|
||||||
] keep set-slot-named ;
|
] keep set-slot-named ;
|
||||||
|
|
||||||
SYMBOL: sql-counter
|
SYMBOL: sql-counter
|
||||||
: next-sql-counter sql-counter [ inc ] [ get ] bi number>string ;
|
: next-sql-counter ( -- str )
|
||||||
|
sql-counter [ inc ] [ get ] bi number>string ;
|
||||||
|
|
||||||
! returns a sequence of prepared-statements
|
! returns a sequence of prepared-statements
|
||||||
HOOK: create-sql-statement db ( class -- obj )
|
HOOK: create-sql-statement db ( class -- obj )
|
||||||
|
@ -49,6 +50,7 @@ HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
|
||||||
|
|
||||||
HOOK: insert-tuple* db ( tuple statement -- )
|
HOOK: insert-tuple* db ( tuple statement -- )
|
||||||
|
|
||||||
|
GENERIC: eval-generator ( singleton -- obj )
|
||||||
SINGLETON: retryable
|
SINGLETON: retryable
|
||||||
|
|
||||||
: make-retryable ( obj -- obj' )
|
: make-retryable ( obj -- obj' )
|
||||||
|
@ -63,18 +65,12 @@ SINGLETON: retryable
|
||||||
[ bind-params>> ] [ in-params>> ] bi
|
[ bind-params>> ] [ in-params>> ] bi
|
||||||
[
|
[
|
||||||
dup generator-bind? [
|
dup generator-bind? [
|
||||||
quot>> call over set-second
|
singleton>> eval-generator >>value
|
||||||
] [
|
] [
|
||||||
drop
|
drop
|
||||||
] if
|
] if
|
||||||
] 2map >>bind-params ;
|
] 2map >>bind-params ;
|
||||||
|
|
||||||
: handle-random-id ( statement -- )
|
|
||||||
dup in-params>> [ type>> +random-id+ = ] find drop >boolean [
|
|
||||||
retryable >>type
|
|
||||||
random-id-quot >>quot
|
|
||||||
] when drop ;
|
|
||||||
|
|
||||||
M: retryable execute-statement* ( statement type -- )
|
M: retryable execute-statement* ( statement type -- )
|
||||||
drop
|
drop
|
||||||
[
|
[
|
||||||
|
@ -84,21 +80,21 @@ M: retryable execute-statement* ( statement type -- )
|
||||||
] curry 10 retry drop ;
|
] curry 10 retry drop ;
|
||||||
|
|
||||||
: resulting-tuple ( row out-params -- tuple )
|
: resulting-tuple ( row out-params -- tuple )
|
||||||
dup first sql-spec-class new [
|
dup first class>> new [
|
||||||
[
|
[
|
||||||
>r sql-spec-slot-name r> set-slot-named
|
>r slot-name>> r> set-slot-named
|
||||||
] curry 2each
|
] curry 2each
|
||||||
] keep ;
|
] keep ;
|
||||||
|
|
||||||
: query-tuples ( statement -- seq )
|
: query-tuples ( statement -- seq )
|
||||||
[ statement-out-params ] keep query-results [
|
[ out-params>> ] keep query-results [
|
||||||
[ sql-row-typed swap resulting-tuple ] with query-map
|
[ sql-row-typed swap resulting-tuple ] with query-map
|
||||||
] with-disposal ;
|
] with-disposal ;
|
||||||
|
|
||||||
: query-modify-tuple ( tuple statement -- )
|
: query-modify-tuple ( tuple statement -- )
|
||||||
[ query-results [ sql-row-typed ] with-disposal ] keep
|
[ query-results [ sql-row-typed ] with-disposal ] keep
|
||||||
statement-out-params rot [
|
out-params>> rot [
|
||||||
>r sql-spec-slot-name r> set-slot-named
|
>r slot-name>> r> set-slot-named
|
||||||
] curry 2each ;
|
] curry 2each ;
|
||||||
|
|
||||||
: sql-props ( class -- columns table )
|
: sql-props ( class -- columns table )
|
||||||
|
|
|
@ -10,15 +10,17 @@ IN: db.types
|
||||||
HOOK: persistent-table db ( -- hash )
|
HOOK: persistent-table db ( -- hash )
|
||||||
HOOK: compound db ( str obj -- hash )
|
HOOK: compound db ( str obj -- hash )
|
||||||
|
|
||||||
HOOK: random-id-quot db ( -- quot )
|
|
||||||
|
|
||||||
TUPLE: sql-spec class slot-name column-name type primary-key modifiers ;
|
TUPLE: sql-spec class slot-name column-name type primary-key modifiers ;
|
||||||
|
|
||||||
TUPLE: literal-bind key type value ;
|
TUPLE: literal-bind key type value ;
|
||||||
C: <literal-bind> literal-bind
|
C: <literal-bind> literal-bind
|
||||||
|
|
||||||
TUPLE: generator-bind key quot type ;
|
TUPLE: generator-bind key singleton type ;
|
||||||
C: <generator-bind> generator-bind
|
C: <generator-bind> generator-bind
|
||||||
|
SINGLETON: random-id-generator
|
||||||
|
|
||||||
|
TUPLE: low-level-binding value ;
|
||||||
|
C: <low-level-binding> low-level-binding
|
||||||
|
|
||||||
SINGLETON: +native-id+
|
SINGLETON: +native-id+
|
||||||
SINGLETON: +assigned-id+
|
SINGLETON: +assigned-id+
|
||||||
|
|
|
@ -76,7 +76,7 @@ arc "arc"
|
||||||
create-node-table create-arc-table create-bootstrap-nodes create-bootstrap-arcs ;
|
create-node-table create-arc-table create-bootstrap-nodes create-bootstrap-arcs ;
|
||||||
|
|
||||||
: param ( value key type -- param )
|
: param ( value key type -- param )
|
||||||
swapd 3array ;
|
swapd <sqlite-low-level-binding> ;
|
||||||
|
|
||||||
: single-int-results ( bindings sql -- array )
|
: single-int-results ( bindings sql -- array )
|
||||||
f f <simple-statement> [ do-bound-query ] with-disposal
|
f f <simple-statement> [ do-bound-query ] with-disposal
|
||||||
|
|
Loading…
Reference in New Issue