Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 27 additions & 11 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,31 +85,47 @@ pip install ibm_db --no-binary :all: --no-cache-dir

- When ibm_db get installed from wheel package, you can find clidriver under site_packages directory of Python. You need to copy license file under `site_packages/clidriver/license` to be effective, if any.

**Note:** For windows after installing `ibm_db`, recieves the below error when we try to import ibm_db :
**Windows DLL resolution (Python 3.8+):**

```>python
Python 3.11.4 (tags/v3.11.4:d2340ef, Jun 7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Since Python 3.8, the `PATH` environment variable is no longer used for DLL resolution on Windows (see https://bugs.python.org/issue36085). You may see the following error when importing `ibm_db`:

```
>>> import ibm_db
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing ibm_db: The specified module could not be found.
>>>
```

We need to make sure to set dll path of dependent library of clidriver before importing the module as:
The `ibm_db` package now handles this **automatically** by installing an `ibm_db_dll.pth` file into `site-packages`. This file runs at Python startup and registers the clidriver `bin` directory via `os.add_dll_directory()`, so `import ibm_db` works out of the box.

If `IBM_DB_HOME` is set, the `.pth` file uses `%IBM_DB_HOME%\bin`; otherwise it uses the bundled `site-packages\clidriver\bin`.

**If you still see `ImportError: DLL load failed` after a fresh install**, verify that the `.pth` file exists:

```
python -c "import os, sysconfig; print(os.path.isfile(os.path.join(sysconfig.get_path('purelib'), 'ibm_db_dll.pth')))"
```

If it prints `False`, reinstall ibm_db:

```
pip uninstall ibm_db
pip install ibm_db
```

**Manual fallback:** If the automatic fix does not work in your environment, you can set the DLL path directly in your code before importing the module:

```python
import os
os.add_dll_directory('path to clidriver installation until bin')
import ibm_db

e.g:
os.add_dll_directory('C:\\Program Files\\IBM\\CLIDRIVER\\bin')
import ibm_db
```

Refer https://bugs.python.org/issue36085 for more details.
To find your clidriver `bin` path, run:

```
python -c "import os, site, sysconfig; paths=[os.path.join(site.getusersitepackages(),'clidriver','bin'), os.path.join(sysconfig.get_path('purelib'),'clidriver','bin')]; print(next((p for p in paths if os.path.isdir(p)), 'clidriver not found - reinstall ibm_db'))"
```

#### 1.2 Manual Installation

Expand Down
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,16 @@ pip install ibm_db --no-binary :all: --no-cache-dir

**Windows DLL resolution (Python 3.8+):**

Since Python 3.8, the `PATH` environment variable is no longer used for DLL resolution on Windows (see https://bugs.python.org/issue36085). The `ibm_db` package now handles this **automatically** by installing an `ibm_db_dll.pth` file into `site-packages`. This file runs at Python startup and registers the clidriver `bin` directory via `os.add_dll_directory()`, so `import ibm_db` works out of the box.
Since Python 3.8, the `PATH` environment variable is no longer used for DLL resolution on Windows (see https://bugs.python.org/issue36085). You may see the following error when importing `ibm_db`:

```
>>> import ibm_db
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: DLL load failed while importing ibm_db: The specified module could not be found.
```

The `ibm_db` package now handles this **automatically** by installing an `ibm_db_dll.pth` file into `site-packages`. This file runs at Python startup and registers the clidriver `bin` directory via `os.add_dll_directory()`, so `import ibm_db` works out of the box.

If `IBM_DB_HOME` is set, the `.pth` file uses `%IBM_DB_HOME%\bin`; otherwise it uses the bundled `site-packages\clidriver\bin`.

Expand Down
4 changes: 4 additions & 0 deletions ibm_db.c
Original file line number Diff line number Diff line change
Expand Up @@ -16604,6 +16604,7 @@ static PyObject *ibm_db_get_option(PyObject *self, PyObject *args)
case SQL_ATTR_ROWCOUNT_PREFETCH:
case SQL_ATTR_QUERY_TIMEOUT:
#ifndef __MVS__
case SQL_ATTR_DEFERRED_PREPARE:
case SQL_ATTR_CALL_RETURN:
#endif
isInteger = 1;
Expand Down Expand Up @@ -19331,6 +19332,9 @@ INIT_ibm_db(void)
PyModule_AddIntConstant(m, "SQL_ATTR_PARAMSET_SIZE", SQL_ATTR_PARAMSET_SIZE);
PyModule_AddIntConstant(m, "SQL_ATTR_PARAM_BIND_TYPE", SQL_ATTR_PARAM_BIND_TYPE);
PyModule_AddIntConstant(m, "SQL_PARAM_BIND_BY_COLUMN", SQL_PARAM_BIND_BY_COLUMN);
#ifndef __MVS__
PyModule_AddIntConstant(m, "SQL_ATTR_DEFERRED_PREPARE", SQL_ATTR_DEFERRED_PREPARE);
#endif
PyModule_AddIntConstant(m, "SQL_ATTR_XML_DECLARATION", SQL_ATTR_XML_DECLARATION);
#ifndef __MVS__
PyModule_AddIntConstant(m, "SQL_ATTR_CLIENT_APPLCOMPAT", SQL_ATTR_CLIENT_APPLCOMPAT);
Expand Down
Loading