web/lib/django/contrib/gis/db/backends/spatialite/base.py
changeset 29 cc9b7e14412b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/lib/django/contrib/gis/db/backends/spatialite/base.py	Tue May 25 02:43:45 2010 +0200
@@ -0,0 +1,77 @@
+from ctypes.util import find_library
+from django.conf import settings
+
+from django.core.exceptions import ImproperlyConfigured
+from django.db.backends.sqlite3.base import *
+from django.db.backends.sqlite3.base import DatabaseWrapper as SqliteDatabaseWrapper, \
+    _sqlite_extract, _sqlite_date_trunc, _sqlite_regexp
+from django.contrib.gis.db.backends.spatialite.client import SpatiaLiteClient
+from django.contrib.gis.db.backends.spatialite.creation import SpatiaLiteCreation
+from django.contrib.gis.db.backends.spatialite.introspection import SpatiaLiteIntrospection
+from django.contrib.gis.db.backends.spatialite.operations import SpatiaLiteOperations
+
+class DatabaseWrapper(SqliteDatabaseWrapper):
+    def __init__(self, *args, **kwargs):
+        # Before we get too far, make sure pysqlite 2.5+ is installed.
+        if Database.version_info < (2, 5, 0):
+            raise ImproperlyConfigured('Only versions of pysqlite 2.5+ are '
+                                       'compatible with SpatiaLite and GeoDjango.')
+
+        # Trying to find the location of the SpatiaLite library.
+        # Here we are figuring out the path to the SpatiaLite library
+        # (`libspatialite`). If it's not in the system library path (e.g., it
+        # cannot be found by `ctypes.util.find_library`), then it may be set
+        # manually in the settings via the `SPATIALITE_LIBRARY_PATH` setting.
+        self.spatialite_lib = getattr(settings, 'SPATIALITE_LIBRARY_PATH',
+                                      find_library('spatialite'))
+        if not self.spatialite_lib:
+            raise ImproperlyConfigured('Unable to locate the SpatiaLite library. '
+                                       'Make sure it is in your library path, or set '
+                                       'SPATIALITE_LIBRARY_PATH in your settings.'
+                                       )
+        super(DatabaseWrapper, self).__init__(*args, **kwargs)
+        self.ops = SpatiaLiteOperations(self)
+        self.client = SpatiaLiteClient(self)
+        self.creation = SpatiaLiteCreation(self)
+        self.introspection = SpatiaLiteIntrospection(self)
+
+    def _cursor(self):
+        if self.connection is None:
+            ## The following is the same as in django.db.backends.sqlite3.base ##
+            settings_dict = self.settings_dict
+            if not settings_dict['NAME']:
+                raise ImproperlyConfigured("Please fill out the database NAME in the settings module before using the database.")
+            kwargs = {
+                'database': settings_dict['NAME'],
+                'detect_types': Database.PARSE_DECLTYPES | Database.PARSE_COLNAMES,
+            }
+            kwargs.update(settings_dict['OPTIONS'])
+            self.connection = Database.connect(**kwargs)
+            # Register extract, date_trunc, and regexp functions.
+            self.connection.create_function("django_extract", 2, _sqlite_extract)
+            self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
+            self.connection.create_function("regexp", 2, _sqlite_regexp)
+            connection_created.send(sender=self.__class__)
+
+            ## From here on, customized for GeoDjango ##
+
+            # Enabling extension loading on the SQLite connection.
+            try:
+                self.connection.enable_load_extension(True)
+            except AttributeError:
+                raise ImproperlyConfigured('The pysqlite library does not support C extension loading. '
+                                           'Both SQLite and pysqlite must be configured to allow '
+                                           'the loading of extensions to use SpatiaLite.'
+                                           )
+
+            # Loading the SpatiaLite library extension on the connection, and returning
+            # the created cursor.
+            cur = self.connection.cursor(factory=SQLiteCursorWrapper)
+            try:
+                cur.execute("SELECT load_extension(%s)", (self.spatialite_lib,))
+            except Exception, msg:
+                raise ImproperlyConfigured('Unable to load the SpatiaLite library extension '
+                                           '"%s" because: %s' % (self.spatialite_lib, msg))
+            return cur
+        else:
+            return self.connection.cursor(factory=SQLiteCursorWrapper)