diff -r 000000000000 -r 0d40e90630ef web/lib/django/contrib/gis/db/backend/spatialite/creation.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/contrib/gis/db/backend/spatialite/creation.py Wed Jan 20 00:34:04 2010 +0100 @@ -0,0 +1,61 @@ +import os +from django.conf import settings +from django.core.management import call_command +from django.db import connection + +def spatialite_init_file(): + # SPATIALITE_SQL may be placed in settings to tell + # GeoDjango to use a specific user-supplied file. + return getattr(settings, 'SPATIALITE_SQL', 'init_spatialite-2.3.sql') + +def create_test_spatial_db(verbosity=1, autoclobber=False, interactive=False): + "Creates a spatial database based on the settings." + + # Making sure we're using PostgreSQL and psycopg2 + if settings.DATABASE_ENGINE != 'sqlite3': + raise Exception('SpatiaLite database creation only supported on sqlite3 platform.') + + # Getting the test database name using the SQLite backend's + # `_create_test_db`. Unless `TEST_DATABASE_NAME` is defined, + # it returns ":memory:". + db_name = connection.creation._create_test_db(verbosity, autoclobber) + + # Closing out the current connection to the database set in + # originally in the settings. This makes it so `initialize_spatialite` + # function will be run on the connection for the _test_ database instead. + connection.close() + + # Point to the new database + settings.DATABASE_NAME = db_name + connection.settings_dict["DATABASE_NAME"] = db_name + can_rollback = connection.creation._rollback_works() + settings.DATABASE_SUPPORTS_TRANSACTIONS = can_rollback + connection.settings_dict["DATABASE_SUPPORTS_TRANSACTIONS"] = can_rollback + + # Finally, loading up the SpatiaLite SQL file. + load_spatialite_sql(db_name, verbosity=verbosity) + + if verbosity >= 1: + print 'Creation of spatial database %s successful.' % db_name + + # Syncing the database + call_command('syncdb', verbosity=verbosity, interactive=interactive) + +def load_spatialite_sql(db_name, verbosity=1): + """ + This routine loads up the SpatiaLite SQL file. + """ + # Getting the location of the SpatiaLite SQL file, and confirming + # it exists. + spatialite_sql = spatialite_init_file() + if not os.path.isfile(spatialite_sql): + raise Exception('Could not find the SpatiaLite initialization SQL file: %s' % spatialite_sql) + + # Opening up the SpatiaLite SQL initialization file and executing + # as a script. + sql_fh = open(spatialite_sql, 'r') + try: + cur = connection.cursor() + cur.executescript(sql_fh.read()) + finally: + sql_fh.close()