[Informixdb-cvs] SF.net SVN: informixdb:[186] branches/informixdb-py3k
Brought to you by:
chaese,
f-apolloner
From: <ch...@us...> - 2008-09-28 02:48:48
|
Revision: 186 http://informixdb.svn.sourceforge.net/informixdb/?rev=186&view=rev Author: chaese Date: 2008-09-28 02:48:41 +0000 (Sun, 28 Sep 2008) Log Message: ----------- Mass merge of r162 through r181 from trunk. Modified Paths: -------------- branches/informixdb-py3k/README branches/informixdb-py3k/doc/manual.txt branches/informixdb-py3k/ext/_informixdb.ec branches/informixdb-py3k/informixdb.py branches/informixdb-py3k/setup.py Added Paths: ----------- branches/informixdb-py3k/winbuild.bat Modified: branches/informixdb-py3k/README =================================================================== --- branches/informixdb-py3k/README 2008-09-28 02:45:11 UTC (rev 185) +++ branches/informixdb-py3k/README 2008-09-28 02:48:41 UTC (rev 186) @@ -1,7 +1,7 @@ INTRODUCTION ============ -This is informixdb 2.4, an Informix implementation of the Python +This is informixdb 2.5, an Informix implementation of the Python Database API. This release implements version 2.0 of the DB-API: http://www.python.org/topics/database/DatabaseAPI-2.0.html @@ -23,7 +23,12 @@ This distribution uses Python distutils to build and install the informixdb module. It requires Python 2.2 or later. +To compile InformixDB, you need to have Informix ESQL/C installed. ESQL/C +is included with the Informix Client Software Development Kit (Informix CSDK), +which is available free of charge at +http://www.ibm.com/software/data/informix/tools/csdk/ . + In a hurry? ----------- @@ -76,6 +81,13 @@ NEWS ==== +From 2.4 to 2.5: +- Compatibility with CSDK 3.00 +- Ability to manually interrupt or automatically time out SQL execution +- Proper binding of boolean parameters in WHERE clauses +- Make version information about server and client available +- Various bug fixes + From 2.3 to 2.4: - Implement 'named' parameter style to optionally bind query parameters by name @@ -240,7 +252,9 @@ FUTURE ====== -- Nothing planned at the moment. Let me know if you think a feature is missing. +- Some kind of Type Mapping API +- Some kind of Unicode support +- More unit tests to cover correct functionality in addition to API compliance MAINTAINER ========== @@ -279,6 +293,7 @@ 2.2 2006-03-26 Carsten Haese 2.3 2006-10-01 Carsten Haese 2.4 2006-12-02 Carsten Haese +2.5 2007-10-16 Carsten Haese -- Carsten Haese <ch...@us...> Modified: branches/informixdb-py3k/doc/manual.txt =================================================================== --- branches/informixdb-py3k/doc/manual.txt 2008-09-28 02:45:11 UTC (rev 185) +++ branches/informixdb-py3k/doc/manual.txt 2008-09-28 02:48:41 UTC (rev 186) @@ -3,8 +3,8 @@ ========================== :Authors: Daniel Smertnig and Carsten Haese -:Version: informixdb 2.4 -:Date: 2006-12-02 +:Version: informixdb 2.5 +:Date: 2007-10-16 :Homepage: `InformixDB on Sourceforge`_ .. contents:: InformixDB @@ -379,6 +379,27 @@ `value` is the number of rows by which you want to scroll from the current row. +Interrupting Queries +-------------------- +`(new in version 2.5)` + +Cursor objects provide two mechanisms for interrupting long-running queries, +configurable with the attributes ``sqltimeout`` and ``sqlinterrupt``. +``sqltimeout`` is an integer that specifies how many milliseconds a query is +allowed to take. If a query takes longer than that, it is automatically +aborted. If ``sqltimeout`` is zero, no timeout is in effect and queries are +allowed to run indefinitely. + +``sqlinterrupt`` is a boolean attribute that indicates whether interrupt +signals during query execution interrupt the query. Note that turning this +feature on disables Python's handling of interrupt signals while queries are +executed. + +Connection objects have ``sqltimeout`` and ``sqlinterrupt`` attributes that +set the defaults for the corresponding attributes of any cursor objects +that the connection object creates. By default, ``sqltimeout`` is zero, +and ``sqlinterrupt`` is False. + Transactions ============ @@ -643,7 +664,33 @@ `Connection` object's messages attribute, and if the error is an actual error (i.e. not of type `Warning`), an exception is raised. +Inspecting Version Numbers +========================== +Occasionally it may be useful to inspect the version numbers of the database +engine, the ESQL/C driver, or of InformixDB itself. The following version +information is available at runtime: +Module-level attribute: + + * ``version``: The version number of InformixDB itself. + (`new in version 2.3`) + +Versions 2.0 through 2.2 didn't provide any version information. If you +have an installation of InformixDB that doesn't have a ``version`` attribute, +you should probably upgrade, since you're missing out on a lot of features +and bug fixes. + +Connection attributes (`new in version 2.5`): + + * ``dbms_name``, ``dbms_version``: The name and version number of the + database engine. For older engines such as Standard Engine, the name can + not be determined and the string "Unknown" is returned instead. + + * ``driver_name``, ``driver_version``: The name and version number of the + ESQL/C installation with which InformixDB was compiled. The name is either + "INFORMIX-ESQL" or "IBM Informix-ESQL" + + .. _InformixDB on Sourceforge: http://informixdb.sourceforge.net/ .. [#pep249] http://www.python.org/peps/pep-0249.html Modified: branches/informixdb-py3k/ext/_informixdb.ec =================================================================== --- branches/informixdb-py3k/ext/_informixdb.ec 2008-09-28 02:45:11 UTC (rev 185) +++ branches/informixdb-py3k/ext/_informixdb.ec 2008-09-28 02:48:41 UTC (rev 186) @@ -117,7 +117,34 @@ */ #define DEFERRED_ADDRESS(ADDR) 0 #include <signal.h> +#include "esqlver.h" +typedef void sqlbreakcallbackfunc(mint); + +/************************* Helpers *************************/ +static PyObject *get_bool_from_int(PyObject *self, void *closure) +{ + int *p; + + p = (int*)((char*)self+(int)closure); + if (*p) { + Py_INCREF(Py_True); + return Py_True; + } + else { + Py_INCREF(Py_False); + return Py_False; + } +} + +static int set_bool_to_int(PyObject *self, PyObject *value, void *closure) +{ + int *p; + p = (int*)((char*)self+(int)closure); + *p = PyObject_IsTrue(value)?1:0; + return 0; +} + /************************* Error handling *************************/ static PyObject *ExcWarning; @@ -164,6 +191,7 @@ following attributes:\n\ \n\ - sqlcode: The Informix SQLCODE associated with the error\n\ +- sqlerrm: The SQLERRM string associated with the error\n\ - diagnostics: A list of dictionaries with keys 'sqlstate' and\n\ 'message' that describe the error in detail."); @@ -450,7 +478,7 @@ PyObject *named_params; int have_named_params; int sqltimeout; - int allow_interrupt; + int sqlinterrupt; } Cursor; static int Cursor_init(Cursor *self, PyObject *args, PyObject *kwargs); @@ -646,14 +674,15 @@ Cursor_binary_types_doc }, { "sqltimeout", T_INT, offsetof(Cursor, sqltimeout), 0, "SQL query timeout in milliseconds." }, - { "allow_interrupt", T_INT, offsetof(Cursor, allow_interrupt), 0, - "Indicates if SIGINT interrupts SQL queries." }, { NULL } }; static PyGetSetDef Cursor_getseters[] = { { "sqlerrd", (getter)Cursor_getsqlerrd, NULL, "Informix SQL error descriptor as tuple", NULL }, + { "sqlinterrupt", (getter)get_bool_from_int, (setter)set_bool_to_int, + "If True, SIGINT interrupts SQL queries.", + (void*)offsetof(Cursor, sqlinterrupt) }, { NULL } }; @@ -728,6 +757,13 @@ PyObject *errorhandler; int autocommit; PyObject *binary_types; + PyObject *dbms_name; + PyObject *dbms_version; + PyObject *driver_name; + PyObject *driver_version; + int can_describe_input; + int sqltimeout; + int sqlinterrupt; } Connection; static int setConnection(Connection*); @@ -876,6 +912,16 @@ Connection_errorhandler_doc }, { "binary_types", T_OBJECT_EX, offsetof(Connection, binary_types), READONLY, Connection_binary_types_doc }, + { "dbms_name", T_OBJECT_EX, offsetof(Connection, dbms_name), READONLY, + "Name of the database engine." }, + { "dbms_version", T_OBJECT_EX, offsetof(Connection, dbms_version), READONLY, + "Version of the database engine." }, + { "driver_name", T_OBJECT_EX, offsetof(Connection, driver_name), READONLY, + "Name of the client driver." }, + { "driver_version", T_OBJECT_EX, offsetof(Connection, driver_version), READONLY, + "Version of the client driver." }, + { "sqltimeout", T_INT, offsetof(Connection, sqltimeout), 0, + "Default SQL query timeout in milliseconds." }, { NULL } }; @@ -914,6 +960,9 @@ ExcNotSupportedError_doc, DEFERRED_ADDRESS(ExcNotSupportedError) }, { "autocommit", (getter)Connection_getautocommit, (setter)Connection_setautocommit, Connection_autocommit_doc, NULL }, + { "sqlinterrupt", (getter)get_bool_from_int, (setter)set_bool_to_int, + "Default setting for whether SIGINT interrupts SQL queries.", + (void*)offsetof(Connection, sqlinterrupt) }, { NULL } }; @@ -1404,7 +1453,7 @@ else $endif; { - var->sqltype = CSTRINGTYPE; + var->sqltype = CVCHARTYPE; var->sqldata = malloc(n+1); var->sqllen = n+1; *var->sqlind = 0; @@ -1751,6 +1800,10 @@ case SQLINTERVAL: var->sqltype = CINVTYPE; break; + case SQLVCHAR: + case SQLNVCHAR: + var->sqltype = CVCHARTYPE; + break; default: { int known_type = 0; $ifdef HAVE_ESQL9; @@ -1926,6 +1979,17 @@ (self->stype == 0 || (self->stype == SQ_EXECPROC && tdaOut->sqld > 0) ); if (self->has_output) { +$ifdef HAVE_DESCRIBE_INPUT; + if (self->conn->can_describe_input) { + struct sqlda *tda = NULL; + EXEC SQL DESCRIBE INPUT :queryName INTO tda; + ret_on_dberror_cursor(self, "DESCRIBE INPUT"); + if (tda) { + copyDescr(tdaIn, tda); + _da_free(tda); + } + } +$endif; bindOutput(self); switch (self->is_hold + 2*self->is_scroll) { case 3: @@ -2025,16 +2089,16 @@ if (self->sqltimeout>0) { sqlbreakcallback(self->sqltimeout, _sqltimeouthandler); } - if (self->allow_interrupt) { + if (self->sqlinterrupt) { oldsighandler = signal(2, _sigint_sqlbreak); } EXEC SQL OPEN :cursorName USING DESCRIPTOR tdaIn; - if (self->allow_interrupt) { + if (self->sqlinterrupt) { signal(2, oldsighandler); } Py_END_ALLOW_THREADS; ret_on_dberror_cursor(self, "OPEN"); - sqlbreakcallback(-1, (void*)NULL); + sqlbreakcallback(-1, (sqlbreakcallbackfunc*)NULL); self->state = 3; for (i=0; i<6; i++) self->sqlerrd[i] = sqlca.sqlerrd[i]; @@ -2046,16 +2110,16 @@ if (self->sqltimeout>0) { sqlbreakcallback(self->sqltimeout, _sqltimeouthandler); } - if (self->allow_interrupt) { + if (self->sqlinterrupt) { oldsighandler = signal(2, _sigint_sqlbreak); } EXEC SQL EXECUTE :queryName USING DESCRIPTOR tdaIn; - if (self->allow_interrupt) { + if (self->sqlinterrupt) { signal(2, oldsighandler); } Py_END_ALLOW_THREADS; ret_on_dberror_cursor(self, "EXECUTE"); - sqlbreakcallback(-1, (void*)NULL); + sqlbreakcallback(-1, (sqlbreakcallbackfunc*)NULL); for (i=0; i<6; i++) self->sqlerrd[i] = sqlca.sqlerrd[i]; switch (self->stype) { @@ -2190,6 +2254,14 @@ return Py_None; } +static void _clip_char(char *s) +{ + /* clip trailing spaces */ + register size_t len = strlen(s); + register size_t clipped_len = byleng(s, len); + s[clipped_len] = 0; +} + static PyObject *doCopy(struct sqlvar_struct *var, int type, int4 xid, int4 sqllen, struct Cursor_t *cur) { @@ -2325,19 +2397,17 @@ } } case SQLCHAR: + case SQLNCHAR: + { + _clip_char((char*)data); + return Py_BuildValue("s", (char*)data); + } case SQLVCHAR: - case SQLNCHAR: case SQLNVCHAR: $ifdef HAVE_ESQL9; case SQLLVARCHAR: $endif; - { - /* clip trailing spaces */ - register size_t len = strlen((char*)data); - register size_t clipped_len = byleng(data, len); - ((char*)data)[clipped_len] = 0; return Py_BuildValue("s", (char*)data); - } case SQLFLOAT: return PyFloat_FromDouble(*(double*)data); case SQLSMFLOAT: @@ -2433,9 +2503,7 @@ /* Unknown type. bindOutput falls back to binding to a character string. If Informix actually managed to read this unknown type into that string, we might as well return it instead of returning None. */ - register size_t len = strlen((char*)data); - register size_t clipped_len = byleng(data, len); - ((char*)data)[clipped_len] = 0; + _clip_char((char*)data); return Py_BuildValue("s", (char*)data); } } @@ -2672,6 +2740,7 @@ Py_XDECREF(self->conn); Py_XDECREF(self->messages); Py_XDECREF(self->errorhandler); + Py_XDECREF(self->op); free(self->cursorName); } @@ -2713,24 +2782,21 @@ int is_scroll = 0; int is_hold = 0; int use_decimal = 1; - int sqltimeout = 0; - int allow_interrupt = 0; static char* kwdlist[] = { "connection", "name", "rowformat", - "scroll", "hold", "use_decimal", - "sqltimeout", "allow_interrupt", 0 }; + "scroll", "hold", "use_decimal", 0 }; if (DecimalType==Py_None) { use_decimal = 0; } - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|siiiiii", kwdlist, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!|siiii", kwdlist, &Connection_type, &conn, &name, &rowformat, &is_scroll, &is_hold, - &use_decimal, &sqltimeout, &allow_interrupt)) + &use_decimal)) return -1; self->use_decimal = (use_decimal)?1:0; - self->sqltimeout = sqltimeout; - self->allow_interrupt = allow_interrupt; Py_INCREF(Py_None); self->description = Py_None; self->conn = conn; Py_INCREF(conn); + self->sqltimeout = conn->sqltimeout; + self->sqlinterrupt = conn->sqlinterrupt; self->state = 0; self->daIn.sqld = 0; self->daIn.sqlvar = 0; self->daOut = 0; @@ -2798,12 +2864,11 @@ struct sqlda *tdaOut = self->daOut; int i; void (*oldsighandler)(int); - oldsighandler = NULL; - EXEC SQL BEGIN DECLARE SECTION; char *cursorName; EXEC SQL END DECLARE SECTION; + oldsighandler = NULL; cursorName = self->cursorName; require_cursor_open(self); @@ -2816,7 +2881,7 @@ if (self->sqltimeout>0) { sqlbreakcallback(self->sqltimeout, _sqltimeouthandler); } - if (self->allow_interrupt) { + if (self->sqlinterrupt) { oldsighandler = signal(2, _sigint_sqlbreak); } if (self->is_scroll) { @@ -2841,7 +2906,7 @@ else { EXEC SQL FETCH :cursorName USING DESCRIPTOR tdaOut; } - if (self->allow_interrupt) { + if (self->sqlinterrupt) { signal(2, oldsighandler); } Py_END_ALLOW_THREADS; @@ -2853,7 +2918,7 @@ } else if (strncmp(SQLSTATE, "00", 2)) { ret_on_dberror_cursor(self, "FETCH"); } - sqlbreakcallback(-1,(void*)NULL); + sqlbreakcallback(-1,(sqlbreakcallbackfunc*)NULL); return processOutput(self); } @@ -3061,8 +3126,16 @@ char *connectionString = NULL; char *dbUser = NULL; char *dbPass = NULL; + char server_type[128]; + char ver_major[16]; + char ver_minor[16]; + char ver_os[16]; + char ver_level[16]; + char version[256]; EXEC SQL END DECLARE SECTION; int autocommit = 0; + int iVerMajor = 0; + int iVerMinor = 0; PyObject *pyDbUser = NULL, *pyDbPass = NULL; static char* kwd_list[] = { "dsn", "user", "password", "autocommit", 0 }; @@ -3106,8 +3179,11 @@ } self->is_open = 1; + self->can_describe_input = 0; self->has_commit = (sqlca.sqlwarn.sqlwarn1 == 'W'); self->autocommit = 0; + self->sqltimeout = 0; + self->sqlinterrupt = 0; if (autocommit) self->autocommit = 1; if (self->has_commit && !self->autocommit) { @@ -3119,6 +3195,43 @@ setConnectionName(self->name); + EXEC SQL + SELECT dbinfo("version","server-type"), + dbinfo("version","major"), + dbinfo("version","minor"), + dbinfo("version","os"), + dbinfo("version","level") + INTO :server_type, :ver_major, :ver_minor, :ver_os, :ver_level + FROM systables where tabid=1 ; + + if (SQLCODE==0) { + _clip_char(server_type); + _clip_char(ver_major); + _clip_char(ver_minor); + _clip_char(ver_os); + _clip_char(ver_level); + sprintf(version, "%s.%s%s%s", ver_major, ver_minor, ver_os, ver_level); + self->dbms_name = PyUnicode_FromString(server_type); + self->dbms_version = PyUnicode_FromString(version); + + iVerMajor = atoi(ver_major); + iVerMinor = atoi(ver_minor); + if (iVerMajor*100+iVerMinor >= 940) { + self->can_describe_input = 1; + } + } + else { + EXEC SQL + SELECT owner + INTO :version + FROM systables where tabname = " VERSION"; + _clip_char(version); + self->dbms_name = PyUnicode_FromString("Unknown"); + self->dbms_version = PyUnicode_FromString(version); + } + self->driver_name = PyUnicode_FromString(DRIVER_NAME); + self->driver_version = PyUnicode_FromString(DRIVER_VERSION); + return 0; } @@ -3156,13 +3269,15 @@ static PyObject* DatabaseError_init(PyObject* self, PyObject* args, PyObject* kwds) { - static char* kwdnames[] = { "action", "sqlcode", "diagnostics", 0 }; + static char* kwdnames[] = { "action", "sqlcode", "diagnostics", "sqlerrm", + 0 }; PyObject *action; PyObject *diags; long int sqlcode; + PyObject *sqlerrm; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "UlO!", kwdnames, - &action, &sqlcode, &PyList_Type, &diags)) { + if (!PyArg_ParseTupleAndKeywords(args, kwds, "UlO!O", kwdnames, + &action, &sqlcode, &PyList_Type, &diags, &sqlerrm)) { return NULL; } @@ -3178,18 +3293,23 @@ return NULL; } + if (PyObject_SetAttrString(self, "sqlerrm", sqlerrm)) { + return NULL; + } + Py_INCREF(Py_None); return Py_None; } static PyObject* DatabaseError_str(PyObject* self, PyObject* args) { - PyObject *str, *action, *sqlcode, *diags, *a, *f; + PyObject *str, *action, *sqlcode, *diags, *sqlerrm, *a, *f; int i; action = PyObject_GetAttrString(self, "action"); sqlcode = PyObject_GetAttrString(self, "sqlcode"); diags = PyObject_GetAttrString(self, "diagnostics"); + sqlerrm = PyObject_GetAttrString(self, "sqlerrm"); a = Py_BuildValue("(NN)", sqlcode, action); f = PyUnicode_FromString("SQLCODE %d in %s: \n"); @@ -3209,6 +3329,17 @@ Py_DECREF(f); + if (PyObject_IsTrue(sqlerrm)) { + PyUnicode_AppendAndDel(&str, PyUnicode_FromString("SQLERRM = ")); + PyUnicode_Append(&str, sqlerrm); + PyUnicode_AppendAndDel(&str, PyUnicode_FromString("\n")); + } + + Py_DECREF(action); + Py_DECREF(sqlcode); + Py_DECREF(diags); + Py_DECREF(sqlerrm); + return str; } @@ -3273,7 +3404,7 @@ Py_DECREF(msg); } - return Py_BuildValue("(siN)", action, SQLCODE, list); + return Py_BuildValue("(siNs)", action, SQLCODE, list, sqlca.sqlerrm); } /* determines the type of an error by looking at SQLSTATE */ @@ -4235,7 +4366,9 @@ ExposeIntConstant(LO_ATTR_NOKEEP_LASTACCESS_TIME); ExposeIntConstant(LO_ATTR_HIGH_INTEG); ExposeIntConstant(LO_ATTR_MODERATE_INTEG); +#ifdef LO_ATTR_TEMP ExposeIntConstant(LO_ATTR_TEMP); +#endif ExposeIntConstant(LO_SEEK_SET); ExposeIntConstant(LO_SEEK_CUR); ExposeIntConstant(LO_SEEK_END); Modified: branches/informixdb-py3k/informixdb.py =================================================================== --- branches/informixdb-py3k/informixdb.py 2008-09-28 02:45:11 UTC (rev 185) +++ branches/informixdb-py3k/informixdb.py 2008-09-28 02:48:41 UTC (rev 186) @@ -46,7 +46,7 @@ http://www.python.org/peps/pep-0249.html """ -version = "2.4" +version = "2.5" class Row(object): """Helper class for cursors whose row format is ROW_AS_OBJECT.""" Modified: branches/informixdb-py3k/setup.py =================================================================== --- branches/informixdb-py3k/setup.py 2008-09-28 02:45:11 UTC (rev 185) +++ branches/informixdb-py3k/setup.py 2008-09-28 02:48:41 UTC (rev 186) @@ -61,7 +61,9 @@ self.esql_parts.append('-static') # determine esql version - esqlver = re.compile(r"(IBM)?.*ESQL Version (\d+)\.(\d+)") + driver_name = "INFORMIX-ESQL" + driver_version = "Unknown" + esqlver = re.compile(r"(IBM)?.*ESQL Version ((\d+)\.(\d+)[^ ]*)") cout = os.popen(' '.join(self.esql_parts[0:1] + [ '-V' ]),'r') esqlversion = None # result from os.popen is not iterable in Python 3.0a1, workaround @@ -69,14 +71,24 @@ matchobj = esqlver.match(line) if matchobj: matchgroups = matchobj.groups() - esqlversion = int(matchgroups[1] + matchgroups[2]) + driver_version = matchgroups[1].strip() + esqlversion = int(matchgroups[2] + matchgroups[3]) if matchgroups[0]=="IBM": # Assume ESQL 9.xx for any IBM branded CSDK. + driver_name = "IBM Informix-ESQL" esqlversion = 960 if esqlversion==None: esqlversion = 850 if esqlversion >= 900: self.esql_parts.append("-EDHAVE_ESQL9") + if esqlversion >= 953: + self.esql_parts.append("-EDHAVE_DESCRIBE_INPUT") + f = open(os.path.join("ext","esqlver.h"), "w") + f.write("""\ +#define DRIVER_NAME "%(driver_name)s" +#define DRIVER_VERSION "%(driver_version)s" +""" % locals()) + f.close() # find esql libs/objects cout = os.popen(' '.join(self.esql_parts + [ '-libs' ]),'r') @@ -91,9 +103,15 @@ esql_config.append(token) ret = cout.close() if ret != None and ret != 0: - raise DistutilsSetupError( - "\nCan't find esql. Please set INFORMIXDIR correctly.") + raise DistutilsSetupError("""\ +Can't run esql. Please make sure that: +* You have the Informix CSDK installed, +* INFORMIXDIR is set to where Informix CSDK is installed, and +* esql is in your PATH. +See the README for build requirements. +""") + if get_platform()=="win32": for arg in esql_config: if arg.endswith('.lib'): @@ -208,8 +226,8 @@ DistributionMetadata.download_url = None setup (name = 'InformixDB', - version = '2.4', - description = 'InformixDB v2.4', + version = '2.5', + description = 'InformixDB v2.5', long_description = \ "InformixDB is a DB-API 2.0 compliant interface for IBM Informix\n" "databases.", Copied: branches/informixdb-py3k/winbuild.bat (from rev 184, trunk/informixdb/winbuild.bat) =================================================================== --- branches/informixdb-py3k/winbuild.bat (rev 0) +++ branches/informixdb-py3k/winbuild.bat 2008-09-28 02:48:41 UTC (rev 186) @@ -0,0 +1,7 @@ +set INFORMIXDIR=C:\Program Files\IBM\Informix\Client-SDK +set OLDPATH=%PATH% +set PATH=%INFORMIXDIR%\bin;C:\msys\1.0\mingw\bin;%PATH% +C:\Python25\python.exe setup.py bdist_wininst build_ext -c mingw32 --esql-threadlib=winnt +C:\Python24\python.exe setup.py bdist_wininst build_ext -c mingw32 --esql-threadlib=winnt +C:\Python23\python.exe setup.py bdist_wininst build_ext -c mingw32 --esql-threadlib=winnt +set PATH=%OLDPATH% This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |