redo lookup-type

db4
Doug Coleman 2008-04-20 15:48:09 -05:00
parent debf119a4c
commit f5485c1a3d
2 changed files with 51 additions and 63 deletions

View File

@ -135,7 +135,7 @@ M: postgresql-db bind# ( spec obj -- )
"(" 0% [ ", " 0% ] [
dup column-name>> 0%
" " 0%
dup type>> t lookup-type 0%
dup type>> lookup-create-type 0%
modifiers 0%
] interleave ");" 0%
] postgresql-make ;
@ -147,7 +147,7 @@ M: postgresql-db bind# ( spec obj -- )
"(" 0%
over [ "," 0% ]
[
type>> f lookup-type 0%
type>> lookup-type 0%
] interleave
")" 0%
" returns bigint as '" 0%
@ -174,7 +174,7 @@ M: postgresql-db create-sql-statement ( class -- seq )
"drop function add_" 0% 0%
"(" 0%
remove-id
[ ", " 0% ] [ type>> f lookup-type 0% ] interleave
[ ", " 0% ] [ type>> lookup-type 0% ] interleave
");" 0%
] postgresql-make ;
@ -252,42 +252,33 @@ M: postgresql-db <select-by-slots-statement> ( tuple class -- statement )
] if ";" 0%
] postgresql-make ;
M: postgresql-db type-table ( -- hash )
M: postgresql-db persistent-table ( -- hashtable )
H{
{ +native-id+ "integer" }
{ +random-id+ "bigint" }
{ TEXT "text" }
{ VARCHAR "varchar" }
{ INTEGER "integer" }
{ DOUBLE "real" }
{ DATE "date" }
{ TIME "time" }
{ DATETIME "timestamp" }
{ TIMESTAMP "timestamp" }
{ BLOB "bytea" }
{ FACTOR-BLOB "bytea" }
} ;
M: postgresql-db create-type-table ( -- hash )
H{
{ +native-id+ "serial primary key" }
{ +random-id+ "bigint primary key" }
} ;
M: postgresql-db modifier-table ( -- hashtable )
H{
{ +native-id+ "primary key" }
{ +assigned-id+ "primary key" }
{ +random-id+ "primary key" }
{ +foreign-id+ "references" }
{ +autoincrement+ "autoincrement" }
{ +unique+ "unique" }
{ +default+ "default" }
{ +null+ "null" }
{ +not-null+ "not null" }
{ system-random-generator "" }
{ secure-random-generator "" }
{ random-generator "" }
{ +native-id+ { "integer" "serial primary key" f } }
{ +assigned-id+ { f f "primary key" } }
{ +random-id+ { "bigint" "bigint primary key" f } }
{ TEXT { "text" f f } }
{ VARCHAR { "varchar" "varchar" f } }
{ INTEGER { "integer" "integer" f } }
{ BIG-INTEGER { "bigint" "bigint" f } }
{ UNSIGNED-BIG-INTEGER { "bigint" "bigint" f } }
{ SIGNED-BIG-INTEGER { "bigint" "bigint" f } }
{ DOUBLE { "real" "real" f } }
{ DATE { "date" "date" f } }
{ TIME { "time" "time" f } }
{ DATETIME { "timestamp" "timestamp" f } }
{ TIMESTAMP { "timestamp" "timestamp" f } }
{ BLOB { "bytea" "bytea" f } }
{ FACTOR-BLOB { "bytea" "bytea" f } }
{ +foreign-id+ { f f "references" } }
{ +autoincrement+ { f f "autoincrement" } }
{ +unique+ { f f "unique" } }
{ +default+ { f f "default" } }
{ +null+ { f f "null" } }
{ +not-null+ { f f "not null" } }
{ system-random-generator { f f f } }
{ secure-random-generator { f f f } }
{ random-generator { f f f } }
} ;
M: postgresql-db compound ( str obj -- str' )

View File

@ -7,10 +7,9 @@ mirrors classes.tuple combinators calendar.format symbols
classes.singleton accessors quotations random ;
IN: db.types
HOOK: modifier-table db ( -- hash )
HOOK: persistent-table db ( -- hash )
HOOK: compound db ( str obj -- hash )
HOOK: type-table db ( -- hash )
HOOK: create-type-table db ( -- hash )
HOOK: random-id-quot db ( -- quot )
TUPLE: sql-spec class slot-name column-name type primary-key modifiers ;
@ -40,26 +39,26 @@ SYMBOLS: +autoincrement+ +serial+ +unique+ +default+ +null+ +not-null+
] find nip [ system-random-generator ] unless* ;
: primary-key? ( spec -- ? )
sql-spec-primary-key +primary-key+? ;
primary-key>> +primary-key+? ;
: native-id? ( spec -- ? )
sql-spec-primary-key +native-id+? ;
primary-key>> +native-id+? ;
: nonnative-id? ( spec -- ? )
sql-spec-primary-key +nonnative-id+? ;
primary-key>> +nonnative-id+? ;
: normalize-spec ( spec -- )
dup sql-spec-type dup +primary-key+? [
swap set-sql-spec-primary-key
dup type>> dup +primary-key+? [
>>primary-key drop
] [
drop dup sql-spec-modifiers [
drop dup modifiers>> [
+primary-key+?
] deep-find
[ swap set-sql-spec-primary-key ] [ drop ] if*
[ >>primary-key drop ] [ drop ] if*
] if ;
: find-primary-key ( specs -- obj )
[ sql-spec-primary-key ] find nip ;
[ primary-key>> ] find nip ;
: relation? ( spec -- ? ) [ +has-many+ = ] deep-find ;
@ -88,7 +87,7 @@ FACTOR-BLOB NULL ;
[ relation? not ] subset ;
: remove-id ( specs -- obj )
[ sql-spec-primary-key not ] subset ;
[ primary-key>> not ] subset ;
! SQLite Types: http://www.sqlite.org/datatype3.html
! NULL INTEGER REAL TEXT BLOB
@ -100,29 +99,28 @@ ERROR: unknown-modifier ;
: lookup-modifier ( obj -- str )
{
{ [ dup array? ] [ unclip lookup-modifier swap compound ] }
[ modifier-table at* [ unknown-modifier ] unless ]
[ persistent-table at* [ unknown-modifier ] unless third ]
} cond ;
ERROR: no-sql-type ;
: lookup-type* ( obj -- str )
: (lookup-type) ( obj -- str )
persistent-table at* [ no-sql-type ] unless ;
: lookup-type ( obj -- str )
dup array? [
first lookup-type*
unclip (lookup-type) first nip
] [
type-table at* [ no-sql-type ] unless
(lookup-type) first
] if ;
: lookup-create-type ( obj -- str )
dup array? [
unclip lookup-create-type swap compound
unclip (lookup-type) second swap compound
] [
dup create-type-table at*
[ nip ] [ drop lookup-type* ] if
(lookup-type) second
] if ;
: lookup-type ( obj create? -- str )
[ lookup-create-type ] [ lookup-type* ] if ;
: single-quote ( str -- newstr )
"'" swap "'" 3append ;
@ -136,8 +134,7 @@ ERROR: no-sql-type ;
" " swap 3append ;
: modifiers ( spec -- str )
sql-spec-modifiers
[ lookup-modifier ] map " " join
modifiers>> [ lookup-modifier ] map " " join
dup empty? [ " " prepend ] unless ;
HOOK: bind% db ( spec -- )
@ -157,6 +154,6 @@ HOOK: bind# db ( spec obj -- )
: tuple>params ( specs tuple -- obj )
[
>r dup sql-spec-type swap sql-spec-slot-name r>
>r [ type>> ] [ slot-name>> ] bi r>
get-slot-named swap
] curry { } map>assoc ;