📄 odbc.py.i
字号:
// The contents of this file are subject to the MonetDB Public License// Version 1.1 (the "License"); you may not use this file except in// compliance with the License. You may obtain a copy of the License at// http://monetdb.cwi.nl/Legal/MonetDBLicense-1.1.html//// Software distributed under the License is distributed on an "AS IS"// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the// License for the specific language governing rights and limitations// under the License.//// The Original Code is the MonetDB Database System.//// The Initial Developer of the Original Code is CWI.// Portions created by CWI are Copyright (C) 1997-2007 CWI.// All Rights Reserved.%module odbc%include "typemaps.i"%{#include <sqltypes.h>#include <sqlucode.h>#ifdef SQL_MAX_OPTION_STRING_LENGTH#define BUFLEN ((SQL_MAX_OPTION_STRING_LENGTH) > 1024 ? (SQL_MAX_OPTION_STRING_LENGTH) : 1024)#else#define BUFLEN 1024#endif#if !defined(PY_LONG_LONG) && defined(LONG_LONG)/* in python 2.2 it's still called LONG_LONG, but we use the newer name PY_LONG_LONG */#define PY_LONG_LONG LONG_LONG#endifstatic PyObject *ErrorObject;%}%ignore __SQLTYPES_H;%include "sqltypes.h"%init %{{ PyObject *odbc; /* create the error object */ ErrorObject = PyErr_NewException("odbc.error", NULL, NULL); PyDict_SetItemString(d, "error", ErrorObject); /* dirty trick to export the error object just created to the interface module odbc */ odbc = PyImport_ImportModule("odbc"); if (odbc == NULL) Py_FatalError("can't import module odbc for _odbc"); PyModule_AddObject(odbc, "error", ErrorObject); PyModule_AddObject(odbc, "SQLGetConnectAttrA", PyObject_GetAttrString(m, "SQLGetConnectAttr")); PyModule_AddObject(odbc, "SQLGetEnvAttrA", PyObject_GetAttrString(m, "SQLGetEnvAttr")); PyModule_AddObject(odbc, "SQLGetStmtAttrA", PyObject_GetAttrString(m, "SQLGetStmtAttr")); PyModule_AddObject(odbc, "SQLGetConnectOptionA", PyObject_GetAttrString(m, "SQLGetConnectOption")); PyModule_AddObject(odbc, "SQLGetDescFieldA", PyObject_GetAttrString(m, "SQLGetDescField")); PyModule_AddObject(odbc, "SQLGetDiagFieldA", PyObject_GetAttrString(m, "SQLGetDiagField")); PyModule_AddObject(odbc, "SQLGetInfoA", PyObject_GetAttrString(m, "SQLGetInfo")); PyModule_AddObject(odbc, "SQLSetConnectOptionA", PyObject_GetAttrString(m, "SQLSetConnectOption")); PyModule_AddObject(odbc, "SQLSetStmtOptionA", PyObject_GetAttrString(m, "SQLSetStmtOption")); Py_DECREF(odbc);}%}%{/* helper code for SQLWCHAR parameters */static PyObject *PyUnicode_FromSqlWChar(const SQLWCHAR *s, SQLSMALLINT l){ const SQLWCHAR *s1; Py_UNICODE *u, *u1; PyObject *o; if (s == NULL) { Py_INCREF(Py_None); return Py_None; } if (l == SQL_NTS) for (l = 0, s1 = s; *s1; s1++, l++) ; u = PyMem_Malloc((l + 1) * sizeof(Py_UNICODE)); for (s1 = s, u1 = u; l > 0; s1++, u1++, l--) *u1 = *s1; o = PyUnicode_FromUnicode(u, (int) (s1 - s)); PyMem_Free(u); return o;}SQLWCHAR *SqlWChar_FromPyUnicode(PyObject *o, int *lp){ Py_UNICODE *u; int ul; SQLWCHAR *b, *s; if ((u = PyUnicode_AsUnicode(o)) == NULL) return NULL; ul = PyUnicode_GetSize(o); if ((b = s = PyMem_Malloc((ul + 1) * sizeof(SQLWCHAR))) == NULL) return NULL; while (ul-- >= 0) *s++ = *u++; if (lp) *lp = (int) (s - b) - 1; return b;}%}%typemap(in, numinputs=1) (SQLWCHAR *STRING, int LENGTH) (int len) { if (($1 = SqlWChar_FromPyUnicode($input, &len)) == NULL) goto fail; $2 = ($2_type) len;}%typemap(argout) (SQLWCHAR *STRING, int LENGTH) { PyMem_Free($1);}/* output arg to return a Handle */%typemap(in, numinputs=0) SQLHANDLE *OUTPUT (SQLHANDLE temp) { $1 = &temp;}%typemap(argout,fragment="t_output_helper") SQLHANDLE *OUTPUT { PyObject *o = SWIG_NewPointerObj((void *) *$1, $1_descriptor, 0); $result = t_output_helper($result, o);}/* output arg to return a 5-byte state string used only in SQLError and SQLGetDiagRec*/%typemap(in, numinputs=0) SQLCHAR *Sqlstate (SQLCHAR tempbuf[6]) { $1 = tempbuf;}%typemap(argout,fragment="t_output_helper") SQLCHAR *Sqlstate { PyObject *o = PyString_FromStringAndSize((char *) $1, 5); $result = t_output_helper($result, o);}// SQLErrorA, SQLGetDiagRecA%apply SQLCHAR *Sqlstate {SQLCHAR *szSqlState};// SQLErrorW, SQLGetDiagRecW%typemap(in, numinputs=0) SQLWCHAR *szSqlState (SQLWCHAR tempbuf[6]) { $1 = tempbuf;}%typemap(argout,fragment="t_output_helper") SQLWCHAR *szSqlState { PyObject *o = PyUnicode_FromSqlWChar($1, 5); $result = t_output_helper($result, o);}/* Three args to return a string: OUTBUF points to a buffer of length BUFSIZE which is filled with *OUTSIZE characters plus a NUL byte. If the buffer is too small, *OUTSIZE returns the required buffer size.*/%typemap(in, numinputs=0) (char *OUTBUF, int BUFSIZE, int *OUTSIZE) (SQLCHAR msgbuf[BUFLEN], $*3_type msglen) { $1 = msgbuf; $2 = ($2_type) sizeof(msgbuf); $3 = &msglen;}%typemap(argout,fragment="t_output_helper") (char *OUTBUF, int BUFSIZE, int *OUTSIZE) { PyObject *o = PyString_FromStringAndSize((char *) $1, *$3 >= $2 ? $2 - 1 : *$3); $result = t_output_helper($result, o);}%typemap(in, numinputs=0) (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) (SQLWCHAR msgbuf[BUFLEN], $*3_type msglen) { $1 = msgbuf; $2 = ($2_type) (sizeof(msgbuf) / sizeof(SQLWCHAR)); $3 = &msglen;}%typemap(argout,fragment="t_output_helper") (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) { PyObject *o = PyUnicode_FromSqlWChar($1, *$3 >= $2 ? $2 - 1 : *$3); $result = t_output_helper($result, o);}// SQLError, SQLGetDiagRec%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength)};// SQLErrorA, SQLGetDiagRecA%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szErrorMsg, SQLSMALLINT cbErrorMsgMax, SQLSMALLINT *pcbErrorMsg)};// SQLErrorW, SQLGetDiagRecW%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szErrorMsg, SQLSMALLINT cbErrorMsgMax, SQLSMALLINT *pcbErrorMsg)};// SQLAllocConnect%newobject SQLAllocConnect;%apply SQLHANDLE *OUTPUT {SQLHDBC *ConnectionHandle};// SQLAllocEnv%newobject SQLAllocEnv;%apply SQLHANDLE *OUTPUT {SQLHENV *EnvironmentHandle};// SQLAllocHandle#if (ODBCVER >= 0x0300)%newobject SQLAllocHandle;%apply SQLHANDLE *OUTPUT {SQLHANDLE *OutputHandle};#endif// SQLAllocStmt%newobject SQLAllocStmt;%apply SQLHANDLE *OUTPUT {SQLHSTMT *StatementHandle};// SQLBrowseConnect, SQLBrowseConnectA%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn)};// SQLBrowseConnectW%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn)};// SQLColAttribute%typemap(in, numinputs=1) (SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLPOINTER NumericAttribute) (char tempbuf[BUFLEN], $*4_type buflen, int temp) { $1 = ($1_ltype) PyInt_AsLong($input); if (PyErr_Occurred()) SWIG_fail; $2 = (SQLPOINTER) tempbuf; $3 = (SQLSMALLINT) sizeof(tempbuf); $4 = &buflen; $5 = (SQLPOINTER) &temp;}%typemap(argout,fragment="t_output_helper") (SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLPOINTER NumericAttribute) { PyObject *o; switch ($1) { case SQL_DESC_AUTO_UNIQUE_VALUE: case SQL_DESC_CASE_SENSITIVE: case SQL_DESC_CONCISE_TYPE: case SQL_DESC_COUNT: case SQL_DESC_DISPLAY_SIZE: case SQL_DESC_FIXED_PREC_SCALE: case SQL_DESC_LENGTH: case SQL_DESC_NULLABLE: case SQL_DESC_NUM_PREC_RADIX: case SQL_DESC_OCTET_LENGTH: case SQL_DESC_PRECISION: case SQL_DESC_SCALE: case SQL_DESC_SEARCHABLE: case SQL_DESC_TYPE: case SQL_DESC_UNNAMED: case SQL_DESC_UNSIGNED: case SQL_DESC_UPDATABLE: o = PyInt_FromLong((long) * (int *) $5); break; default: o = PyString_FromStringAndSize((char *) $2, *$4 >= $3 ? $3 - 1 : *$4); break; } $result = t_output_helper($result, o);}// SQLColAttributeA%apply (SQLUSMALLINT FieldIdentifier, SQLPOINTER CharacterAttribute, SQLSMALLINT BufferLength, SQLSMALLINT *StringLength, SQLPOINTER NumericAttribute) {(SQLSMALLINT iField, SQLPOINTER pCharAttr, SQLSMALLINT cbCharAttrMax, SQLSMALLINT *pcbCharAttr, SQLPOINTER pNumAttr)};// SQLColAttributeW%typemap(in, numinputs=1) (SQLUSMALLINT iField, SQLPOINTER pCharAttr, SQLSMALLINT cbCharAttrMax, SQLSMALLINT *pcbCharAttr, SQLPOINTER pNumAttr) (char tempbuf[BUFLEN], $*4_type buflen, int temp) { $1 = ($1_ltype) PyInt_AsLong($input); if (PyErr_Occurred()) SWIG_fail; $2 = (SQLPOINTER) tempbuf; $3 = (SQLSMALLINT) sizeof(tempbuf); $4 = &buflen; $5 = (SQLPOINTER) &temp;}%typemap(argout,fragment="t_output_helper") (SQLUSMALLINT iField, SQLPOINTER pCharAttr, SQLSMALLINT cbCharAttrMax, SQLSMALLINT *pcbCharAttr, SQLPOINTER pNumAttr) { PyObject *o; switch ($1) { case SQL_DESC_AUTO_UNIQUE_VALUE: case SQL_DESC_CASE_SENSITIVE: case SQL_DESC_CONCISE_TYPE: case SQL_DESC_COUNT: case SQL_DESC_DISPLAY_SIZE: case SQL_DESC_FIXED_PREC_SCALE: case SQL_DESC_LENGTH: case SQL_DESC_NULLABLE: case SQL_DESC_NUM_PREC_RADIX: case SQL_DESC_OCTET_LENGTH: case SQL_DESC_PRECISION: case SQL_DESC_SCALE: case SQL_DESC_SEARCHABLE: case SQL_DESC_TYPE: case SQL_DESC_UNNAMED: case SQL_DESC_UNSIGNED: case SQL_DESC_UPDATABLE: o = PyInt_FromLong((long) * (int *) $5); break; default: o = PyUnicode_FromSqlWChar((SQLWCHAR *) $2, (*$4 >= $3 ? (SQLSMALLINT) ($3 - sizeof(SQLWCHAR)) : *$4) / sizeof(SQLWCHAR)); break; } $result = t_output_helper($result, o);}%ignore SQLColAttributes;// SQLColumnPrivileges, SQLPrimaryKeys, SQLProcedureColumns, SQLProcedures,// SQLTablePrivileges// SQLColumnPrivilegesA, SQLPrimaryKeysA, SQLProcedureColumnsA, SQLProceduresA,// SQLTablePrivilegesA, SQLColumnsA, SQLSpecialColumnsA, SQLTablesA%apply (char *STRING, int LENGTH) {(SQLCHAR *szCatalogName, SQLSMALLINT cbCatalogName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szSchemaName, SQLSMALLINT cbSchemaName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szTableName, SQLSMALLINT cbTableName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szColumnName, SQLSMALLINT cbColumnName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szProcName, SQLSMALLINT cbProcName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szTableType, SQLSMALLINT cbTableType)};// SQLColumns, SQLSpecialColumns, SQLStatistics, SQLTables%apply (char *STRING, int LENGTH) {(SQLCHAR *CatalogName, SQLSMALLINT NameLength1)};%apply (char *STRING, int LENGTH) {(SQLCHAR *SchemaName, SQLSMALLINT NameLength2)};%apply (char *STRING, int LENGTH) {(SQLCHAR *TableName, SQLSMALLINT NameLength3)};%apply (char *STRING, int LENGTH) {(SQLCHAR *ColumnName, SQLSMALLINT NameLength4)};%apply (char *STRING, int LENGTH) {(SQLCHAR *TableType, SQLSMALLINT NameLength4)};// SQLConnect%apply (char *STRING, int LENGTH) {(SQLCHAR *ServerName, SQLSMALLINT NameLength1)};%apply (char *STRING, int LENGTH) {(SQLCHAR *UserName, SQLSMALLINT NameLength2)};%apply (char *STRING, int LENGTH) {(SQLCHAR *Authentication, SQLSMALLINT NameLength3)};// SQLColumnPrivilegesW, SQLPrimaryKeysW, SQLProcedureColumnsW, SQLProceduresW,// SQLTablePrivilegesW, SQLColumnsW, SQLSpecialColumnsW, SQLTablesW%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szCatalogName, SQLSMALLINT cbCatalogName)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szSchemaName, SQLSMALLINT cbSchemaName)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szTableName, SQLSMALLINT cbTableName)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szColumnName, SQLSMALLINT cbColumnName)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szProcName, SQLSMALLINT cbProcName)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szTableType, SQLSMALLINT cbTableType)};// SQLConnectA%apply (char *STRING, int LENGTH) {(SQLCHAR *szDSN, SQLSMALLINT cbDSN)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szUID, SQLSMALLINT cbUID)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szAuthStr, SQLSMALLINT cbAuthStr)};// SQLConnectW%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szDSN, SQLSMALLINT cbDSN)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szUID, SQLSMALLINT cbUID)};%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szAuthStr, SQLSMALLINT cbAuthStr)};// SQLDataSources%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *ServerName, SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1)};%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *Description, SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2)};// SQLDataSourcesA%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szDSN, SQLSMALLINT cbDSNMax, SQLSMALLINT *pcbDSN)};%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szDescription, SQLSMALLINT cbDescriptionMax, SQLSMALLINT *pcbDescription)};// SQLDataSourcesW%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szDSN, SQLSMALLINT cbDSNMax, SQLSMALLINT *pcbDSN)};%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szDescription, SQLSMALLINT cbDescriptionMax, SQLSMALLINT *pcbDescription)};// SQLDescribeCol%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *ColumnName, SQLSMALLINT BufferLength, SQLSMALLINT *NameLength)};%apply int *OUTPUT {SQLSMALLINT *DataType};%apply int *OUTPUT {SQLULEN *ColumnSize};%apply int *OUTPUT {SQLSMALLINT *DecimalDigits};%apply int *OUTPUT {SQLSMALLINT *Nullable};// SQLDescribeColA%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szColName, SQLSMALLINT cbColNameMax, SQLSMALLINT *pcbColName)};// SQLDescribeColW%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szColName, SQLSMALLINT cbColNameMax, SQLSMALLINT *pcbColName)};%apply int *OUTPUT {SQLSMALLINT *pfSqlType};%apply int *OUTPUT {SQLULEN *pcbColDef};%apply int *OUTPUT {SQLSMALLINT *pibScale};%apply int *OUTPUT {SQLSMALLINT *pfNullable};// SQLDescribeParam, SQLDescribeParamA%apply int *OUTPUT {SQLSMALLINT *pfSqlType};%apply int *OUTPUT {SQLULEN *pcbParamDef};%apply int *OUTPUT {SQLSMALLINT *pibScale};%apply int *OUTPUT {SQLSMALLINT *pfNullable};// SQLDriverConnect, SQLDriverConnectA%apply (char *STRING, int LENGTH) {(SQLCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn)};%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut)};// SQLDriverConnectW%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szConnStrIn, SQLSMALLINT cbConnStrIn)};%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szConnStrOut, SQLSMALLINT cbConnStrOutMax, SQLSMALLINT *pcbConnStrOut)};// SQLDrivers, SQLDriversA%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szDriverDesc, SQLSMALLINT cbDriverDescMax, SQLSMALLINT *pcbDriverDesc)};%apply (char *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLCHAR *szDriverAttributes, SQLSMALLINT cbDrvrAttrMax, SQLSMALLINT *pcbDrvrAttr)};// SQLDriversW%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szDriverDesc, SQLSMALLINT cbDriverDescMax, SQLSMALLINT *pcbDriverDesc)};%apply (SQLWCHAR *OUTBUF, int BUFSIZE, int *OUTSIZE) {(SQLWCHAR *szDriverAttributes, SQLSMALLINT cbDrvrAttrMax, SQLSMALLINT *pcbDrvrAttr)};// SQLError, SQLGetDiagRec// SQLErrorA, SQLGetDiagRecA%apply int *OUTPUT {SQLINTEGER *NativeError};// SQLErrorW, SQLGetDiagRecW%apply int *OUTPUT {SQLINTEGER *pfNativeError};// SQLExecDirect, SQLPrepare%apply (char *STRING, int LENGTH) {(SQLCHAR *StatementText, SQLINTEGER TextLength)};// SQLExecDirectA, SQLPrepareA%apply (char *STRING, int LENGTH) {(SQLCHAR *szSqlStr, SQLINTEGER cbSqlStr)};// SQLExecDirectW, SQLPrepareW%apply (SQLWCHAR *STRING, int LENGTH) {(SQLWCHAR *szSqlStr, SQLINTEGER cbSqlStr)};// SQLExtendedFetch%apply int *OUTPUT {SQLROWSETSIZE *pcrow};%apply int *OUTPUT {SQLUSMALLINT *rgfRowStatus};// SQLForeignKeys, SQLForeignKeysA%apply (char *STRING, int LENGTH) {(SQLCHAR *szPkCatalogName, SQLSMALLINT cbPkCatalogName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szPkSchemaName, SQLSMALLINT cbPkSchemaName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szPkTableName, SQLSMALLINT cbPkTableName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szFkCatalogName, SQLSMALLINT cbFkCatalogName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szFkSchemaName, SQLSMALLINT cbFkSchemaName)};%apply (char *STRING, int LENGTH) {(SQLCHAR *szFkTableName, SQLSMALLINT cbFkTableName)};// SQLForeignKeysW
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -