]> granicus.if.org Git - python/commitdiff
Accept patch issue2426 by Paul Kippes (kippesp).
authorGregory P. Smith <greg@mad-scientist.com>
Fri, 28 Mar 2008 08:32:09 +0000 (08:32 +0000)
committerGregory P. Smith <greg@mad-scientist.com>
Fri, 28 Mar 2008 08:32:09 +0000 (08:32 +0000)
Adds sqlite3.Connection.iterdump to allow dumping of databases.

Doc/library/sqlite3.rst
Lib/test/test_sqlite.py
Misc/ACKS
Misc/NEWS
Modules/_sqlite/connection.c

index 6c6cf0349a63fe956c9ff96ed9b9cc88b45f8acc..da313fd5976e7c6e0b127a4ddc9f92d387810111 100644 (file)
@@ -378,6 +378,27 @@ A :class:`Connection` instance has the following attributes and methods:
    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
index 3566f316b1ece35c1863e45eb5682b8402b13dd4..d63bb1d0f8483d95a5459bc4461c4a6afd4c8b7c 100644 (file)
@@ -5,12 +5,13 @@ try:
 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()
index 978b2eb1e837c27f2f791d5cd06d2042a5a220c5..00fcff1744f7becac34d1d16b652edd854edb8cf 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -362,6 +362,7 @@ Lawrence Kesteloot
 Vivek Khera
 Mads Kiilerich
 Taek Joo Kim
+Paul Kippes
 Steve Kirsch
 Ron Klatchko
 Bastian Kleineidam
index 7264dca4c8f6d94cddaf5ed632159878a3197213..a998f9c590dfd5e76cce4c280239176e171a5871 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.6 alpha 2?
 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.
index 92c6a245486cf21aeaebd66835e6d444109dc162..8269e0b1fb21ad885518ed521f4265fce7632af1 100644 (file)
@@ -1199,6 +1199,52 @@ finally:
     return retval;
 }
 
+/* Function author: Paul Kippes <kippesp@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 @@ static PyMethodDef connection_methods[] = {
         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,