Re: [cx-oracle-users] Wheels again
Brought to you by:
atuining
From: Anthony T. <ant...@gm...> - 2016-04-26 15:53:55
|
Thanks for these suggestions. It will take some time to consider which approach to take. I'll reply back again when I have a positive decision made. One concern that eliminates a few of these possibilities is portability. cx_Oracle runs on more than just Windows so Windows-specific code/concepts can't be used. Creating differently named modules (for client version) or creating a wrapper module that imports the right sub-module at run-time are the two top choices I am considering right now. If anyone else has any thoughts on which approach would be best to take, I'd love to hear from you. Anthony On Thu, Apr 21, 2016 at 7:24 PM, Kubo Takehiro <ku...@ji...> wrote: > Hi, > > I know a little about python and nothing about wheels. > However I have three ideas. > > 1. Distribute cx_Oracle compiled for Oracle 10g. > > Oracle client library ABI keeps backward compatibility on Windows. > When a binary file is compiled for Oracle 10g, it works with Oracle > 10g, 11g and 12c. > However it cannot use features depends on Oracle 11g and 12c clients. > > 2. Check Oracle client version at runtime. > > This is ideal for pre-compiled packages but not practical because this > needs > too many changes in cx_Oracle. > > Add the following code to Module_Initialize() in cx_Oracle.c > > HMODULE hMod = GetModuleHandle("OCI.DLL"); > void (*func)(sword*, sword*, sword*, sword*, sword*) = (void > (*)(sword*, sword*, sword*, sword*, sword*))GetProcAddress(hMod, > "OCIClientVersion"); > if (func == NULL) { > oracle_version_hex = ORACLE_VERSION(10, 1) > } else { > sword major, minor, update, patch, port; > (*func)(&major, &minor, &update, &patch, &port); > oracle_version_hex = ORACLE_VERSION(major, minor); > } > > and rewrite code such as > #if ORACLE_VERSION_HEX >= ORACLE_VERSION(11,1) > ... > #endif > to > if (oracle_client_hex >= ORACLE_VERSION(11,1)) { > ... > } > > Use function pointers retrieved by GetProcAddress() for functions > added in Oracle 11g and 12c, > > 3. Add a bootstrap module if wheels can include more than one module. > > Compile cx_Oracle for Oracle 10.1, 10.2, 11.1, 11.2 and 12.1 and rename > them > to cx_Oracle.10.1.dll, cx_Oracle.10.2.dll, cx_Oracle.11.1.dll, > cx_Oracle.11.2.dll and cx_Oracle.12.1.dll respectively. > > Compile the following code as cx_Oracle.dll. > > // This is incomplete code. no error checks. > > typedef int sword; > > static void *get_init_func(const char *init_func_name) > { > HMODULE hMod; > void (*func)(sword*, sword*, sword*, sword*, sword*); > char dll_name[30]; > char dll_full_path[MAX_PATH]; > > // Get the Oracle client version and fill dll_name. > hMod = LoadLibrary("OCI.DLL"); > func = (void (*)(sword*, sword*, sword*, sword*, > sword*))GetProcAddress(hMod, "OCIClientVersion"); > if (func == NULL) { > strcpy(dll_name, "cx_Oracle.10.1.dll"); > } else { > sword major, minor, update, patch, port; > (*func)(&major, &minor, &update, &patch, &port); > sprintf(dll_name, "cx_Oracle.%d.%d.dll", major, minor); > } > FreeLibrary(hMod); > > // get the current module handle. > GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, > &get_init_func, &hMod); > ... fill dll_full_path with the directory name containing the > current module by using GetModuleFileName(hMod, ...). > ... append dll_name to dll_full_path. > > // Load the real cx_Oracle module and get the module initializer > function. > hMod = LoadLibrary(dll_full_path); > return GetProcAddress(hMod, init_func_name); > } > > #if PY_MAJOR_VERSION >= 3 > PyMODINIT_FUNC PyInit_cx_Oracle(void) > { > PyObject *(*init)(void) = > (PyObject*(*)(void))get_init_func("PyInit_cx_Oracle"); > return (*init)(); > } > #else > void initcx_Oracle(void) > { > void (*init)(void) = (void(*)(void))get_init_func("initcx_Oracle"); > (*init)(); > } > #endif > > > Put cx_Oracle.dll, cx_Oracle.10.1.dll, cx_Oracle.10.2.dll, > cx_Oracle.11.1.dll, cx_Oracle.11.2.dll > and cx_Oracle.12.1.dll in a directory. > > > ------------------------------------------------------------------------------ > Find and fix application performance issues faster with Applications > Manager > Applications Manager provides deep performance insights into multiple > tiers of > your business applications. It resolves application problems quickly and > reduces your MTTR. Get your free trial! > https://ad.doubleclick.net/ddm/clk/302982198;130105516;z > _______________________________________________ > cx-oracle-users mailing list > cx-...@li... > https://lists.sourceforge.net/lists/listinfo/cx-oracle-users > |