Imported Upstream version 2.6.3 upstream/2.6.3
authorJoel Rosdahl <joel@debian.org>
Sun, 20 Feb 2011 15:52:37 +0000 (16:52 +0100)
committerJoel Rosdahl <joel@debian.org>
Sun, 20 Feb 2011 15:52:37 +0000 (16:52 +0100)
PKG-INFO
doc/sphinx/Makefile
doc/sphinx/conf.py
doc/sphinx/sqlite3.rst
lib/test/dbapi.py
setup.py
src/backup.h [new file with mode: 0644]
src/connection.c
src/module.c
src/module.h

index e502d6c..e0fdf08 100644 (file)
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.0
 Name: pysqlite
-Version: 2.6.0
+Version: 2.6.3
 Summary: DB-API 2.0 interface for SQLite 3.x
 Home-page: http://pysqlite.googlecode.com/
 Author: Gerhard Haering
index 33e3361..bccfdaf 100644 (file)
@@ -3,7 +3,7 @@
 
 # You can set these variables from the command line.
 SPHINXOPTS   =
-SPHINXBUILD  = sphinx-build.py
+SPHINXBUILD  = sphinx-build
 PAPER        =
 
 ALLSPHINXOPTS = -d .build/doctrees -D latex_paper_size=$(PAPER) \
index c8143f1..6528513 100644 (file)
@@ -40,9 +40,9 @@ copyright = u'2008-2009, Gerhard Häring'
 # other places throughout the built documents.
 #
 # The short X.Y version.
-version = '2.5'
+version = '2.6'
 # The full version, including alpha/beta/rc tags.
-release = '2.5.6'
+release = '2.6.0'
 
 # There are two options for replacing |today|: either, you set today to some
 # non-false value, then it is used:
index 4f1b925..a0d5de8 100644 (file)
@@ -871,20 +871,16 @@ committed:
 .. literalinclude:: ../includes/sqlite3/ctx_manager.py
 
 
-Combining APSW and pysqlite
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Common issues
+-------------
 
-APSW is "Another Python SQLite Wrapper". Its goal is to directly wrap the
-SQLite API for Python. If there's SQLite functionality that is only wrapped via
-APSW, but not (yet) via pysqlite, then you can still use the APSW functionality
-in pysqlite.
+Multithreading
+^^^^^^^^^^^^^^
 
-Just use the APSW Connection as a parameter to the connect function and reuse
-an existing APSW connection like this.
+Older SQLite versions had issues with sharing connections between threads.
+That's why the Python module disallows sharing connections and cursors between
+threads. If you still try to do so, you will get an exception at runtime.
 
-.. literalinclude:: ../includes/sqlite3/apsw_example.py
-
-This feature only works if both APSW and pysqlite are dynamically linked
-against the same SQLite shared library. I. e. it will *not* work on Windows
-without a custom built pysqlite and APSW.
+The only exception is calling the :meth:`~Connection.interrupt` method, which
+only makes sense to call from a different thread.
 
index 352ff2e..ea0b417 100644 (file)
@@ -164,8 +164,8 @@ class CursorTests(unittest.TestCase):
     def CheckExecuteTooMuchSql(self):
         try:
             self.cu.execute("select 5+4; select 4+5")
-            self.fail("should have raised a Warning")
-        except sqlite.Warning:
+            self.fail("should have raised a ProgrammingError")
+        except sqlite.ProgrammingError:
             return
         except:
             self.fail("raised wrong exception")
index 6a590ab..4e9ad3d 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -35,10 +35,15 @@ import cross_bdist_wininst
 
 sqlite = "sqlite"
 
+PYSQLITE_EXPERIMENTAL = False
+
 sources = ["src/module.c", "src/connection.c", "src/cursor.c", "src/cache.c",
            "src/microprotocols.c", "src/prepare_protocol.c", "src/statement.c",
            "src/util.c", "src/row.c"]
 
+if PYSQLITE_EXPERIMENTAL:
+    sources.append("src/backup.c")
+
 include_dirs = []
 library_dirs = []
 libraries = []
@@ -99,10 +104,11 @@ def get_amalgamation():
 
     zf = zipfile.ZipFile("tmp.zip")
     files = ["sqlite3.c", "sqlite3.h"]
+    directory = zf.namelist()[0]
     for fn in files:
         print "Extracting", fn
         outf = open(AMALGAMATION_ROOT + os.sep + fn, "wb")
-        outf.write(zf.read(fn))
+        outf.write(zf.read(directory + fn))
         outf.close()
     zf.close()
     os.unlink("tmp.zip")
diff --git a/src/backup.h b/src/backup.h
new file mode 100644 (file)
index 0000000..10720f0
--- /dev/null
@@ -0,0 +1,43 @@
+/* backup.h - definitions for the backup type
+ *
+ * Copyright (C) 2010 Gerhard Häring <gh@ghaering.de>
+ *
+ * This file is part of pysqlite.
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.  In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ *    claim that you wrote the original software. If you use this software
+ *    in a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ *    misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ */
+
+#ifndef PYSQLITE_BACKUP_H
+#define PYSQLITE_BACKUP_H
+#include "Python.h"
+
+#include "sqlite3.h"
+#include "connection.h"
+
+typedef struct
+{
+    PyObject_HEAD
+    sqlite3_backup* backup;
+    pysqlite_Connection* source_con;
+    pysqlite_Connection* dest_con;
+} pysqlite_Backup;
+
+extern PyTypeObject pysqlite_BackupType;
+
+int pysqlite_backup_setup_types(void);
+
+#endif
index d1060de..481b9b5 100644 (file)
 #include "util.h"
 #include "sqlitecompat.h"
 
+#ifdef PYSQLITE_EXPERIMENTAL
+#include "backup.h"
+#endif
+
 #include "pythread.h"
 
 #define ACTION_FINALIZE 1
@@ -351,6 +355,41 @@ PyObject* pysqlite_connection_cursor(pysqlite_Connection* self, PyObject* args,
     return cursor;
 }
 
+#ifdef PYSQLITE_EXPERIMENTAL
+PyObject* pysqlite_connection_backup(pysqlite_Connection* self, PyObject* args, PyObject* kwargs)
+{
+    static char *kwlist[] = {"dest_db", "source_name", "dest_db_name", NULL, NULL};
+    char* source_name;
+    char* dest_name;
+    pysqlite_Connection* dest_con;
+    pysqlite_Backup* backup;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O!ss", kwlist,
+                                     &pysqlite_ConnectionType, &dest_con, &source_name, &dest_name)) {
+        return NULL;
+    }
+
+    if (!pysqlite_check_thread(self) || !pysqlite_check_connection(self)) {
+        return NULL;
+    }
+
+    backup = PyObject_New(pysqlite_Backup, &pysqlite_BackupType);
+    if (!backup) {
+        return NULL;
+    }
+
+    Py_INCREF(self);
+    backup->source_con = self;
+
+    Py_INCREF(dest_con);
+    backup->dest_con = dest_con;
+
+    backup->backup = sqlite3_backup_init(dest_con->db, dest_name, self->db, source_name);
+
+    return (PyObject*)backup;
+}
+#endif
+
 PyObject* pysqlite_connection_close(pysqlite_Connection* self, PyObject* args)
 {
     PyObject* ret;
@@ -1201,9 +1240,9 @@ PyObject* pysqlite_connection_call(pysqlite_Connection* self, PyObject* args, Py
 
     if (rc != SQLITE_OK) {
         if (rc == PYSQLITE_TOO_MUCH_SQL) {
-            PyErr_SetString(pysqlite_Warning, "You can only execute one statement at a time.");
+            PyErr_SetString(pysqlite_ProgrammingError, "You can only execute one statement at a time.");
         } else if (rc == PYSQLITE_SQL_WRONG_TYPE) {
-            PyErr_SetString(pysqlite_Warning, "SQL is of wrong type. Must be string or unicode.");
+            PyErr_SetString(pysqlite_ProgrammingError, "SQL is of wrong type. Must be string or unicode.");
         } else {
             (void)pysqlite_statement_reset(statement);
             _pysqlite_seterror(self->db, NULL);
@@ -1554,6 +1593,10 @@ static PyGetSetDef connection_getset[] = {
 };
 
 static PyMethodDef connection_methods[] = {
+    #ifdef PYSQLITE_EXPERIMENTAL
+    {"backup", (PyCFunction)pysqlite_connection_backup, METH_VARARGS|METH_KEYWORDS,
+        PyDoc_STR("Backup database.")},
+    #endif
     {"cursor", (PyCFunction)pysqlite_connection_cursor, METH_VARARGS|METH_KEYWORDS,
         PyDoc_STR("Return a cursor for the connection.")},
     {"close", (PyCFunction)pysqlite_connection_close, METH_NOARGS,
index 8794809..c0e6aa8 100644 (file)
 #include "microprotocols.h"
 #include "row.h"
 
+#ifdef PYSQLITE_EXPERIMENTAL
+#include "backup.h"
+#endif
+
 #if SQLITE_VERSION_NUMBER >= 3003003
 #define HAVE_SHARED_CACHE
 #endif
@@ -314,6 +318,9 @@ PyMODINIT_FUNC init_sqlite(void)
         (pysqlite_connection_setup_types() < 0) ||
         (pysqlite_cache_setup_types() < 0) ||
         (pysqlite_statement_setup_types() < 0) ||
+        #ifdef PYSQLITE_EXPERIMENTAL
+        (pysqlite_backup_setup_types() < 0) ||
+        #endif
         (pysqlite_prepare_protocol_setup_types() < 0)
        ) {
         return;
index 8d17d61..0b1dab3 100644 (file)
@@ -25,7 +25,7 @@
 #define PYSQLITE_MODULE_H
 #include "Python.h"
 
-#define PYSQLITE_VERSION "2.6.0"
+#define PYSQLITE_VERSION "2.6.3"
 
 extern PyObject* pysqlite_Error;
 extern PyObject* pysqlite_Warning;