home *** CD-ROM | disk | FTP | other *** search
- # Mimic the sqlite3 console shell's .dump command
- # Author: Paul Kippes <kippesp@gmail.com>
-
- def _iterdump(connection):
- """
- Returns an iterator to the dump of the database in an SQL text format.
-
- Used to produce an SQL dump of the database. Useful to save an in-memory
- database for later restoration. This function should not be called
- directly but instead called from the Connection method, iterdump().
- """
-
- cu = connection.cursor()
- yield('BEGIN TRANSACTION;')
-
- # sqlite_master table contains the SQL CREATE statements for the database.
- q = """
- SELECT name, type, sql
- FROM sqlite_master
- WHERE sql NOT NULL AND
- type == 'table'
- """
- schema_res = cu.execute(q)
- for table_name, type, sql in schema_res.fetchall():
- if table_name == 'sqlite_sequence':
- yield('DELETE FROM sqlite_sequence;')
- elif table_name == 'sqlite_stat1':
- yield('ANALYZE sqlite_master;')
- elif table_name.startswith('sqlite_'):
- continue
- # NOTE: Virtual table support not implemented
- #elif sql.startswith('CREATE VIRTUAL TABLE'):
- # qtable = table_name.replace("'", "''")
- # yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\
- # "VALUES('table','%s','%s',0,'%s');" %
- # qtable,
- # qtable,
- # sql.replace("''"))
- else:
- yield('%s;' % sql)
-
- # Build the insert statement for each row of the current table
- res = cu.execute("PRAGMA table_info('%s')" % table_name)
- column_names = [str(table_info[1]) for table_info in res.fetchall()]
- q = "SELECT 'INSERT INTO \"%(tbl_name)s\" VALUES("
- q += ",".join(["'||quote(" + col + ")||'" for col in column_names])
- q += ")' FROM '%(tbl_name)s'"
- query_res = cu.execute(q % {'tbl_name': table_name})
- for row in query_res:
- yield("%s;" % row[0])
-
- # Now when the type is 'index', 'trigger', or 'view'
- q = """
- SELECT name, type, sql
- FROM sqlite_master
- WHERE sql NOT NULL AND
- type IN ('index', 'trigger', 'view')
- """
- schema_res = cu.execute(q)
- for name, type, sql in schema_res.fetchall():
- yield('%s;' % sql)
-
- yield('COMMIT;')
-