[pypy-commit] pypy default: unify sqlite execute and executemany
bdkearns
noreply at buildbot.pypy.org
Mon Mar 11 04:13:55 CET 2013
Author: Brian Kearns <bdkearns at gmail.com>
Branch:
Changeset: r62281:b1628dd8444b
Date: 2013-03-10 21:27 -0400
http://bitbucket.org/pypy/pypy/changeset/b1628dd8444b/
Log: unify sqlite execute and executemany
diff --git a/lib_pypy/_sqlite3.py b/lib_pypy/_sqlite3.py
--- a/lib_pypy/_sqlite3.py
+++ b/lib_pypy/_sqlite3.py
@@ -839,14 +839,14 @@
return func(self, *args, **kwargs)
return wrapper
- @__check_cursor_wrap
- def execute(self, sql, params=[]):
+ def __execute(self, multiple, sql, many_params):
self.__locked = True
try:
self.__description = None
self._reset = False
if not isinstance(sql, basestring):
raise ValueError("operation parameter must be str or unicode")
+ self.__rowcount = -1
self.__statement = self.__connection._statement_cache.get(
sql, self.row_factory)
@@ -858,68 +858,46 @@
if not self.__connection._in_transaction:
self.__connection._begin()
- self.__statement._set_params(params)
+ if multiple and self.__statement._kind != Statement._DML:
+ raise ProgrammingError("executemany is only for DML statements")
- # Actually execute the SQL statement
- ret = _lib.sqlite3_step(self.__statement._statement)
- if ret not in (_lib.SQLITE_DONE, _lib.SQLITE_ROW):
- self.__statement._reset()
- self.__connection._in_transaction = \
- not _lib.sqlite3_get_autocommit(self.__connection._db)
- raise self.__connection._get_exception(ret)
+ for params in many_params:
+ self.__statement._set_params(params)
- if self.__statement._kind == Statement._DML:
- self.__statement._reset()
+ # Actually execute the SQL statement
+ ret = _lib.sqlite3_step(self.__statement._statement)
+ if ret not in (_lib.SQLITE_DONE, _lib.SQLITE_ROW):
+ self.__statement._reset()
+ self.__connection._in_transaction = \
+ not _lib.sqlite3_get_autocommit(self.__connection._db)
+ raise self.__connection._get_exception(ret)
- if self.__statement._kind == Statement._DQL and ret == _lib.SQLITE_ROW:
- self.__statement._build_row_cast_map()
- self.__statement._readahead(self)
- else:
- self.__statement._item = None
- self.__statement._exhausted = True
+ if self.__statement._kind == Statement._DML:
+ self.__statement._reset()
- self.__rowcount = -1
- if self.__statement._kind == Statement._DML:
- self.__rowcount = _lib.sqlite3_changes(self.__connection._db)
+ if self.__statement._kind == Statement._DQL and ret == _lib.SQLITE_ROW:
+ self.__statement._build_row_cast_map()
+ self.__statement._readahead(self)
+ else:
+ self.__statement._item = None
+ self.__statement._exhausted = True
+
+ if self.__statement._kind == Statement._DML:
+ if self.__rowcount == -1:
+ self.__rowcount = 0
+ self.__rowcount += _lib.sqlite3_changes(self.__connection._db)
finally:
self.__locked = False
return self
@__check_cursor_wrap
+ def execute(self, sql, params=[]):
+ return self.__execute(False, sql, [params])
+
+ @__check_cursor_wrap
def executemany(self, sql, many_params):
- self.__locked = True
- try:
- self.__description = None
- self._reset = False
- if not isinstance(sql, basestring):
- raise ValueError("operation parameter must be str or unicode")
- self.__statement = self.__connection._statement_cache.get(
- sql, self.row_factory)
-
- if self.__statement._kind == Statement._DML:
- if self.__connection._isolation_level is not None:
- if not self.__connection._in_transaction:
- self.__connection._begin()
- else:
- raise ProgrammingError(
- "executemany is only for DML statements")
-
- self.__rowcount = 0
- for params in many_params:
- self.__statement._set_params(params)
- ret = _lib.sqlite3_step(self.__statement._statement)
- if ret != _lib.SQLITE_DONE:
- self.__statement._reset()
- self.__connection._in_transaction = \
- not _lib.sqlite3_get_autocommit(self.__connection._db)
- raise self.__connection._get_exception(ret)
- self.__statement._reset()
- self.__rowcount += _lib.sqlite3_changes(self.__connection._db)
- finally:
- self.__locked = False
-
- return self
+ return self.__execute(True, sql, many_params)
def executescript(self, sql):
self.__description = None
More information about the pypy-commit
mailing list