[q-lang-cvs] q/modules/odbc odbc.c,1.8,1.9 odbc.q,1.4,1.5
Brought to you by:
agraef
From: Albert G. <ag...@us...> - 2008-02-14 00:48:52
|
Update of /cvsroot/q-lang/q/modules/odbc In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv25356 Modified Files: odbc.c odbc.q Log Message: add odbc_getinfo function and related information type constants Index: odbc.q =================================================================== RCS file: /cvsroot/q-lang/q/modules/odbc/odbc.q,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** odbc.q 11 Jul 2005 14:30:20 -0000 1.4 --- odbc.q 14 Feb 2008 00:48:47 -0000 1.5 *************** *** 63,70 **** public extern odbc_connect CONN, odbc_disconnect DB; ! /* Obtain information about an ODBC connection. Right now only a small subset ! of the information specified by the ODBC API is supported. Returns a tuple ! of strings with the following items (see the corresponding item ! descriptions in the ODBC API reference for more information): - DATA_SOURCE_NAME: the data source name --- 63,69 ---- public extern odbc_connect CONN, odbc_disconnect DB; ! /* Obtain general information about an ODBC connection. Returns a tuple of ! strings with the following items (see SQLGetInfo() in the ODBC API ! reference for more information): - DATA_SOURCE_NAME: the data source name *************** *** 79,82 **** --- 78,321 ---- public extern odbc_info DB; + /* More information is available using the following odbc_getinfo function + which provides a direct interface to SQLGetInfo(). The INFO_TYPE argument + (a nonnegative integer) specifies the requested type of information. The + result is always a byte string which, depending on INFO_TYPE, may contain + an integer or a string which can be converted to a Q value using bint or + bstr, respectively. See SQLGetInfo() in the ODBC API reference for + information about which information types are available and which type of + information they return. */ + + public extern odbc_getinfo DB INFO_TYPE; + + /* Some common INFO_TYPE values which can be passed to the odbc_getinfo + function. This also includes some aliases defined by the ISO SQL/CLI + standard. Please refer to SQLGetInfo() in the ODBC API reference for + details. Note that not all values may be supported by all implementations, + and some ODBC drivers may offer additional information types not listed + here. */ + + public const var + SQL_ACTIVE_CONNECTIONS = 0, + SQL_MAXIMUM_DRIVER_CONNECTIONS = 0, + SQL_MAX_DRIVER_CONNECTIONS = 0, + SQL_INFO_FIRST = 0, + SQL_ACTIVE_STATEMENTS = 1, + SQL_MAX_CONCURRENT_ACTIVITIES = 1, + SQL_MAXIMUM_CONCURRENT_ACTIVITIES = 1, + SQL_DATA_SOURCE_NAME = 2, + SQL_DRIVER_HDBC = 3, + SQL_DRIVER_HENV = 4, + SQL_DRIVER_HSTMT = 5, + SQL_DRIVER_NAME = 6, + SQL_DRIVER_VER = 7, + SQL_FETCH_DIRECTION = 8, + SQL_ODBC_API_CONFORMANCE = 9, + SQL_ODBC_VER = 10, + SQL_ROW_UPDATES = 11, + SQL_ODBC_SAG_CLI_CONFORMANCE = 12, + SQL_SERVER_NAME = 13, + SQL_SEARCH_PATTERN_ESCAPE = 14, + SQL_ODBC_SQL_CONFORMANCE = 15, + SQL_DBMS_NAME = 17, + SQL_DBMS_VER = 18, + SQL_DBMS_VERSION = 18, + SQL_ACCESSIBLE_TABLES = 19, + SQL_ACCESSIBLE_PROCEDURES = 20, + SQL_PROCEDURES = 21, + SQL_CONCAT_NULL_BEHAVIOR = 22, + SQL_CURSOR_COMMIT_BEHAVIOR = 23, + SQL_CURSOR_ROLLBACK_BEHAVIOR = 24, + SQL_DATA_SOURCE_READ_ONLY = 25, + SQL_DEFAULT_TXN_ISOLATION = 26, + SQL_DEFAULT_TRANSACTION_ISOLATION = 26, + SQL_EXPRESSIONS_IN_ORDERBY = 27, + SQL_IDENTIFIER_CASE = 28, + SQL_IDENTIFIER_QUOTE_CHAR = 29, + SQL_MAXIMUM_COLUMN_NAME_LENGTH = 30, + SQL_MAX_COLUMN_NAME_LEN = 30, + SQL_MAXIMUM_CURSOR_NAME_LENGTH = 31, + SQL_MAX_CURSOR_NAME_LEN = 31, + SQL_MAX_OWNER_NAME_LEN = 32, + SQL_MAXIMUM_SCHEMA_NAME_LENGTH = 32, + SQL_MAX_SCHEMA_NAME_LEN = 32, + SQL_MAX_PROCEDURE_NAME_LEN = 33, + SQL_MAX_CATALOG_NAME_LEN = 34, + SQL_MAXIMUM_CATALOG_NAME_LENGTH = 34, + SQL_MAX_QUALIFIER_NAME_LEN = 34, + SQL_MAX_TABLE_NAME_LEN = 35, + SQL_MAXIMUM_TABLE_NAME_LENGTH = 35, + SQL_MULT_RESULT_SETS = 36, + SQL_MULTIPLE_ACTIVE_TXN = 37, + SQL_OUTER_JOINS = 38, + SQL_OWNER_TERM = 39, + SQL_SCHEMA_TERM = 39, + SQL_PROCEDURE_TERM = 40, + SQL_CATALOG_NAME_SEPARATOR = 41, + SQL_QUALIFIER_NAME_SEPARATOR = 41, + SQL_QUALIFIER_TERM = 42, + SQL_CATALOG_TERM = 42, + SQL_SCROLL_CONCURRENCY = 43, + SQL_SCROLL_OPTIONS = 44, + SQL_TABLE_TERM = 45, + SQL_TXN_CAPABLE = 46, + SQL_TRANSACTION_CAPABLE = 46, + SQL_USER_NAME = 47, + SQL_CONVERT_FUNCTIONS = 48, + SQL_NUMERIC_FUNCTIONS = 49, + SQL_STRING_FUNCTIONS = 50, + SQL_SYSTEM_FUNCTIONS = 51, + SQL_TIMEDATE_FUNCTIONS = 52, + SQL_CONVERT_BIGINT = 53, + SQL_CONVERT_BINARY = 54, + SQL_CONVERT_BIT = 55, + SQL_CONVERT_CHAR = 56, + SQL_CONVERT_DATE = 57, + SQL_CONVERT_DECIMAL = 58, + SQL_CONVERT_DOUBLE = 59, + SQL_CONVERT_FLOAT = 60, + SQL_CONVERT_INTEGER = 61, + SQL_CONVERT_LONGVARCHAR = 62, + SQL_CONVERT_NUMERIC = 63, + SQL_CONVERT_REAL = 64, + SQL_CONVERT_SMALLINT = 65, + SQL_CONVERT_TIME = 66, + SQL_CONVERT_TIMESTAMP = 67, + SQL_CONVERT_TINYINT = 68, + SQL_CONVERT_VARBINARY = 69, + SQL_CONVERT_VARCHAR = 70, + SQL_CONVERT_LONGVARBINARY = 71, + SQL_TXN_ISOLATION_OPTION = 72, + SQL_TRANSACTION_ISOLATION_OPTION = 72, + SQL_INTEGRITY = 73, + SQL_ODBC_SQL_OPT_IEF = 73, + SQL_CORRELATION_NAME = 74, + SQL_NON_NULLABLE_COLUMNS = 75, + SQL_DRIVER_HLIB = 76, + SQL_DRIVER_ODBC_VER = 77, + SQL_LOCK_TYPES = 78, + SQL_POS_OPERATIONS = 79, + SQL_POSITIONED_STATEMENTS = 80, + SQL_GETDATA_EXTENSIONS = 81, + SQL_BOOKMARK_PERSISTENCE = 82, + SQL_STATIC_SENSITIVITY = 83, + SQL_FILE_USAGE = 84, + SQL_NULL_COLLATION = 85, + SQL_ALTER_TABLE = 86, + SQL_COLUMN_ALIAS = 87, + SQL_GROUP_BY = 88, + SQL_KEYWORDS = 89, + SQL_ORDER_BY_COLUMNS_IN_SELECT = 90, + SQL_OWNER_USAGE = 91, + SQL_SCHEMA_USAGE = 91, + SQL_QUALIFIER_USAGE = 92, + SQL_CATALOG_USAGE = 92, + SQL_QUOTED_IDENTIFIER_CASE = 93, + SQL_SPECIAL_CHARACTERS = 94, + SQL_SUBQUERIES = 95, + SQL_UNION_STATEMENT = 96, + SQL_UNION = 96, + SQL_MAXIMUM_COLUMNS_IN_GROUP_BY = 97, + SQL_MAX_COLUMNS_IN_GROUP_BY = 97, + SQL_MAXIMUM_COLUMNS_IN_INDEX = 98, + SQL_MAX_COLUMNS_IN_INDEX = 98, + SQL_MAX_COLUMNS_IN_ORDER_BY = 99, + SQL_MAXIMUM_COLUMNS_IN_ORDER_BY = 99, + SQL_MAX_COLUMNS_IN_SELECT = 100, + SQL_MAXIMUM_COLUMNS_IN_SELECT = 100, + SQL_MAXIMUM_COLUMNS_IN_TABLE = 101, + SQL_MAX_COLUMNS_IN_TABLE = 101, + SQL_MAXIMUM_INDEX_SIZE = 102, + SQL_MAX_INDEX_SIZE = 102, + SQL_MAX_ROW_SIZE_INCLUDES_LONG = 103, + SQL_MAX_ROW_SIZE = 104, + SQL_MAXIMUM_ROW_SIZE = 104, + SQL_MAX_STATEMENT_LEN = 105, + SQL_MAXIMUM_STATEMENT_LENGTH = 105, + SQL_MAXIMUM_TABLES_IN_SELECT = 106, + SQL_MAX_TABLES_IN_SELECT = 106, + SQL_MAX_USER_NAME_LEN = 107, + SQL_MAXIMUM_USER_NAME_LENGTH = 107, + SQL_MAX_CHAR_LITERAL_LEN = 108, + SQL_TIMEDATE_ADD_INTERVALS = 109, + SQL_TIMEDATE_DIFF_INTERVALS = 110, + SQL_NEED_LONG_DATA_LEN = 111, + SQL_MAX_BINARY_LITERAL_LEN = 112, + SQL_LIKE_ESCAPE_CLAUSE = 113, + SQL_INFO_LAST = 114, + SQL_QUALIFIER_LOCATION = 114, + SQL_CATALOG_LOCATION = 114, + SQL_OUTER_JOIN_CAPABILITIES = 115, + SQL_ACTIVE_ENVIRONMENTS = 116, + SQL_ALTER_DOMAIN = 117, + SQL_SQL_CONFORMANCE = 118, + SQL_DATETIME_LITERALS = 119, + SQL_BATCH_ROW_COUNT = 120, + SQL_BATCH_SUPPORT = 121, + SQL_CONVERT_WCHAR = 122, + SQL_CONVERT_INTERVAL_DAY_TIME = 123, + SQL_CONVERT_INTERVAL_YEAR_MONTH = 124, + SQL_CONVERT_WLONGVARCHAR = 125, + SQL_CONVERT_WVARCHAR = 126, + SQL_CREATE_ASSERTION = 127, + SQL_CREATE_CHARACTER_SET = 128, + SQL_CREATE_COLLATION = 129, + SQL_CREATE_DOMAIN = 130, + SQL_CREATE_SCHEMA = 131, + SQL_CREATE_TABLE = 132, + SQL_CREATE_TRANSLATION = 133, + SQL_CREATE_VIEW = 134, + SQL_DRIVER_HDESC = 135, + SQL_DROP_ASSERTION = 136, + SQL_DROP_CHARACTER_SET = 137, + SQL_DROP_COLLATION = 138, + SQL_DROP_DOMAIN = 139, + SQL_DROP_SCHEMA = 140, + SQL_DROP_TABLE = 141, + SQL_DROP_TRANSLATION = 142, + SQL_DROP_VIEW = 143, + SQL_DYNAMIC_CURSOR_ATTRIBUTES1 = 144, + SQL_DYNAMIC_CURSOR_ATTRIBUTES2 = 145, + SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 = 146, + SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 = 147, + SQL_INDEX_KEYWORDS = 148, + SQL_INFO_SCHEMA_VIEWS = 149, + SQL_KEYSET_CURSOR_ATTRIBUTES1 = 150, + SQL_KEYSET_CURSOR_ATTRIBUTES2 = 151, + SQL_ODBC_INTERFACE_CONFORMANCE = 152, + SQL_PARAM_ARRAY_ROW_COUNTS = 153, + SQL_PARAM_ARRAY_SELECTS = 154, + SQL_SQL92_DATETIME_FUNCTIONS = 155, + SQL_SQL92_FOREIGN_KEY_DELETE_RULE = 156, + SQL_SQL92_FOREIGN_KEY_UPDATE_RULE = 157, + SQL_SQL92_GRANT = 158, + SQL_SQL92_NUMERIC_VALUE_FUNCTIONS = 159, + SQL_SQL92_PREDICATES = 160, + SQL_SQL92_RELATIONAL_JOIN_OPERATORS = 161, + SQL_SQL92_REVOKE = 162, + SQL_SQL92_ROW_VALUE_CONSTRUCTOR = 163, + SQL_SQL92_STRING_FUNCTIONS = 164, + SQL_SQL92_VALUE_EXPRESSIONS = 165, + SQL_STANDARD_CLI_CONFORMANCE = 166, + SQL_STATIC_CURSOR_ATTRIBUTES1 = 167, + SQL_STATIC_CURSOR_ATTRIBUTES2 = 168, + SQL_AGGREGATE_FUNCTIONS = 169, + SQL_DDL_INDEX = 170, + SQL_DM_VER = 171, + SQL_INSERT_STATEMENT = 172, + SQL_CONVERT_GUID = 173, + SQL_INFO_DRIVER_START = 1000, + SQL_XOPEN_CLI_YEAR = 10000, + SQL_CURSOR_SENSITIVITY = 10001, + SQL_DESCRIBE_PARAMETER = 10002, + SQL_CATALOG_NAME = 10003, + SQL_COLLATING_SEQUENCE = 10004, + SQL_COLLATION_SEQ = 10004, + SQL_MAXIMUM_IDENTIFIER_LENGTH = 10005, + SQL_MAX_IDENTIFIER_LEN = 10005, + SQL_ASYNC_MODE = 10021, + SQL_MAX_ASYNC_CONCURRENT_STATEMENTS = 10022, + SQL_OJ_CAPABILITIES = 65003; + /* Execute an SQL query and fetch results. SQL queries generally come in two different flavours: queries returning data (so-called result sets), and Index: odbc.c =================================================================== RCS file: /cvsroot/q-lang/q/modules/odbc/odbc.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** odbc.c 12 Feb 2008 00:37:23 -0000 1.8 --- odbc.c 14 Feb 2008 00:48:47 -0000 1.9 *************** *** 25,28 **** --- 25,29 ---- #define HAVE_STRDUP 1 #define HAVE_MEMCPY 1 + #define HAVE_MEMSET 1 #define HAVE_LIMITS_H 1 #include <windows.h> *************** *** 109,112 **** --- 110,132 ---- #endif + #ifndef HAVE_MEMSET + + #if __GNUC__ > 1 + #define memset(TO,C,COUNT) __builtin_memset(TO,C,COUNT) + #else + static void *memset (char *to, int c, int count) + { + register char f = (char)c; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = f; + return (void*)to; + } + #endif + + #endif + /* ByteStr data structure, see clib.c */ *************** *** 566,569 **** --- 586,634 ---- } + static expr mkbstr(long size, void *v) + { + bstr_t *m; + if ((m = malloc(sizeof(bstr_t)))) { + if (size > 0 && v) { + m->size = size; + m->v = (unsigned char*)malloc(size); + if (!m->v) { + free(m); + return __ERROR; + } + memcpy(m->v, v, size); + } else { + m->size = 0; + m->v = NULL; + } + return mkobj(type(ByteStr), m); + } else { + return __ERROR; + } + } + + FUNCTION(odbc,odbc_getinfo,argc,argv) + { + ODBCHandle *db; + unsigned long info_type; + if (argc == 2 && isobj(argv[0], type(ODBCHandle), (void**)&db) && + db->henv && isuint(argv[1], &info_type)) { + long ret; + char info[1024]; + short len; + /* A few queries (which are not supported by this interface right now) + take pointer arguments, therefore we initialize the beginning of the + buffer to prevent segfaults. */ + memset(info, 0, 32); + if ((ret = SQLGetInfo(db->hdbc, info_type, + info, sizeof(info), &len)) == SQL_SUCCESS || + ret == SQL_SUCCESS_WITH_INFO) + return mkbstr(len, info); + else + return mkerr(db->henv, db->hdbc, 0); + } else + return __FAIL; + } + #define BUFSZ 65536 #define BUFSZ2 5000 |