sqlite now gets return types with the optimized native functions
removed a hack in type conversion serialize arbitrary factor objects to dbdb4
							parent
							
								
									3eb7830d2c
								
							
						
					
					
						commit
						dfb3dac5fd
					
				| 
						 | 
					@ -34,7 +34,7 @@ HOOK: db-close db ( handle -- )
 | 
				
			||||||
TUPLE: statement handle sql in-params out-params bind-params bound? ;
 | 
					TUPLE: statement handle sql in-params out-params bind-params bound? ;
 | 
				
			||||||
TUPLE: simple-statement ;
 | 
					TUPLE: simple-statement ;
 | 
				
			||||||
TUPLE: prepared-statement ;
 | 
					TUPLE: prepared-statement ;
 | 
				
			||||||
TUPLE: result-set sql params handle n max ;
 | 
					TUPLE: result-set sql in-params out-params handle n max ;
 | 
				
			||||||
: <statement> ( sql in out -- statement )
 | 
					: <statement> ( sql in out -- statement )
 | 
				
			||||||
    { (>>sql) (>>in-params) (>>out-params) } statement construct ;
 | 
					    { (>>sql) (>>in-params) (>>out-params) } statement construct ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,7 @@ GENERIC: query-results ( query -- result-set )
 | 
				
			||||||
GENERIC: #rows ( result-set -- n )
 | 
					GENERIC: #rows ( result-set -- n )
 | 
				
			||||||
GENERIC: #columns ( result-set -- n )
 | 
					GENERIC: #columns ( result-set -- n )
 | 
				
			||||||
GENERIC# row-column 1 ( result-set n -- obj )
 | 
					GENERIC# row-column 1 ( result-set n -- obj )
 | 
				
			||||||
 | 
					GENERIC# row-column-typed 1 ( result-set n -- sql )
 | 
				
			||||||
GENERIC: advance-row ( result-set -- )
 | 
					GENERIC: advance-row ( result-set -- )
 | 
				
			||||||
GENERIC: more-rows? ( result-set -- ? )
 | 
					GENERIC: more-rows? ( result-set -- ? )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -67,13 +68,16 @@ GENERIC: more-rows? ( result-set -- ? )
 | 
				
			||||||
    0 >>n drop ;
 | 
					    0 >>n drop ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: <result-set> ( query handle tuple -- result-set )
 | 
					: <result-set> ( query handle tuple -- result-set )
 | 
				
			||||||
    >r >r { sql>> in-params>> } get-slots r>
 | 
					    >r >r { sql>> in-params>> out-params>> } get-slots r>
 | 
				
			||||||
    { (>>sql) (>>params) (>>handle) } result-set
 | 
					    { (>>sql) (>>in-params) (>>out-params) (>>handle) } result-set
 | 
				
			||||||
    construct r> construct-delegate ;
 | 
					    construct r> construct-delegate ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: sql-row ( result-set -- seq )
 | 
					: sql-row ( result-set -- seq )
 | 
				
			||||||
    dup #columns [ row-column ] with map ;
 | 
					    dup #columns [ row-column ] with map ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: sql-row-typed ( result-set -- seq )
 | 
				
			||||||
 | 
					    dup #columns [ row-column-typed ] with map ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: query-each ( statement quot -- )
 | 
					: query-each ( statement quot -- )
 | 
				
			||||||
    over more-rows? [
 | 
					    over more-rows? [
 | 
				
			||||||
        [ call ] 2keep over advance-row query-each
 | 
					        [ call ] 2keep over advance-row query-each
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,6 @@ IN: db.sqlite.lib
 | 
				
			||||||
        { TIMESTAMP [ sqlite-bind-text-by-name ] }
 | 
					        { TIMESTAMP [ sqlite-bind-text-by-name ] }
 | 
				
			||||||
        { BLOB [ sqlite-bind-blob-by-name ] }
 | 
					        { BLOB [ sqlite-bind-blob-by-name ] }
 | 
				
			||||||
        { FACTOR-BLOB [
 | 
					        { FACTOR-BLOB [
 | 
				
			||||||
            break
 | 
					 | 
				
			||||||
            [ serialize ] with-string-writer >byte-array
 | 
					            [ serialize ] with-string-writer >byte-array
 | 
				
			||||||
            sqlite-bind-blob-by-name
 | 
					            sqlite-bind-blob-by-name
 | 
				
			||||||
        ] }
 | 
					        ] }
 | 
				
			||||||
| 
						 | 
					@ -115,13 +114,31 @@ IN: db.sqlite.lib
 | 
				
			||||||
: sqlite-column ( handle index -- string )
 | 
					: sqlite-column ( handle index -- string )
 | 
				
			||||||
    sqlite3_column_text ;
 | 
					    sqlite3_column_text ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: sqlite-column-blob ( handle index -- byte-array/f )
 | 
				
			||||||
 | 
					    [ sqlite3_column_bytes ] 2keep
 | 
				
			||||||
 | 
					    pick zero? [
 | 
				
			||||||
 | 
					        3drop f
 | 
				
			||||||
 | 
					    ] [
 | 
				
			||||||
 | 
					        sqlite3_column_blob swap memory>byte-array
 | 
				
			||||||
 | 
					    ] if ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: sqlite-column-typed ( handle index type -- obj )
 | 
					: sqlite-column-typed ( handle index type -- obj )
 | 
				
			||||||
 | 
					    dup array? [ first ] when
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        { +native-id+ [ sqlite3_column_int64 ] }
 | 
				
			||||||
        { INTEGER [ sqlite3_column_int ] }
 | 
					        { INTEGER [ sqlite3_column_int ] }
 | 
				
			||||||
        { BIG-INTEGER [ sqlite3_column_int64 ] }
 | 
					        { BIG-INTEGER [ sqlite3_column_int64 ] }
 | 
				
			||||||
        { TEXT [ sqlite3_column_text ] }
 | 
					        { TEXT [ sqlite3_column_text ] }
 | 
				
			||||||
 | 
					        { VARCHAR [ sqlite3_column_text ] }
 | 
				
			||||||
        { DOUBLE [ sqlite3_column_double ] }
 | 
					        { DOUBLE [ sqlite3_column_double ] }
 | 
				
			||||||
        { TIMESTAMP [ sqlite3_column_double ] }
 | 
					        { DATE [ sqlite3_column_text dup [ ymd>timestamp ] when ] }
 | 
				
			||||||
 | 
					        { TIME [ sqlite3_column_text dup [ hms>timestamp ] when ] }
 | 
				
			||||||
 | 
					        { TIMESTAMP [ sqlite3_column_text dup [ ymdhms>timestamp ] when ] }
 | 
				
			||||||
 | 
					        { DATETIME [ sqlite3_column_text dup [ ymdhms>timestamp ] when ] }
 | 
				
			||||||
 | 
					        { BLOB [ sqlite-column-blob ] }
 | 
				
			||||||
 | 
					        { FACTOR-BLOB [
 | 
				
			||||||
 | 
					            sqlite-column-blob [ deserialize ] with-string-reader
 | 
				
			||||||
 | 
					        ] }
 | 
				
			||||||
        ! { NULL [ 2drop f ] }
 | 
					        ! { NULL [ 2drop f ] }
 | 
				
			||||||
        [ no-sql-type ]
 | 
					        [ no-sql-type ]
 | 
				
			||||||
    } case ;
 | 
					    } case ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,8 +80,9 @@ M: sqlite-result-set #columns ( result-set -- n )
 | 
				
			||||||
M: sqlite-result-set row-column ( result-set n -- obj )
 | 
					M: sqlite-result-set row-column ( result-set n -- obj )
 | 
				
			||||||
    >r result-set-handle r> sqlite-column ;
 | 
					    >r result-set-handle r> sqlite-column ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: sqlite-result-set row-column-typed ( result-set n type -- obj )
 | 
					M: sqlite-result-set row-column-typed ( result-set n -- obj )
 | 
				
			||||||
    >r result-set-handle r> sqlite-column-typed ;
 | 
					    dup pick result-set-out-params nth sql-spec-type
 | 
				
			||||||
 | 
					    >r >r result-set-handle r> r> sqlite-column-typed ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: sqlite-result-set advance-row ( result-set -- )
 | 
					M: sqlite-result-set advance-row ( result-set -- )
 | 
				
			||||||
    [ result-set-handle sqlite-next ] keep
 | 
					    [ result-set-handle sqlite-next ] keep
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -61,11 +61,18 @@ SYMBOL: person4
 | 
				
			||||||
    [ ] [ person3 get insert-tuple ] unit-test
 | 
					    [ ] [ person3 get insert-tuple ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        T{ person f 3 "teddy" 10 3.14
 | 
					        T{
 | 
				
			||||||
 | 
					            person
 | 
				
			||||||
 | 
					            f
 | 
				
			||||||
 | 
					            3
 | 
				
			||||||
 | 
					            "teddy"
 | 
				
			||||||
 | 
					            10
 | 
				
			||||||
 | 
					            3.14
 | 
				
			||||||
            T{ timestamp f 2008 3 5 16 24 11 0 }
 | 
					            T{ timestamp f 2008 3 5 16 24 11 0 }
 | 
				
			||||||
            T{ timestamp f 2008 11 22 f f f f }
 | 
					            T{ timestamp f 2008 11 22 f f f f }
 | 
				
			||||||
            T{ timestamp f f f f 12 34 56 f }
 | 
					            T{ timestamp f f f f 12 34 56 f }
 | 
				
			||||||
            "storeinablob" }
 | 
					            B{ 115 116 111 114 101 105 110 97 98 108 111 98 }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    ] [ T{ person f 3 } select-tuple ] unit-test
 | 
					    ] [ T{ person f 3 } select-tuple ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [ ] [ person drop-table ] unit-test ;
 | 
					    [ ] [ person drop-table ] unit-test ;
 | 
				
			||||||
| 
						 | 
					@ -152,8 +159,8 @@ TUPLE: annotation n paste-id summary author mode contents ;
 | 
				
			||||||
    >r { "localhost" "postgres" "" "factor-test" } postgresql-db r> with-db ;
 | 
					    >r { "localhost" "postgres" "" "factor-test" } postgresql-db r> with-db ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
! [ 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TUPLE: serialize-me id data ;
 | 
					TUPLE: serialize-me id data ;
 | 
				
			||||||
[
 | 
					[
 | 
				
			||||||
| 
						 | 
					@ -166,7 +173,9 @@ TUPLE: serialize-me id data ;
 | 
				
			||||||
    [ ] [ serialize-me create-table ] unit-test
 | 
					    [ ] [ serialize-me create-table ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    [ ] [ T{ serialize-me f f H{ { 1 2 } } } insert-tuple ] unit-test
 | 
					    [ ] [ T{ serialize-me f f H{ { 1 2 } } } insert-tuple ] unit-test
 | 
				
			||||||
    [ ] [ T{ serialize-me f 1 } select-tuples ] unit-test
 | 
					    [
 | 
				
			||||||
 | 
					        { T{ serialize-me f 1 H{ { 1 2 } } } }
 | 
				
			||||||
 | 
					    ] [ T{ serialize-me f 1 } select-tuples ] unit-test
 | 
				
			||||||
] test-sqlite
 | 
					] test-sqlite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
! [ make-native-person-table ] test-sqlite
 | 
					! [ make-native-person-table ] test-sqlite
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,27 +37,24 @@ HOOK: <delete-tuples-statement> db ( class -- obj )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HOOK: <select-by-slots-statement> db ( tuple -- tuple )
 | 
					HOOK: <select-by-slots-statement> db ( tuple -- tuple )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
HOOK: row-column-typed db ( result-set n type -- sql )
 | 
					 | 
				
			||||||
HOOK: insert-tuple* db ( tuple statement -- )
 | 
					HOOK: insert-tuple* db ( tuple statement -- )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: resulting-tuple ( row out-params -- tuple )
 | 
					: resulting-tuple ( row out-params -- tuple )
 | 
				
			||||||
    dup first sql-spec-class construct-empty [
 | 
					    dup first sql-spec-class construct-empty [
 | 
				
			||||||
        [
 | 
					        [
 | 
				
			||||||
            >r [ sql-spec-type sql-type>factor-type ] keep
 | 
					            >r sql-spec-slot-name r> set-slot-named
 | 
				
			||||||
            sql-spec-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 [
 | 
					    [ statement-out-params ] keep query-results [
 | 
				
			||||||
        [ sql-row 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 ] with-disposal ] keep
 | 
					    [ query-results [ sql-row-typed ] with-disposal ] keep
 | 
				
			||||||
    statement-out-params rot [
 | 
					    statement-out-params rot [
 | 
				
			||||||
        >r [ sql-spec-type sql-type>factor-type ] keep
 | 
					        >r sql-spec-slot-name r> set-slot-named
 | 
				
			||||||
        sql-spec-slot-name r> set-slot-named
 | 
					 | 
				
			||||||
    ] curry 2each ;
 | 
					    ] curry 2each ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: sql-props ( class -- columns table )
 | 
					: sql-props ( class -- columns table )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -207,22 +207,3 @@ TUPLE: no-slot-named ;
 | 
				
			||||||
        >r dup sql-spec-type swap sql-spec-slot-name r>
 | 
					        >r dup sql-spec-type swap sql-spec-slot-name r>
 | 
				
			||||||
        get-slot-named swap
 | 
					        get-slot-named swap
 | 
				
			||||||
    ] curry { } map>assoc ;
 | 
					    ] curry { } map>assoc ;
 | 
				
			||||||
 | 
					 | 
				
			||||||
: sql-type>factor-type ( obj type -- obj )
 | 
					 | 
				
			||||||
break
 | 
					 | 
				
			||||||
    dup array? [ first ] when
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        { +native-id+ [ string>number ] }
 | 
					 | 
				
			||||||
        { INTEGER [ string>number ] }
 | 
					 | 
				
			||||||
        { DOUBLE [ string>number ] }
 | 
					 | 
				
			||||||
        { REAL [ string>number ] }
 | 
					 | 
				
			||||||
        { DATE [ dup [ ymd>timestamp ] when ] }
 | 
					 | 
				
			||||||
        { TIME [ dup [ hms>timestamp ] when ] }
 | 
					 | 
				
			||||||
        { DATETIME [ dup [ ymdhms>timestamp ] when ] }
 | 
					 | 
				
			||||||
        { TIMESTAMP [ dup [ ymdhms>timestamp ] when ] }
 | 
					 | 
				
			||||||
        { TEXT [ ] }
 | 
					 | 
				
			||||||
        { VARCHAR [ ] }
 | 
					 | 
				
			||||||
        { BLOB [ ] }
 | 
					 | 
				
			||||||
        { FACTOR-BLOB [ break [ deserialize ] with-string-reader ] }
 | 
					 | 
				
			||||||
        [ "no conversion from sql type to factor type" throw ]
 | 
					 | 
				
			||||||
    } case ;
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue