diff --git a/extra/cairo/png/png.factor b/extra/cairo/png/png.factor index e6a93fcc57..2fc2a26c6a 100755 --- a/extra/cairo/png/png.factor +++ b/extra/cairo/png/png.factor @@ -17,9 +17,9 @@ ERROR: cairo-error string ; : cairo-png-error ( n -- ) { - { \ CAIRO_STATUS_NO_MEMORY [ "Cairo: no memory" cairo-error ] } - { \ CAIRO_STATUS_FILE_NOT_FOUND [ "Cairo: file not found" cairo-error ] } - { \ CAIRO_STATUS_READ_ERROR [ "Cairo: read error" cairo-error ] } + { CAIRO_STATUS_NO_MEMORY [ "Cairo: no memory" cairo-error ] } + { CAIRO_STATUS_FILE_NOT_FOUND [ "Cairo: file not found" cairo-error ] } + { CAIRO_STATUS_READ_ERROR [ "Cairo: read error" cairo-error ] } [ drop ] } cond ; diff --git a/extra/odbc/odbc.factor b/extra/odbc/odbc.factor index a809c611b5..59f5095aad 100644 --- a/extra/odbc/odbc.factor +++ b/extra/odbc/odbc.factor @@ -1,270 +1,270 @@ -! Copyright (C) 2007 Chris Double. -! See http://factorcode.org/license.txt for BSD license. -USING: kernel alien alien.syntax combinators alien.c-types - strings sequences namespaces words math threads ; -IN: odbc - -"odbc" "odbc32.dll" "stdcall" add-library - -LIBRARY: odbc - -TYPEDEF: void* usb_dev_handle* -TYPEDEF: short SQLRETURN -TYPEDEF: short SQLSMALLINT -TYPEDEF: short* SQLSMALLINT* -TYPEDEF: ushort SQLUSMALLINT -TYPEDEF: uint* SQLUINTEGER* -TYPEDEF: int SQLINTEGER -TYPEDEF: char SQLCHAR -TYPEDEF: char* SQLCHAR* -TYPEDEF: void* SQLHANDLE -TYPEDEF: void* SQLHANDLE* -TYPEDEF: void* SQLHENV -TYPEDEF: void* SQLHDBC -TYPEDEF: void* SQLHSTMT -TYPEDEF: void* SQLHWND -TYPEDEF: void* SQLPOINTER - -: SQL-HANDLE-ENV ( -- number ) 1 ; inline -: SQL-HANDLE-DBC ( -- number ) 2 ; inline -: SQL-HANDLE-STMT ( -- number ) 3 ; inline -: SQL-HANDLE-DESC ( -- number ) 4 ; inline - -: SQL-NULL-HANDLE ( -- alien ) f ; inline - -: SQL-ATTR-ODBC-VERSION ( -- number ) 200 ; inline - -: SQL-OV-ODBC2 ( -- number ) 2 ; inline -: SQL-OV-ODBC3 ( -- number ) 3 ; inline - -: SQL-SUCCESS ( -- number ) 0 ; inline -: SQL-SUCCESS-WITH-INFO ( -- number ) 1 ; inline -: SQL-NO-DATA-FOUND ( -- number ) 100 ; inline - -: SQL-DRIVER-NOPROMPT ( -- number ) 0 ; inline -: SQL-DRIVER-PROMPT ( -- number ) 2 ; inline - -: SQL-C-DEFAULT ( -- number ) 99 ; inline - -SYMBOL: SQL-CHAR -SYMBOL: SQL-VARCHAR -SYMBOL: SQL-LONGVARCHAR -SYMBOL: SQL-WCHAR -SYMBOL: SQL-WCHARVAR -SYMBOL: SQL-WLONGCHARVAR -SYMBOL: SQL-DECIMAL -SYMBOL: SQL-SMALLINT -SYMBOL: SQL-NUMERIC -SYMBOL: SQL-INTEGER -SYMBOL: SQL-REAL -SYMBOL: SQL-FLOAT -SYMBOL: SQL-DOUBLE -SYMBOL: SQL-BIT -SYMBOL: SQL-TINYINT -SYMBOL: SQL-BIGINT -SYMBOL: SQL-BINARY -SYMBOL: SQL-VARBINARY -SYMBOL: SQL-LONGVARBINARY -SYMBOL: SQL-TYPE-DATE -SYMBOL: SQL-TYPE-TIME -SYMBOL: SQL-TYPE-TIMESTAMP -SYMBOL: SQL-TYPE-UTCDATETIME -SYMBOL: SQL-TYPE-UTCTIME -SYMBOL: SQL-INTERVAL-MONTH -SYMBOL: SQL-INTERVAL-YEAR -SYMBOL: SQL-INTERVAL-YEAR-TO-MONTH -SYMBOL: SQL-INTERVAL-DAY -SYMBOL: SQL-INTERVAL-HOUR -SYMBOL: SQL-INTERVAL-MINUTE -SYMBOL: SQL-INTERVAL-SECOND -SYMBOL: SQL-INTERVAL-DAY-TO-HOUR -SYMBOL: SQL-INTERVAL-DAY-TO-MINUTE -SYMBOL: SQL-INTERVAL-DAY-TO-SECOND -SYMBOL: SQL-INTERVAL-HOUR-TO-MINUTE -SYMBOL: SQL-INTERVAL-HOUR-TO-SECOND -SYMBOL: SQL-INTERVAL-MINUTE-TO-SECOND -SYMBOL: SQL-GUID -SYMBOL: SQL-TYPE-UNKNOWN - -: convert-sql-type ( number -- symbol ) - { - { 1 [ SQL-CHAR ] } - { 12 [ SQL-VARCHAR ] } - { -1 [ SQL-LONGVARCHAR ] } - { -8 [ SQL-WCHAR ] } - { -9 [ SQL-WCHARVAR ] } - { -10 [ SQL-WLONGCHARVAR ] } - { 3 [ SQL-DECIMAL ] } - { 5 [ SQL-SMALLINT ] } - { 2 [ SQL-NUMERIC ] } - { 4 [ SQL-INTEGER ] } - { 7 [ SQL-REAL ] } - { 6 [ SQL-FLOAT ] } - { 8 [ SQL-DOUBLE ] } - { -7 [ SQL-BIT ] } - { -6 [ SQL-TINYINT ] } - { -5 [ SQL-BIGINT ] } - { -2 [ SQL-BINARY ] } - { -3 [ SQL-VARBINARY ] } - { -4 [ SQL-LONGVARBINARY ] } - { 91 [ SQL-TYPE-DATE ] } - { 92 [ SQL-TYPE-TIME ] } - { 93 [ SQL-TYPE-TIMESTAMP ] } - [ drop SQL-TYPE-UNKNOWN ] - } case ; - -: succeeded? ( n -- bool ) - #! Did the call succeed (SQL-SUCCESS or SQL-SUCCESS-WITH-INFO) - { - { \ SQL-SUCCESS [ t ] } - { \ SQL-SUCCESS-WITH-INFO [ t ] } - [ drop f ] - } case ; - -FUNCTION: SQLRETURN SQLAllocHandle ( SQLSMALLINT handleType, SQLHANDLE inputHandle, SQLHANDLE* outputHandlePtr ) ; -FUNCTION: SQLRETURN SQLSetEnvAttr ( SQLHENV environmentHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER stringLength ) ; -FUNCTION: SQLRETURN SQLDriverConnect ( SQLHDBC connectionHandle, SQLHWND windowHandle, SQLCHAR* inConnectionString, SQLSMALLINT stringLength, SQLCHAR* outConnectionString, SQLSMALLINT bufferLength, SQLSMALLINT* stringLength2Ptr, SQLUSMALLINT driverCompletion ) ; -FUNCTION: SQLRETURN SQLDisconnect ( SQLHDBC connectionHandle ) ; -FUNCTION: SQLRETURN SQLPrepare ( SQLHSTMT statementHandle, SQLCHAR* statementText, SQLINTEGER length ) ; -FUNCTION: SQLRETURN SQLExecute ( SQLHSTMT statementHandle ) ; -FUNCTION: SQLRETURN SQLFreeHandle ( SQLSMALLINT handleType, SQLHANDLE handle ) ; -FUNCTION: SQLRETURN SQLFetch ( SQLHSTMT statementHandle ) ; -FUNCTION: SQLRETURN SQLNumResultCols ( SQLHSTMT statementHandle, SQLSMALLINT* columnCountPtr ) ; -FUNCTION: SQLRETURN SQLDescribeCol ( SQLHSTMT statementHandle, SQLSMALLINT columnNumber, SQLCHAR* columnName, SQLSMALLINT bufferLength, SQLSMALLINT* nameLengthPtr, SQLSMALLINT* dataTypePtr, SQLUINTEGER* columnSizePtr, SQLSMALLINT* decimalDigitsPtr, SQLSMALLINT* nullablePtr ) ; -FUNCTION: SQLRETURN SQLGetData ( SQLHSTMT statementHandle, SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValuePtr, SQLINTEGER bufferLength, SQLINTEGER* strlen_or_indPtr ) ; - -: alloc-handle ( type parent -- handle ) - f [ SQLAllocHandle ] keep swap succeeded? [ - *void* - ] [ - drop f - ] if ; - -: alloc-env-handle ( -- handle ) - SQL-HANDLE-ENV SQL-NULL-HANDLE alloc-handle ; - -: alloc-dbc-handle ( env -- handle ) - SQL-HANDLE-DBC swap alloc-handle ; - -: alloc-stmt-handle ( dbc -- handle ) - SQL-HANDLE-STMT swap alloc-handle ; - -: temp-string ( length -- byte-array length ) - [ CHAR: \space string>char-alien ] keep ; - -: odbc-init ( -- env ) - alloc-env-handle - [ - SQL-ATTR-ODBC-VERSION SQL-OV-ODBC3 0 SQLSetEnvAttr - succeeded? [ "odbc-init failed" throw ] unless - ] keep ; - -: odbc-connect ( env dsn -- dbc ) - >r alloc-dbc-handle dup r> - f swap dup length 1024 temp-string 0 SQL-DRIVER-NOPROMPT - SQLDriverConnect succeeded? [ "odbc-connect failed" throw ] unless ; - -: odbc-disconnect ( dbc -- ) - SQLDisconnect succeeded? [ "odbc-disconnect failed" throw ] unless ; - -: odbc-prepare ( dbc string -- statement ) - >r alloc-stmt-handle dup r> dup length SQLPrepare succeeded? [ "odbc-prepare failed" throw ] unless ; - -: odbc-free-statement ( statement -- ) - SQL-HANDLE-STMT swap SQLFreeHandle succeeded? [ "odbc-free-statement failed" throw ] unless ; - -: odbc-execute ( statement -- ) - SQLExecute succeeded? [ "odbc-execute failed" throw ] unless ; - -: odbc-next-row ( statement -- bool ) - SQLFetch succeeded? ; - -: odbc-number-of-columns ( statement -- number ) - 0 [ SQLNumResultCols succeeded? ] keep swap [ - *short - ] [ - drop f - ] if ; - -TUPLE: column nullable digits size type name number ; - -C: column - -: odbc-describe-column ( statement n -- column ) - dup >r - 1024 CHAR: \space string>char-alien dup >r - 1024 - 0 - 0 dup >r - 0 dup >r - 0 dup >r - 0 dup >r - SQLDescribeCol succeeded? [ - r> *short - r> *short - r> *uint - r> *short convert-sql-type - r> alien>char-string - r> - ] [ - r> drop r> drop r> drop r> drop r> drop r> drop - "odbc-describe-column failed" throw - ] if ; - -: dereference-type-pointer ( byte-array column -- object ) - column-type { - { SQL-CHAR [ alien>char-string ] } - { SQL-VARCHAR [ alien>char-string ] } - { SQL-LONGVARCHAR [ alien>char-string ] } - { SQL-WCHAR [ alien>char-string ] } - { SQL-WCHARVAR [ alien>char-string ] } - { SQL-WLONGCHARVAR [ alien>char-string ] } - { SQL-SMALLINT [ *short ] } - { SQL-INTEGER [ *long ] } - { SQL-REAL [ *float ] } - { SQL-FLOAT [ *double ] } - { SQL-DOUBLE [ *double ] } - { SQL-TINYINT [ *char ] } - { SQL-BIGINT [ *longlong ] } - [ nip [ "Unknown SQL Type: " % word-name % ] "" make ] - } case ; - -TUPLE: field value column ; - -C: field - -: odbc-get-field ( statement column -- field ) - dup column? [ dupd odbc-describe-column ] unless dup >r column-number - SQL-C-DEFAULT - 8192 CHAR: \space string>char-alien dup >r - 8192 - f SQLGetData succeeded? [ - r> r> [ dereference-type-pointer ] keep - ] [ - r> drop r> [ - "SQLGetData Failed for Column: " % - dup column-name % - " of type: " % dup column-type word-name % - ] "" make swap - ] if ; - -: odbc-get-row-fields ( statement -- seq ) - [ - dup odbc-number-of-columns [ - 1+ odbc-get-field field-value , - ] with each - ] { } make ; - -: (odbc-get-all-rows) ( statement -- ) - dup odbc-next-row [ dup odbc-get-row-fields , yield (odbc-get-all-rows) ] [ drop ] if ; - -: odbc-get-all-rows ( statement -- seq ) - [ (odbc-get-all-rows) ] { } make ; - -: odbc-query ( string dsn -- result ) - odbc-init swap odbc-connect [ - swap odbc-prepare - dup odbc-execute - dup odbc-get-all-rows - swap odbc-free-statement - ] keep odbc-disconnect ; +! Copyright (C) 2007 Chris Double. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel alien alien.syntax combinators alien.c-types + strings sequences namespaces words math threads ; +IN: odbc + +"odbc" "odbc32.dll" "stdcall" add-library + +LIBRARY: odbc + +TYPEDEF: void* usb_dev_handle* +TYPEDEF: short SQLRETURN +TYPEDEF: short SQLSMALLINT +TYPEDEF: short* SQLSMALLINT* +TYPEDEF: ushort SQLUSMALLINT +TYPEDEF: uint* SQLUINTEGER* +TYPEDEF: int SQLINTEGER +TYPEDEF: char SQLCHAR +TYPEDEF: char* SQLCHAR* +TYPEDEF: void* SQLHANDLE +TYPEDEF: void* SQLHANDLE* +TYPEDEF: void* SQLHENV +TYPEDEF: void* SQLHDBC +TYPEDEF: void* SQLHSTMT +TYPEDEF: void* SQLHWND +TYPEDEF: void* SQLPOINTER + +: SQL-HANDLE-ENV ( -- number ) 1 ; inline +: SQL-HANDLE-DBC ( -- number ) 2 ; inline +: SQL-HANDLE-STMT ( -- number ) 3 ; inline +: SQL-HANDLE-DESC ( -- number ) 4 ; inline + +: SQL-NULL-HANDLE ( -- alien ) f ; inline + +: SQL-ATTR-ODBC-VERSION ( -- number ) 200 ; inline + +: SQL-OV-ODBC2 ( -- number ) 2 ; inline +: SQL-OV-ODBC3 ( -- number ) 3 ; inline + +: SQL-SUCCESS ( -- number ) 0 ; inline +: SQL-SUCCESS-WITH-INFO ( -- number ) 1 ; inline +: SQL-NO-DATA-FOUND ( -- number ) 100 ; inline + +: SQL-DRIVER-NOPROMPT ( -- number ) 0 ; inline +: SQL-DRIVER-PROMPT ( -- number ) 2 ; inline + +: SQL-C-DEFAULT ( -- number ) 99 ; inline + +SYMBOL: SQL-CHAR +SYMBOL: SQL-VARCHAR +SYMBOL: SQL-LONGVARCHAR +SYMBOL: SQL-WCHAR +SYMBOL: SQL-WCHARVAR +SYMBOL: SQL-WLONGCHARVAR +SYMBOL: SQL-DECIMAL +SYMBOL: SQL-SMALLINT +SYMBOL: SQL-NUMERIC +SYMBOL: SQL-INTEGER +SYMBOL: SQL-REAL +SYMBOL: SQL-FLOAT +SYMBOL: SQL-DOUBLE +SYMBOL: SQL-BIT +SYMBOL: SQL-TINYINT +SYMBOL: SQL-BIGINT +SYMBOL: SQL-BINARY +SYMBOL: SQL-VARBINARY +SYMBOL: SQL-LONGVARBINARY +SYMBOL: SQL-TYPE-DATE +SYMBOL: SQL-TYPE-TIME +SYMBOL: SQL-TYPE-TIMESTAMP +SYMBOL: SQL-TYPE-UTCDATETIME +SYMBOL: SQL-TYPE-UTCTIME +SYMBOL: SQL-INTERVAL-MONTH +SYMBOL: SQL-INTERVAL-YEAR +SYMBOL: SQL-INTERVAL-YEAR-TO-MONTH +SYMBOL: SQL-INTERVAL-DAY +SYMBOL: SQL-INTERVAL-HOUR +SYMBOL: SQL-INTERVAL-MINUTE +SYMBOL: SQL-INTERVAL-SECOND +SYMBOL: SQL-INTERVAL-DAY-TO-HOUR +SYMBOL: SQL-INTERVAL-DAY-TO-MINUTE +SYMBOL: SQL-INTERVAL-DAY-TO-SECOND +SYMBOL: SQL-INTERVAL-HOUR-TO-MINUTE +SYMBOL: SQL-INTERVAL-HOUR-TO-SECOND +SYMBOL: SQL-INTERVAL-MINUTE-TO-SECOND +SYMBOL: SQL-GUID +SYMBOL: SQL-TYPE-UNKNOWN + +: convert-sql-type ( number -- symbol ) + { + { 1 [ SQL-CHAR ] } + { 12 [ SQL-VARCHAR ] } + { -1 [ SQL-LONGVARCHAR ] } + { -8 [ SQL-WCHAR ] } + { -9 [ SQL-WCHARVAR ] } + { -10 [ SQL-WLONGCHARVAR ] } + { 3 [ SQL-DECIMAL ] } + { 5 [ SQL-SMALLINT ] } + { 2 [ SQL-NUMERIC ] } + { 4 [ SQL-INTEGER ] } + { 7 [ SQL-REAL ] } + { 6 [ SQL-FLOAT ] } + { 8 [ SQL-DOUBLE ] } + { -7 [ SQL-BIT ] } + { -6 [ SQL-TINYINT ] } + { -5 [ SQL-BIGINT ] } + { -2 [ SQL-BINARY ] } + { -3 [ SQL-VARBINARY ] } + { -4 [ SQL-LONGVARBINARY ] } + { 91 [ SQL-TYPE-DATE ] } + { 92 [ SQL-TYPE-TIME ] } + { 93 [ SQL-TYPE-TIMESTAMP ] } + [ drop SQL-TYPE-UNKNOWN ] + } case ; + +: succeeded? ( n -- bool ) + #! Did the call succeed (SQL-SUCCESS or SQL-SUCCESS-WITH-INFO) + { + { SQL-SUCCESS [ t ] } + { SQL-SUCCESS-WITH-INFO [ t ] } + [ drop f ] + } case ; + +FUNCTION: SQLRETURN SQLAllocHandle ( SQLSMALLINT handleType, SQLHANDLE inputHandle, SQLHANDLE* outputHandlePtr ) ; +FUNCTION: SQLRETURN SQLSetEnvAttr ( SQLHENV environmentHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER stringLength ) ; +FUNCTION: SQLRETURN SQLDriverConnect ( SQLHDBC connectionHandle, SQLHWND windowHandle, SQLCHAR* inConnectionString, SQLSMALLINT stringLength, SQLCHAR* outConnectionString, SQLSMALLINT bufferLength, SQLSMALLINT* stringLength2Ptr, SQLUSMALLINT driverCompletion ) ; +FUNCTION: SQLRETURN SQLDisconnect ( SQLHDBC connectionHandle ) ; +FUNCTION: SQLRETURN SQLPrepare ( SQLHSTMT statementHandle, SQLCHAR* statementText, SQLINTEGER length ) ; +FUNCTION: SQLRETURN SQLExecute ( SQLHSTMT statementHandle ) ; +FUNCTION: SQLRETURN SQLFreeHandle ( SQLSMALLINT handleType, SQLHANDLE handle ) ; +FUNCTION: SQLRETURN SQLFetch ( SQLHSTMT statementHandle ) ; +FUNCTION: SQLRETURN SQLNumResultCols ( SQLHSTMT statementHandle, SQLSMALLINT* columnCountPtr ) ; +FUNCTION: SQLRETURN SQLDescribeCol ( SQLHSTMT statementHandle, SQLSMALLINT columnNumber, SQLCHAR* columnName, SQLSMALLINT bufferLength, SQLSMALLINT* nameLengthPtr, SQLSMALLINT* dataTypePtr, SQLUINTEGER* columnSizePtr, SQLSMALLINT* decimalDigitsPtr, SQLSMALLINT* nullablePtr ) ; +FUNCTION: SQLRETURN SQLGetData ( SQLHSTMT statementHandle, SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValuePtr, SQLINTEGER bufferLength, SQLINTEGER* strlen_or_indPtr ) ; + +: alloc-handle ( type parent -- handle ) + f [ SQLAllocHandle ] keep swap succeeded? [ + *void* + ] [ + drop f + ] if ; + +: alloc-env-handle ( -- handle ) + SQL-HANDLE-ENV SQL-NULL-HANDLE alloc-handle ; + +: alloc-dbc-handle ( env -- handle ) + SQL-HANDLE-DBC swap alloc-handle ; + +: alloc-stmt-handle ( dbc -- handle ) + SQL-HANDLE-STMT swap alloc-handle ; + +: temp-string ( length -- byte-array length ) + [ CHAR: \space string>char-alien ] keep ; + +: odbc-init ( -- env ) + alloc-env-handle + [ + SQL-ATTR-ODBC-VERSION SQL-OV-ODBC3 0 SQLSetEnvAttr + succeeded? [ "odbc-init failed" throw ] unless + ] keep ; + +: odbc-connect ( env dsn -- dbc ) + >r alloc-dbc-handle dup r> + f swap dup length 1024 temp-string 0 SQL-DRIVER-NOPROMPT + SQLDriverConnect succeeded? [ "odbc-connect failed" throw ] unless ; + +: odbc-disconnect ( dbc -- ) + SQLDisconnect succeeded? [ "odbc-disconnect failed" throw ] unless ; + +: odbc-prepare ( dbc string -- statement ) + >r alloc-stmt-handle dup r> dup length SQLPrepare succeeded? [ "odbc-prepare failed" throw ] unless ; + +: odbc-free-statement ( statement -- ) + SQL-HANDLE-STMT swap SQLFreeHandle succeeded? [ "odbc-free-statement failed" throw ] unless ; + +: odbc-execute ( statement -- ) + SQLExecute succeeded? [ "odbc-execute failed" throw ] unless ; + +: odbc-next-row ( statement -- bool ) + SQLFetch succeeded? ; + +: odbc-number-of-columns ( statement -- number ) + 0 [ SQLNumResultCols succeeded? ] keep swap [ + *short + ] [ + drop f + ] if ; + +TUPLE: column nullable digits size type name number ; + +C: column + +: odbc-describe-column ( statement n -- column ) + dup >r + 1024 CHAR: \space string>char-alien dup >r + 1024 + 0 + 0 dup >r + 0 dup >r + 0 dup >r + 0 dup >r + SQLDescribeCol succeeded? [ + r> *short + r> *short + r> *uint + r> *short convert-sql-type + r> alien>char-string + r> + ] [ + r> drop r> drop r> drop r> drop r> drop r> drop + "odbc-describe-column failed" throw + ] if ; + +: dereference-type-pointer ( byte-array column -- object ) + column-type { + { SQL-CHAR [ alien>char-string ] } + { SQL-VARCHAR [ alien>char-string ] } + { SQL-LONGVARCHAR [ alien>char-string ] } + { SQL-WCHAR [ alien>char-string ] } + { SQL-WCHARVAR [ alien>char-string ] } + { SQL-WLONGCHARVAR [ alien>char-string ] } + { SQL-SMALLINT [ *short ] } + { SQL-INTEGER [ *long ] } + { SQL-REAL [ *float ] } + { SQL-FLOAT [ *double ] } + { SQL-DOUBLE [ *double ] } + { SQL-TINYINT [ *char ] } + { SQL-BIGINT [ *longlong ] } + [ nip [ "Unknown SQL Type: " % word-name % ] "" make ] + } case ; + +TUPLE: field value column ; + +C: field + +: odbc-get-field ( statement column -- field ) + dup column? [ dupd odbc-describe-column ] unless dup >r column-number + SQL-C-DEFAULT + 8192 CHAR: \space string>char-alien dup >r + 8192 + f SQLGetData succeeded? [ + r> r> [ dereference-type-pointer ] keep + ] [ + r> drop r> [ + "SQLGetData Failed for Column: " % + dup column-name % + " of type: " % dup column-type word-name % + ] "" make swap + ] if ; + +: odbc-get-row-fields ( statement -- seq ) + [ + dup odbc-number-of-columns [ + 1+ odbc-get-field field-value , + ] with each + ] { } make ; + +: (odbc-get-all-rows) ( statement -- ) + dup odbc-next-row [ dup odbc-get-row-fields , yield (odbc-get-all-rows) ] [ drop ] if ; + +: odbc-get-all-rows ( statement -- seq ) + [ (odbc-get-all-rows) ] { } make ; + +: odbc-query ( string dsn -- result ) + odbc-init swap odbc-connect [ + swap odbc-prepare + dup odbc-execute + dup odbc-get-all-rows + swap odbc-free-statement + ] keep odbc-disconnect ; diff --git a/extra/oracle/oracle.factor b/extra/oracle/oracle.factor index 441abd928e..44b746f8ce 100644 --- a/extra/oracle/oracle.factor +++ b/extra/oracle/oracle.factor @@ -35,18 +35,18 @@ C: connection : check-result ( result -- ) { - { \ OCI_SUCCESS [ ] } - { \ OCI_ERROR [ err get get-oci-error ] } - { \ OCI_INVALID_HANDLE [ "invalid handle" throw ] } + { OCI_SUCCESS [ ] } + { OCI_ERROR [ err get get-oci-error ] } + { OCI_INVALID_HANDLE [ "invalid handle" throw ] } [ "operation failed" throw ] } case ; : check-status ( status -- bool ) { - { \ OCI_SUCCESS [ t ] } - { \ OCI_ERROR [ err get get-oci-error ] } - { \ OCI_INVALID_HANDLE [ "invalid handle" throw ] } - { \ OCI_NO_DATA [ f ] } + { OCI_SUCCESS [ t ] } + { OCI_ERROR [ err get get-oci-error ] } + { OCI_INVALID_HANDLE [ "invalid handle" throw ] } + { OCI_NO_DATA [ f ] } [ "operation failed" throw ] } case ; @@ -155,12 +155,12 @@ C: connection : calculate-size ( type -- size ) { - { \ SQLT_INT [ "int" heap-size ] } - { \ SQLT_FLT [ "float" heap-size ] } - { \ SQLT_CHR [ "char" heap-size ] } - { \ SQLT_NUM [ "int" heap-size 10 * ] } - { \ SQLT_STR [ 64 ] } - { \ SQLT_ODT [ 256 ] } + { SQLT_INT [ "int" heap-size ] } + { SQLT_FLT [ "float" heap-size ] } + { SQLT_CHR [ "char" heap-size ] } + { SQLT_NUM [ "int" heap-size 10 * ] } + { SQLT_STR [ 64 ] } + { SQLT_ODT [ 256 ] } } case ; : define-by-position ( position type -- )