[Python-checkins] r62000 - in python/trunk: Doc/library/sqlite3.rst Lib/test/test_sqlite.py Misc/ACKS Misc/NEWS Modules/_sqlite/connection.c

gregory.p.smith python-checkins at python.org
Fri Mar 28 09:32:22 CET 2008


Author: gregory.p.smith
Date: Fri Mar 28 09:32:09 2008
New Revision: 62000

Modified:
   python/trunk/Doc/library/sqlite3.rst
   python/trunk/Lib/test/test_sqlite.py
   python/trunk/Misc/ACKS
   python/trunk/Misc/NEWS
   python/trunk/Modules/_sqlite/connection.c
Log:
Accept patch issue2426 by Paul Kippes (kippesp).

Adds sqlite3.Connection.iterdump to allow dumping of databases.


Modified: python/trunk/Doc/library/sqlite3.rst
==============================================================================
--- python/trunk/Doc/library/sqlite3.rst	(original)
+++ python/trunk/Doc/library/sqlite3.rst	Fri Mar 28 09:32:09 2008
@@ -378,6 +378,27 @@
    deleted since the database connection was opened.
 
 
+.. attribute:: Connection.iterdump
+
+   Returns an iterator to dump the database in an SQL text format.  Useful when
+   saving an in-memory database for later restoration.  This function provides
+   the same capabilities as the :kbd:`.dump` command in the :program:`sqlite3`
+   shell.
+
+   .. versionadded:: 2.6
+
+   Example::
+
+      # Convert file existing_db.db to SQL dump file dump.sql
+      import sqlite3, os
+
+      con = sqlite3.connect('existing_db.db')
+      full_dump = os.linesep.join([line for line in con.iterdump()])
+      f = open('dump.sql', 'w')
+      f.writelines(full_dump)
+      f.close()
+
+
 .. _sqlite3-cursor-objects:
 
 Cursor Objects

Modified: python/trunk/Lib/test/test_sqlite.py
==============================================================================
--- python/trunk/Lib/test/test_sqlite.py	(original)
+++ python/trunk/Lib/test/test_sqlite.py	Fri Mar 28 09:32:09 2008
@@ -5,12 +5,13 @@
 except ImportError:
     raise TestSkipped('no sqlite available')
 from sqlite3.test import (dbapi, types, userfunctions, py25tests,
-                                factory, transactions, hooks, regression)
+                                factory, transactions, hooks, regression,
+                                dump)
 
 def test_main():
     run_unittest(dbapi.suite(), types.suite(), userfunctions.suite(),
                  py25tests.suite(), factory.suite(), transactions.suite(),
-                 hooks.suite(), regression.suite())
+                 hooks.suite(), regression.suite(), dump.suite())
 
 if __name__ == "__main__":
     test_main()

Modified: python/trunk/Misc/ACKS
==============================================================================
--- python/trunk/Misc/ACKS	(original)
+++ python/trunk/Misc/ACKS	Fri Mar 28 09:32:09 2008
@@ -362,6 +362,7 @@
 Vivek Khera
 Mads Kiilerich
 Taek Joo Kim
+Paul Kippes
 Steve Kirsch
 Ron Klatchko
 Bastian Kleineidam

Modified: python/trunk/Misc/NEWS
==============================================================================
--- python/trunk/Misc/NEWS	(original)
+++ python/trunk/Misc/NEWS	Fri Mar 28 09:32:09 2008
@@ -12,6 +12,9 @@
 Core and builtins
 -----------------
 
+- Patch #2426: Added sqlite3.Connection.iterdump method to allow easy dumping
+  of databases.  Contributed by Paul Kippes at PyCon 2008.
+
 - Patch #2477: Added from __future__ import unicode_literals.
 
 - Added backport of bytearray type.

Modified: python/trunk/Modules/_sqlite/connection.c
==============================================================================
--- python/trunk/Modules/_sqlite/connection.c	(original)
+++ python/trunk/Modules/_sqlite/connection.c	Fri Mar 28 09:32:09 2008
@@ -1199,6 +1199,52 @@
     return retval;
 }
 
+/* Function author: Paul Kippes <kippesp at gmail.com>
+ * Class method of Connection to call the Python function _iterdump
+ * of the sqlite3 module.
+ */
+static PyObject *
+pysqlite_connection_iterdump(pysqlite_Connection* self, PyObject* args)
+{
+    PyObject* retval = NULL;
+    PyObject* module = NULL;
+    PyObject* module_dict;
+    PyObject* pyfn_iterdump;
+
+    if (!pysqlite_check_connection(self)) {
+        goto finally;
+    }
+
+    module = PyImport_ImportModule(MODULE_NAME ".dump");
+    if (!module) {
+        goto finally;
+    }
+
+    module_dict = PyModule_GetDict(module);
+    if (!module_dict) {
+        goto finally;
+    }
+
+    pyfn_iterdump = PyDict_GetItemString(module_dict, "_iterdump");
+    if (!pyfn_iterdump) {
+        PyErr_SetString(pysqlite_OperationalError, "Failed to obtain _iterdump() reference");
+        goto finally;
+    }
+
+    args = PyTuple_New(1);
+    if (!args) {
+        goto finally;
+    }
+    Py_INCREF(self);
+    PyTuple_SetItem(args, 0, (PyObject*)self);
+    retval = PyObject_CallObject(pyfn_iterdump, args);
+
+finally:
+    Py_XDECREF(args);
+    Py_XDECREF(module);
+    return retval;
+}
+
 static PyObject *
 pysqlite_connection_create_collation(pysqlite_Connection* self, PyObject* args)
 {
@@ -1344,6 +1390,8 @@
         PyDoc_STR("Creates a collation function. Non-standard.")},
     {"interrupt", (PyCFunction)pysqlite_connection_interrupt, METH_NOARGS,
         PyDoc_STR("Abort any pending database operation. Non-standard.")},
+    {"iterdump", (PyCFunction)pysqlite_connection_iterdump, METH_NOARGS,
+        PyDoc_STR("Returns iterator to the dump of the database in an SQL text format.")},
     {"__enter__", (PyCFunction)pysqlite_connection_enter, METH_NOARGS,
         PyDoc_STR("For context manager. Non-standard.")},
     {"__exit__", (PyCFunction)pysqlite_connection_exit, METH_VARARGS,


More information about the Python-checkins mailing list