diff --git a/.bumpversion.cfg b/.bumpversion.cfg index edbb95b..38c1800 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.1.0 +current_version = 1.1.1 commit = True tag = True diff --git a/README.rst b/README.rst index 13ab23c..c422597 100644 --- a/README.rst +++ b/README.rst @@ -159,6 +159,7 @@ Changelog ========= - Next version - unreleased +- 1.1.1 - 2017-03-21 - Don't fail on dates before 1900 on Python < 3. diff --git a/README_development.rst b/README_development.rst index 84966e0..11bba85 100644 --- a/README_development.rst +++ b/README_development.rst @@ -69,4 +69,4 @@ Build a new release 9. Send new version and tags to github origin. :: - $ git push origin master --tags + $ git push origin master --follow-tags diff --git a/jaydebeapi/__init__.py b/jaydebeapi/__init__.py index 4e1c597..8199567 100644 --- a/jaydebeapi/__init__.py +++ b/jaydebeapi/__init__.py @@ -17,7 +17,7 @@ # License along with JayDeBeApi. If not, see # . -__version_info__ = (1, 1, 0) +__version_info__ = (1, 1, 1) __version__ = ".".join(str(i) for i in __version_info__) import datetime @@ -347,7 +347,7 @@ def TimestampFromTicks(ticks): return apply(Timestamp, time.localtime(ticks)[:6]) # DB-API 2.0 Module Interface connect constructor -def connect(jclassname, url, driver_args=None, jars=None, libs=None): +def connect(jclassname, url, driver_args=None, jars=None, libs=None, timeout=None): """Open a connection to a database using a JDBC driver and return a Connection instance. @@ -379,7 +379,7 @@ def connect(jclassname, url, driver_args=None, jars=None, libs=None): else: libs = [] jconn = _jdbc_connect(jclassname, url, driver_args, jars, libs) - return Connection(jconn, _converters) + return Connection(jconn, _converters, timeout) # DB-API 2.0 Connection Object class Connection(object): @@ -395,10 +395,11 @@ class Connection(object): DataError = DataError NotSupportedError = NotSupportedError - def __init__(self, jconn, converters): + def __init__(self, jconn, converters, timeout=None): self.jconn = jconn self._closed = False self._converters = converters + self._timeout = timeout def close(self): if self._closed: @@ -419,7 +420,7 @@ def rollback(self): _handle_sql_exception() def cursor(self): - return Cursor(self, self._converters) + return Cursor(self, self._converters, self._timeout) # DB-API 2.0 Cursor Object class Cursor(object): @@ -430,9 +431,10 @@ class Cursor(object): _rs = None _description = None - def __init__(self, connection, converters): + def __init__(self, connection, converters, timeout=None): self._connection = connection self._converters = converters + self._timeout = timeout @property def description(self): @@ -486,9 +488,12 @@ def _close_last(self): def _set_stmt_parms(self, prep_stmt, parameters): for i in range(len(parameters)): - # print (i, parameters[i], type(parameters[i])) prep_stmt.setObject(i + 1, parameters[i]) + # https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#setQueryTimeout(int) + if self._timeout is not None: + prep_stmt.setQueryTimeout(int(self._timeout)) # unit: seconds + def execute(self, operation, parameters=None): if self._connection._closed: raise Error() diff --git a/setup.py b/setup.py index 2f32874..1425345 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( #basic package data name = 'JayDeBeApi', - version = '1.1.0', + version = '1.1.1', author = 'Bastian Bowe', author_email = 'bastian.dev@gmail.com', license = 'GNU LGPL', diff --git a/test/test_mock.py b/test/test_mock.py index 09443a1..03eaa06 100644 --- a/test/test_mock.py +++ b/test/test_mock.py @@ -106,3 +106,12 @@ def test_runtime_exception_on_rollback(self): fail("expected exception") except jaydebeapi.InterfaceError as e: self.assertEquals(str(e), "java.lang.RuntimeException: expected") + + def test_connection_timeout(self): + driver = 'org.jaydebeapi.mockdriver.MockDriver' + url = 'jdbc:jaydebeapi://dummyurl' + conn = jaydebeapi.connect(driver, url, timeout=10) + cursor = conn.cursor() + cursor.execute("dummy stmt") + result = cursor.fetchone() + self.assertIsNotNone(result)