]> gitweb.factorcode.org Git - factor.git/commitdiff
odbc: add all of the ffi functions i could find, write check-statement
authorDoug Coleman <doug.coleman@gmail.com>
Sun, 7 May 2023 02:13:28 +0000 (21:13 -0500)
committerDoug Coleman <doug.coleman@gmail.com>
Sun, 7 May 2023 02:19:32 +0000 (21:19 -0500)
extra/odbc/odbc-docs.factor
extra/odbc/odbc.factor
extra/odbc/platforms.txt [deleted file]

index 2cf1e5d8edd19692a03fc2f8f3341d06c527e50a..08974c05d18728f07ecb613e17a09f6dcad45220 100644 (file)
@@ -22,7 +22,7 @@ HELP: odbc-connect
     "Connects to the database identified by the ODBC data source name (DSN). "
     "The environment handle is usually obtained by a call to " { $link odbc-init } ". The result is the ODBC connection handle which can be used in other ODBC calls. When finished with the connection handle " { $link odbc-disconnect } " must be called on it."
 }
-{ $examples { $code "dbc get \"DSN=mydsn\" odbc-connect" } }
+{ $examples { $code "dbc get \"DSN=snowflake; UID=sheeple; PWD=sekrit\" odbc-connect" } }
 { $see-also odbc-init odbc-connect odbc-disconnect odbc-prepare odbc-free-statement odbc-execute odbc-next-row odbc-number-of-columns odbc-describe-column odbc-get-field odbc-get-row-fields odbc-get-all-rows odbc-query } ;
 
 HELP: odbc-disconnect
@@ -119,4 +119,5 @@ HELP: odbc-query
 { $description
     "This word initializes odbc, connects to the database with the given DSN, executes the query string and returns the result as a sequence. It cleans up all resources it uses. It is an inefficient way of running multiple queries but is useful for the occasional query, testing at the REPL, or as an example of how to do it."
 }
+{ $examples { $code "\"select 1\" \"DSN=snowflake; UID=sheeple; PWD=sekrit\" odbc-query" } }
 { $see-also odbc-init odbc-connect odbc-disconnect odbc-prepare odbc-free-statement odbc-execute odbc-next-row odbc-number-of-columns odbc-describe-column odbc-get-field odbc-get-row-fields odbc-get-all-rows odbc-query } ;
index 734ce8de7945fa3c6b0308b2613bf24c62c4aba1..3386aebd13c22d26deadd01025c94b7745e09318 100644 (file)
@@ -1,13 +1,20 @@
-! Copyright (C) 2007 Chris Double, 2016 Alexander Ilin.
+! Copyright (C) 2007 Chris Double, 2016 Alexander Ilin, 2023 Doug Coleman.
 ! See https://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.c-types alien.data alien.libraries
-alien.strings alien.syntax combinators continuations
-io.encodings.ascii kernel locals make math sequences strings
-threads ;
+alien.strings alien.syntax arrays calendar combinators
+combinators.extras continuations endian generalizations
+io.encodings.ascii io.encodings.string io.encodings.utf8 kernel
+make math pack sequences sequences.generalizations strings
+system threads vocabs.platforms ;
 FROM: alien.c-types => float short ;
 IN: odbc
 
-<< "odbc" "odbc32.dll" stdcall add-library >>
+<< "odbc" {
+    { [ os macosx? ] [ "libiodbc.dylib" ] }
+    { [ os unix? ] [ "libodbc.so" ] }
+    { [ os windows? ] [ "odbc32.dll" ] }
+} cond
+stdcall add-library >>
 
 LIBRARY: odbc
 
@@ -23,6 +30,21 @@ TYPEDEF: void* SQLHDBC
 TYPEDEF: void* SQLHSTMT
 TYPEDEF: void* SQLHWND
 TYPEDEF: void* SQLPOINTER
+TYPEDEF: void* SQLHDESC
+
+<32
+TYPEDEF: long SQLLEN
+TYPEDEF: ulong SQLULEN
+TYPEDEF: long SQLBIGINT
+TYPEDEF: ulong SQLUBIGINT
+32>
+
+<64
+TYPEDEF: longlong SQLLEN
+TYPEDEF: ulonglong SQLULEN
+TYPEDEF: longlong SQLBIGINT
+TYPEDEF: ulonglong SQLUBIGINT
+64>
 
 CONSTANT: SQL-HANDLE-ENV  1
 CONSTANT: SQL-HANDLE-DBC  2
@@ -31,22 +53,53 @@ CONSTANT: SQL-HANDLE-DESC 4
 
 CONSTANT: SQL-NULL-HANDLE f
 
-CONSTANT: SQL-ATTR-ODBC-VERSION 200
+CONSTANT: SQL_MAX_MESSAGE_LENGTH 512
+
+CONSTANT: SQL_SQLSTATE_SIZE 5
+
+CONSTANT: SQL-ATTR-ODBC-VERSION 200 ! ODBC 3.8
 
 : SQL-OV-ODBC2 ( -- number ) 2 <alien> ; inline
 : SQL-OV-ODBC3 ( -- number ) 3 <alien> ; inline
 
-CONSTANT: SQL_ERROR 0
+CONSTANT: SQL_HANDLE_ENV 1
+CONSTANT: SQL_HANDLE_DBC 2
+CONSTANT: SQL_HANDLE_STMT 3
+CONSTANT: SQL_HANDLE_DESC 4
+
+CONSTANT: SQL_NULL_HANDLE 0
+
+CONSTANT: SQL_NTS -3
+
+CONSTANT: SQL-DRIVER-NOPROMPT 0
+CONSTANT: SQL-DRIVER-PROMPT 2
+
+CONSTANT: SQL_COMMIT 0
+CONSTANT: SQL_ROLLBACK 1
+
+CONSTANT: SQL_ATTR_CONNECTION_TIMEOUT 113
+CONSTANT: SQL_ATTR_QUERY_TIMEOUT 0
+
+CONSTANT: SQL_FETCH_NEXT 1
+CONSTANT: SQL_FETCH_FIRST 2
+CONSTANT: SQL_FETCH_LAST 3
+CONSTANT: SQL_FETCH_PRIOR 4
+CONSTANT: SQL_FETCH_ABSOLUTE 5
+CONSTANT: SQL_FETCH_RELATIVE 6
+CONSTANT: SQL_FETCH_BOOKMARK 8
+
+CONSTANT: SQL_CLOSE 0
+CONSTANT: SQL_DROP 1
+CONSTANT: SQL_UNBIND 2
+CONSTANT: SQL_RESET_PARAMS 3
+
+CONSTANT: SQL_ERROR -1
 CONSTANT: SQL_SUCCESS 0
 CONSTANT: SQL_SUCCESS_WITH_INFO 1
 CONSTANT: SQL_INVALID_HANDLE -2
 CONSTANT: SQL_NO_DATA 100
 
 CONSTANT: SQL_NO_DATA_FOUND 100
-
-CONSTANT: SQL-DRIVER-NOPROMPT 0
-CONSTANT: SQL-DRIVER-PROMPT 2
-
 CONSTANT: SQL-C-DEFAULT 99
 
 SYMBOLS:
@@ -65,7 +118,9 @@ SYMBOLS:
     SQL-INTERVAL-DAY-TO-HOUR SQL-INTERVAL-DAY-TO-MINUTE
     SQL-INTERVAL-DAY-TO-SECOND
     SQL-INTERVAL-HOUR-TO-MINUTE SQL-INTERVAL-HOUR-TO-SECOND SQL-INTERVAL-MINUTE-TO-SECOND
-    SQL-GUID
+    SQL-GUID SQL-XML SQL-UDT SQL-GEOMETRY SQL-GEOMETRYCOLLECTION SQL-CIRCULARSTRING
+    SQL-COMPOUNDCURVE SQL-CURVEPOLYGON SQL-FULLTEXT SQL-FULLTEXTKEY SQL-LINESTRING
+    SQL-MULTILINESTRING SQL-MULTIPOINT SQL-MULTIPOLYGON SQL-POINT SQL-POLYGON
     SQL-TYPE-UNKNOWN ;
 
 : convert-sql-type ( number -- symbol )
@@ -92,9 +147,113 @@ SYMBOLS:
         {  91 [ SQL-TYPE-DATE ] }
         {  92 [ SQL-TYPE-TIME ] }
         {  93 [ SQL-TYPE-TIMESTAMP ] }
+        {  -151 [ SQL-XML ] }
+        {  -152 [ SQL-UDT ] }
+        {  -153 [ SQL-GEOMETRY ] }
+        {  -154 [ SQL-GEOMETRYCOLLECTION ] }
+        {  -155 [ SQL-CIRCULARSTRING ] }
+        {  -156 [ SQL-COMPOUNDCURVE ] }
+        {  -157 [ SQL-CURVEPOLYGON ] }
+        {  -158 [ SQL-FULLTEXT ] }
+        {  -159 [ SQL-FULLTEXTKEY ] }
+        {  -160 [ SQL-LINESTRING ] }
+        {  -161 [ SQL-MULTILINESTRING ] }
+        {  -162 [ SQL-MULTIPOINT ] }
+        {  -163 [ SQL-MULTIPOLYGON ] }
+        {  -164 [ SQL-POINT ] }
+        {  -165 [ SQL-POLYGON ] }
         [ drop  SQL-TYPE-UNKNOWN ]
     } case ;
 
+
+FUNCTION: SQLRETURN SQLAllocConnect ( SQLHENV environmentHandle, SQLHDBC* connectionHandlePtr )
+FUNCTION: SQLRETURN SQLAllocEnv ( SQLHENV* environmentHandlePtr )
+FUNCTION: SQLRETURN SQLAllocHandle ( SQLSMALLINT handleType, SQLHANDLE inputHandle, SQLHANDLE* outputHandlePtr )
+FUNCTION: SQLRETURN SQLAllocStmt ( SQLHDBC connectionHandle, SQLHSTMT* statementHandlePtr )
+FUNCTION: SQLRETURN SQLBindCol ( SQLHSTMT statementHandle, SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValuePtr, SQLINTEGER bufferLength, SQLINTEGER* strlen_or_indPtr )
+FUNCTION: SQLRETURN SQLBindParam ( SQLHSTMT statementHandle, SQLUSMALLINT parameterNumber, SQLSMALLINT valueType, SQLSMALLINT parameterType, SQLUINTEGER lengthPrecision, SQLSMALLINT parameterScale, SQLPOINTER parameterValuePtr, SQLINTEGER* indPtr )
+FUNCTION: SQLRETURN SQLBindParameter ( SQLHSTMT statementHandle, SQLUSMALLINT parameterNumber, SQLSMALLINT inputOutputType, SQLSMALLINT valueType, SQLSMALLINT parameterType, SQLUINTEGER columnSize, SQLSMALLINT decimalDigits, SQLPOINTER parameterValuePtr, SQLINTEGER bufferLength, SQLINTEGER* indPtr )
+FUNCTION: SQLRETURN SQLBrowseConnect ( SQLHDBC connectionHandle, SQLCHAR* inConnectionString, SQLSMALLINT stringLength, SQLCHAR* outConnectionString, SQLSMALLINT bufferLength, SQLSMALLINT* stringLength2Ptr )
+FUNCTION: SQLRETURN SQLBulkOperations ( SQLHSTMT statementHandle, SQLSMALLINT operation )
+FUNCTION: SQLRETURN SQLCancel ( SQLHSTMT statementHandle )
+FUNCTION: SQLRETURN SQLCloseCursor ( SQLHSTMT statementHandle )
+FUNCTION: SQLRETURN SQLColAttribute ( SQLHSTMT statementHandle, SQLUSMALLINT columnNumber, SQLUSMALLINT fieldIdentifier, SQLPOINTER characterAttributePtr, SQLSMALLINT bufferLength, SQLSMALLINT* stringLengthPtr, SQLLEN* numericAttributePtr )
+FUNCTION: SQLRETURN SQLColAttributes ( SQLHSTMT statementHandle, SQLUSMALLINT columnNumber, SQLUSMALLINT fieldIdentifier, SQLPOINTER characterAttributePtr, SQLSMALLINT bufferLength, SQLSMALLINT* stringLengthPtr, SQLINTEGER* numericAttributePtr )
+FUNCTION: SQLRETURN SQLColumnPrivileges ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3, SQLCHAR* columnName, SQLSMALLINT nameLength4 )
+FUNCTION: SQLRETURN SQLColumns ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3, SQLCHAR* columnName, SQLSMALLINT nameLength4 )
+FUNCTION: SQLRETURN SQLConnect ( SQLHDBC connectionHandle, SQLCHAR* serverName, SQLSMALLINT nameLength1, SQLCHAR* userName, SQLSMALLINT nameLength2, SQLCHAR* authentication, SQLSMALLINT nameLength3 )
+FUNCTION: SQLRETURN SQLCopyDesc ( SQLHDESC sourceDescHandle, SQLHDESC targetDescHandle )
+FUNCTION: SQLRETURN SQLDataSources ( SQLHENV environmentHandle, SQLUSMALLINT direction, SQLCHAR* serverName, SQLSMALLINT bufferLength1, SQLSMALLINT* nameLength1Ptr, SQLCHAR* description, SQLSMALLINT bufferLength2, SQLSMALLINT* nameLength2Ptr )
+FUNCTION: SQLRETURN SQLDescribeCol ( SQLHSTMT statementHandle, SQLSMALLINT columnNumber, SQLCHAR* columnName, SQLSMALLINT bufferLength, SQLSMALLINT* nameLengthPtr, SQLSMALLINT* dataTypePtr, SQLUINTEGER* columnSizePtr, SQLSMALLINT* decimalDigitsPtr, SQLSMALLINT* nullablePtr )
+FUNCTION: SQLRETURN SQLDescribeParam ( SQLHSTMT statementHandle, SQLUSMALLINT parameterNumber, SQLSMALLINT* dataTypePtr, SQLUINTEGER* parameterSizePtr, SQLSMALLINT* decimalDigitsPtr, SQLSMALLINT* nullablePtr )
+FUNCTION: SQLRETURN SQLDisconnect ( SQLHDBC connectionHandle )
+FUNCTION: SQLRETURN SQLDriverConnect ( SQLHDBC connectionHandle, SQLHWND windowHandle, SQLCHAR* inConnectionString, SQLSMALLINT stringLength, SQLCHAR* outConnectionString, SQLSMALLINT bufferLength, SQLSMALLINT* stringLength2Ptr, SQLUSMALLINT driverCompletion )
+FUNCTION: SQLRETURN SQLEndTran ( SQLSMALLINT handleType, SQLHANDLE handle, SQLSMALLINT completionType )
+FUNCTION: SQLRETURN SQLError ( SQLHENV environmentHandle, SQLHDBC connectionHandle, SQLHSTMT statementHandle, SQLCHAR* sqlState, SQLINTEGER* nativeErrorPtr, SQLCHAR* messageText, SQLSMALLINT bufferLength, SQLSMALLINT* textLengthPtr )
+FUNCTION: SQLRETURN SQLExecute ( SQLHSTMT statementHandle )
+FUNCTION: SQLRETURN SQLExecDirect ( SQLHSTMT statementHandle, SQLCHAR* statementText, SQLINTEGER textLength )
+FUNCTION: SQLRETURN SQLExtendedFetch ( SQLHSTMT statementHandle, SQLUSMALLINT fetchType, SQLLEN fetchOffset, SQLULEN* rowCountPtr, SQLUSMALLINT* rowStatusArray )
+FUNCTION: SQLRETURN SQLFetch ( SQLHSTMT statementHandle )
+FUNCTION: SQLRETURN SQLFetchScroll ( SQLHSTMT statementHandle, SQLSMALLINT fetchOrientation, SQLLEN fetchOffset )
+FUNCTION: SQLRETURN SQLForeignKeys ( SQLHSTMT statementHandle, SQLCHAR* pkCatalogName, SQLSMALLINT nameLength1, SQLCHAR* pkSchemaName, SQLSMALLINT nameLength2, SQLCHAR* pkTableName, SQLSMALLINT nameLength3, SQLCHAR* fkCatalogName, SQLSMALLINT nameLength4, SQLCHAR* fkSchemaName, SQLSMALLINT nameLength5, SQLCHAR* fkTableName, SQLSMALLINT nameLength6 )
+FUNCTION: SQLRETURN SQLFreeConnect ( SQLHDBC connectionHandle )
+FUNCTION: SQLRETURN SQLFreeHandle ( SQLSMALLINT handleType, SQLHANDLE handle )
+FUNCTION: SQLRETURN SQLFreeEnv ( SQLHENV environmentHandle )
+FUNCTION: SQLRETURN SQLFreeStmt ( SQLHSTMT statementHandle, SQLUSMALLINT option )
+FUNCTION: SQLRETURN SQLGetConnectAttr ( SQLHDBC connectionHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER bufferLength, SQLINTEGER* stringLengthPtr )
+FUNCTION: SQLRETURN SQLGetConnectOption ( SQLHDBC connectionHandle, SQLUSMALLINT option, SQLPOINTER valuePtr )
+FUNCTION: SQLRETURN SQLGetCursorName ( SQLHSTMT statementHandle, SQLCHAR* cursorName, SQLSMALLINT bufferLength, SQLSMALLINT* nameLengthPtr )
+FUNCTION: SQLRETURN SQLGetData ( SQLHSTMT statementHandle, SQLUSMALLINT columnNumber, SQLSMALLINT targetType, SQLPOINTER targetValuePtr, SQLINTEGER bufferLength, SQLINTEGER* strlen_or_indPtr )
+FUNCTION: SQLRETURN SQLGetDescField ( SQLHDESC descriptorHandle, SQLSMALLINT recNumber, SQLSMALLINT fieldIdentifier, SQLPOINTER valuePtr, SQLINTEGER bufferLength, SQLINTEGER* stringLengthPtr )
+FUNCTION: SQLRETURN SQLGetDescRec ( SQLHDESC descriptorHandle, SQLSMALLINT recNumber, SQLCHAR* name, SQLSMALLINT bufferLength, SQLSMALLINT* stringLengthPtr, SQLSMALLINT* typePtr, SQLSMALLINT* subTypePtr, SQLLEN* lengthPtr, SQLSMALLINT* precisionPtr, SQLSMALLINT* scalePtr, SQLSMALLINT* nullablePtr )
+FUNCTION: SQLRETURN SQLGetDiagField ( SQLSMALLINT handleType, SQLHANDLE handle, SQLSMALLINT recNumber, SQLSMALLINT diagIdentifier, SQLPOINTER diagInfoPtr, SQLSMALLINT bufferLength, SQLSMALLINT* stringLengthPtr )
+FUNCTION: SQLRETURN SQLGetDiagRec ( SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, SQLCHAR* SQLState, SQLINTEGER* NativeErrorPtr, SQLCHAR* MessageText, SQLSMALLINT BufferLength, SQLSMALLINT* TextLengthPtr )
+FUNCTION: SQLRETURN SQLGetEnvAttr ( SQLHENV environmentHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER bufferLength, SQLINTEGER* stringLengthPtr )
+FUNCTION: SQLRETURN SQLGetFunctions ( SQLHDBC connectionHandle, SQLUSMALLINT functionId, SQLUSMALLINT* supportedPtr )
+FUNCTION: SQLRETURN SQLGetInfo ( SQLHDBC connectionHandle, SQLUSMALLINT infoType, SQLPOINTER infoValuePtr, SQLSMALLINT bufferLength, SQLSMALLINT* stringLengthPtr )
+FUNCTION: SQLRETURN SQLGetStmtAttr ( SQLHSTMT statementHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER bufferLength, SQLINTEGER* stringLengthPtr )
+FUNCTION: SQLRETURN SQLGetStmtOption ( SQLHSTMT statementHandle, SQLUSMALLINT option, SQLPOINTER valuePtr )
+FUNCTION: SQLRETURN SQLGetTypeInfo ( SQLHSTMT statementHandle, SQLSMALLINT dataType )
+FUNCTION: SQLRETURN SQLMoreResults ( SQLHSTMT statementHandle )
+FUNCTION: SQLRETURN SQLNativeSql ( SQLHDBC connectionHandle, SQLCHAR* inStatementText, SQLINTEGER textLength1, SQLCHAR* outStatementText, SQLINTEGER bufferLength, SQLINTEGER* textLength2Ptr )
+FUNCTION: SQLRETURN SQLNumParams ( SQLHSTMT statementHandle, SQLSMALLINT* parameterCountPtr )
+FUNCTION: SQLRETURN SQLNumResultCols ( SQLHSTMT statementHandle, SQLSMALLINT* columnCountPtr )
+FUNCTION: SQLRETURN SQLParamData ( SQLHSTMT statementHandle, SQLPOINTER* valuePtrPtr )
+FUNCTION: SQLRETURN SQLParamOptions ( SQLHSTMT statementHandle, SQLULEN rowCount, SQLULEN* rowsProcessedPtr )
+FUNCTION: SQLRETURN SQLPrepare ( SQLHSTMT statementHandle, SQLCHAR* statementText, SQLINTEGER length )
+FUNCTION: SQLRETURN SQLPrimaryKeys ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3 )
+FUNCTION: SQLRETURN SQLProcedureColumns ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* procName, SQLSMALLINT nameLength3, SQLCHAR* columnName, SQLSMALLINT nameLength4 )
+FUNCTION: SQLRETURN SQLProcedures ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* procName, SQLSMALLINT nameLength3 )
+FUNCTION: SQLRETURN SQLPutData ( SQLHSTMT statementHandle, SQLPOINTER dataPtr, SQLLEN stringLength )
+FUNCTION: SQLRETURN SQLRowCount ( SQLHSTMT statementHandle, SQLLEN* rowCountPtr )
+FUNCTION: SQLRETURN SQLSetConnectAttr ( SQLHDBC connectionHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER stringLength )
+FUNCTION: SQLRETURN SQLSetConnectOption ( SQLHDBC connectionHandle, SQLUSMALLINT option, SQLULEN value )
+FUNCTION: SQLRETURN SQLSetCursorName ( SQLHSTMT statementHandle, SQLCHAR* cursorName, SQLSMALLINT nameLength )
+FUNCTION: SQLRETURN SQLSetDescField ( SQLHDESC descriptorHandle, SQLSMALLINT recNumber, SQLSMALLINT fieldIdentifier, SQLPOINTER valuePtr, SQLINTEGER bufferLength )
+FUNCTION: SQLRETURN SQLSetDescRec ( SQLHDESC descriptorHandle, SQLSMALLINT recNumber, SQLSMALLINT type, SQLSMALLINT subType, SQLLEN length, SQLSMALLINT precision, SQLSMALLINT scale, SQLPOINTER dataPtr, SQLLEN* stringLengthPtr, SQLLEN* indicatorPtr )
+FUNCTION: SQLRETURN SQLSetEnvAttr ( SQLHENV environmentHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER stringLength )
+FUNCTION: SQLRETURN SQLSetParam ( SQLHSTMT statementHandle, SQLUSMALLINT parameterNumber, SQLSMALLINT valueType, SQLSMALLINT parameterType, SQLUINTEGER lengthPrecision, SQLSMALLINT parameterScale, SQLPOINTER parameterValuePtr, SQLINTEGER* indPtr )
+FUNCTION: SQLRETURN SQLSetPos ( SQLHSTMT statementHandle, SQLUSMALLINT rowNumber, SQLUSMALLINT operation, SQLUSMALLINT lockType )
+FUNCTION: SQLRETURN SQLSetScrollOptions ( SQLHSTMT statementHandle, SQLUSMALLINT concurrency, SQLINTEGER rowNumber, SQLUSMALLINT cacheSize )
+FUNCTION: SQLRETURN SQLSetStmtAttr ( SQLHSTMT statementHandle, SQLINTEGER attribute, SQLPOINTER valuePtr, SQLINTEGER stringLength )
+FUNCTION: SQLRETURN SQLSetStmtOption ( SQLHSTMT statementHandle, SQLUSMALLINT option, SQLULEN value )
+FUNCTION: SQLRETURN SQLSpecialColumns ( SQLHSTMT statementHandle, SQLUSMALLINT identifierType, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3, SQLUSMALLINT scope, SQLUSMALLINT nullable )
+FUNCTION: SQLRETURN SQLStatistics ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3, SQLUSMALLINT unique, SQLUSMALLINT reserved )
+FUNCTION: SQLRETURN SQLTablePrivileges ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3 )
+FUNCTION: SQLRETURN SQLTables ( SQLHSTMT statementHandle, SQLCHAR* catalogName, SQLSMALLINT nameLength1, SQLCHAR* schemaName, SQLSMALLINT nameLength2, SQLCHAR* tableName, SQLSMALLINT nameLength3, SQLCHAR* tableType, SQLSMALLINT nameLength4 )
+
+ERROR: odbc-error message ;
+ERROR: odbc-invalid-handle-error message ;
+
+: check-odbc ( retcode message -- )
+    swap {
+        { SQL_SUCCESS [ drop ] }
+        { SQL_SUCCESS_WITH_INFO [ drop ] }
+        { SQL_ERROR [ odbc-error ] }
+        { SQL_INVALID_HANDLE [ odbc-invalid-handle-error ] }
+        [ 2drop ]
+    } case ;
+
 : succeeded? ( n -- bool )
     ! Did the call succeed (SQL-SUCCESS or SQL-SUCCESS-WITH-INFO)
     {
@@ -103,26 +262,21 @@ SYMBOLS:
         [ 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 )
-FUNCTION: SQLRETURN SQLGetDiagRec (
-    SQLSMALLINT     HandleType,
-    SQLHANDLE       Handle,
-    SQLSMALLINT     RecNumber,
-    SQLCHAR*       SQLState,
-    SQLINTEGER*    NativeErrorPtr,
-    SQLCHAR*       MessageText,
-    SQLSMALLINT     BufferLength,
-    SQLSMALLINT*   TextLengthPtr )
+ERROR: odbc-statement-error state native-code message ;
+: throw-statement-error ( hstmt -- * )
+    [ SQL_HANDLE_STMT ] dip
+    1
+    SQL_SQLSTATE_SIZE SQLCHAR <c-array>
+    0 SQLINTEGER <ref>
+    SQL_MAX_MESSAGE_LENGTH SQLCHAR <c-array>
+    SQL_MAX_MESSAGE_LENGTH
+    0 SQLSMALLINT <ref>
+    [ SQLGetDiagRec "SQLGetDiagRec" check-odbc ] 5 nkeep
+    nip [ utf8 decode ] [ le> ] [ ] [ le> head utf8 decode ] quad*
+    odbc-statement-error ;
+
+: check-statement ( retcode hstmt -- )
+    swap succeeded? [ drop ] [ throw-statement-error ] if ;
 
 : alloc-handle ( type parent -- handle )
     f void* <ref> [ SQLAllocHandle ] keep swap succeeded? [
@@ -135,10 +289,10 @@ FUNCTION: SQLRETURN SQLGetDiagRec (
     SQL-HANDLE-ENV SQL-NULL-HANDLE alloc-handle ;
 
 : alloc-dbc-handle ( env -- handle )
-    SQL-HANDLE-DBC swap alloc-handle ;
+    [ SQL-HANDLE-DBC ] dip alloc-handle ;
 
 : alloc-stmt-handle ( dbc -- handle )
-    SQL-HANDLE-STMT swap alloc-handle ;
+    [ SQL-HANDLE-STMT ] dip alloc-handle ;
 
 <PRIVATE
 
@@ -150,37 +304,30 @@ PRIVATE>
 : temp-string ( length -- byte-array length )
     [ alien-space-str ] keep ;
 
+: set-odbc-version ( env-handle -- )
+    SQL-ATTR-ODBC-VERSION SQL-OV-ODBC3 0 SQLSetEnvAttr "SQLSetEnvAttr" check-odbc ;
+
 : odbc-init ( -- env )
-    alloc-env-handle
-    [
-        SQL-ATTR-ODBC-VERSION SQL-OV-ODBC3 0 SQLSetEnvAttr
-        succeeded? [ "odbc-init failed" throw ] unless
-    ] keep ;
+    alloc-env-handle [ set-odbc-version ] keep ;
 
 : odbc-connect ( env dsn -- dbc )
     [ alloc-dbc-handle dup ] dip
-    f swap ascii string>alien dup length
+    f swap utf8 string>alien dup length
     1024 temp-string 0 short <ref>
-    SQL-DRIVER-NOPROMPT SQLDriverConnect
-    succeeded? [ "odbc-connect failed" throw ] unless ;
+    SQL-DRIVER-NOPROMPT SQLDriverConnect "SQLDriverConnect" check-odbc ;
 
-: odbc-disconnect ( dbc -- )
-    SQLDisconnect succeeded? [ "odbc-disconnect failed" throw ] unless ;
+: odbc-disconnect ( dbc -- ) SQLDisconnect "SQLDisconnect" check-odbc ;
 
 : odbc-prepare ( dbc string -- statement )
-    [ alloc-stmt-handle dup ] dip ascii string>alien
-    dup length SQLPrepare
-    succeeded? [ "odbc-prepare failed" throw ] unless ;
+    [ alloc-stmt-handle dup ] dip utf8 string>alien
+    dup length [ SQLPrepare ] keepdd check-statement ;
 
 : odbc-free-statement ( statement -- )
-    SQL-HANDLE-STMT swap SQLFreeHandle
-    succeeded? [ "odbc-free-statement failed" throw ] unless ;
+    SQL-HANDLE-STMT swap SQLFreeHandle "SQLFreeHandle" check-odbc ;
 
-: odbc-execute ( statement -- )
-    SQLExecute succeeded? [ "odbc-execute failed" throw ] unless ;
+: odbc-execute ( statement -- ) [ SQLExecute ] keep check-statement ;
 
-: odbc-next-row ( statement -- bool )
-    SQLFetch succeeded? ;
+: odbc-next-row ( statement -- bool ) SQLFetch succeeded? ;
 
 : odbc-number-of-columns ( statement -- number )
     0 short <ref> [ SQLNumResultCols succeeded? ] keep swap [
@@ -203,25 +350,27 @@ C: <column> column
     0 short <ref> :> nullablePtr
     statement columnNumber columnName bufferLen nameLengthPtr
     dataTypePtr columnSizePtr decimalDigitsPtr nullablePtr
-    SQLDescribeCol succeeded? [
+    SQLDescribeCol "SQLDescribeCol" check-odbc
         nullablePtr short deref
         decimalDigitsPtr short deref
         columnSizePtr uint deref
         dataTypePtr short deref convert-sql-type
-        columnName ascii alien>string
-        columnNumber <column>
-    ] [
-        "odbc-describe-column failed" throw
-    ] if ;
+        columnName utf8 alien>string
+        columnNumber <column> ;
 
 : dereference-type-pointer ( byte-array column -- object )
     type>> {
-        { SQL-CHAR [ ascii alien>string ] }
-        { SQL-VARCHAR [ ascii alien>string ] }
-        { SQL-LONGVARCHAR [ ascii alien>string ] }
-        { SQL-WCHAR [ ascii alien>string ] }
-        { SQL-WCHARVAR [ ascii alien>string ] }
-        { SQL-WLONGCHARVAR [ ascii alien>string ] }
+        { SQL-CHAR [ utf8 alien>string ] }
+        { SQL-VARCHAR [ utf8 alien>string ] }
+        { SQL-LONGVARCHAR [ utf8 alien>string ] }
+        { SQL-WCHAR [ utf8 alien>string ] }
+        { SQL-WCHARVAR [ utf8 alien>string ] }
+        { SQL-WLONGCHARVAR [ utf8 alien>string ] }
+        { SQL-DECIMAL [ ascii alien>string ] }
+        { SQL-TYPE-TIMESTAMP [
+            "SSSSSSI" unpack-le 7 firstn
+            1,000,000,000 / + instant <timestamp>
+        ] }
         { SQL-SMALLINT [ short deref ] }
         { SQL-INTEGER [ long deref ] }
         { SQL-REAL [ float deref ] }
@@ -229,7 +378,7 @@ C: <column> column
         { SQL-DOUBLE [ double deref ] }
         { SQL-TINYINT [ char deref ] }
         { SQL-BIGINT [ longlong deref ] }
-        [ nip [ "Unknown SQL Type: " % name>> % ] "" make ]
+        [ nip name>> "Unknown SQL Type: " prepend ]
     } case ;
 
 TUPLE: field value column ;
diff --git a/extra/odbc/platforms.txt b/extra/odbc/platforms.txt
deleted file mode 100644 (file)
index 8e1a559..0000000
+++ /dev/null
@@ -1 +0,0 @@
-windows