diff --git a/basis/db/queries/queries.factor b/basis/db/queries/queries.factor index e3322ada44..17d8870990 100644 --- a/basis/db/queries/queries.factor +++ b/basis/db/queries/queries.factor @@ -52,9 +52,7 @@ M: retryable execute-statement* ( statement type -- ) [ 0 sql-counter rot with-variable ] curry { "" { } { } { } } nmake [ maybe-make-retryable ] dip - [ - [ 1array ] dip append - ] unless-empty ; inline + [ [ 1array ] dip append ] unless-empty ; inline : where-primary-key% ( specs -- ) " where " 0% @@ -150,9 +148,10 @@ M: db ( tuple table -- sql ) M: db ( tuple class -- statement ) [ "select " 0% - over [ ", " 0% ] + [ dupd filter-ignores ] dip + over + [ ", " 0% ] [ dup column-name>> 0% 2, ] interleave - " from " 0% 0% where-clause ] query-make ; diff --git a/basis/db/sqlite/sqlite.factor b/basis/db/sqlite/sqlite.factor index 4fc3dbb227..dfd9fab08c 100755 --- a/basis/db/sqlite/sqlite.factor +++ b/basis/db/sqlite/sqlite.factor @@ -282,7 +282,7 @@ M: sqlite-db persistent-table ( -- assoc ) "sql-spec" get modifiers>> [ +not-null+ = ] contains? not ; : delete-cascade? ( -- ? ) - "sql-spec" get modifiers>> [ +cascade+ = ] contains? ; + "sql-spec" get modifiers>> { +on-delete+ +cascade+ } swap subseq? ; : sqlite-trigger, ( string -- ) { } { } 3, ; diff --git a/basis/db/tuples/tuples-tests.factor b/basis/db/tuples/tuples-tests.factor index 9550ea1cd8..6114c7ebe1 100755 --- a/basis/db/tuples/tuples-tests.factor +++ b/basis/db/tuples/tuples-tests.factor @@ -350,6 +350,16 @@ TUPLE: exam id name score ; [ ] [ T{ exam f f "Kenny" 60 } insert-tuple ] unit-test [ ] [ T{ exam f f "Cartman" 41 } insert-tuple ] unit-test + [ 4 ] + [ T{ exam { name IGNORE } { score IGNORE } } select-tuples length ] unit-test + + [ f ] + [ T{ exam { name IGNORE } { score IGNORE } } select-tuples first score>> ] unit-test + + ! FIXME + ! [ f ] + ! [ T{ exam { name IGNORE } { score IGNORE } { id IGNORE } } select-tuples first score>> ] unit-test + [ { T{ exam f 3 "Kenny" 60 } diff --git a/basis/db/types/types.factor b/basis/db/types/types.factor index 242339264d..ac9e3397f8 100755 --- a/basis/db/types/types.factor +++ b/basis/db/types/types.factor @@ -29,9 +29,17 @@ SYMBOLS: +autoincrement+ +serial+ +unique+ +default+ +null+ +not-null+ +foreign-id+ +has-many+ +on-delete+ +restrict+ +cascade+ +set-null+ +set-default+ ; +SYMBOL: IGNORE + +: filter-ignores ( tuple specs -- specs' ) + [ [ nip IGNORE = ] assoc-filter keys ] dip + [ slot-name>> swap member? not ] with filter ; + +ERROR: no-slot ; + : offset-of-slot ( string tuple -- n ) class superclasses [ "slots" word-prop ] map concat - slot-named offset>> ; + slot-named dup [ no-slot ] unless offset>> ; : get-slot-named ( name tuple -- value ) tuck offset-of-slot slot ;