annotate Lib/sqlite3/dump.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 2cdb599172ab
children 2a417ad8bfbf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
1 # Mimic the sqlite3 console shell's .dump command
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
2 # Author: Paul Kippes <kippesp@gmail.com>
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
3
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
4 # Every identifier in sql is quoted based on a comment in sqlite
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
5 # documentation "SQLite adds new keywords from time to time when it
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
6 # takes on new features. So to prevent your code from being broken by
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
7 # future enhancements, you should normally quote any identifier that
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
8 # is an English language word, even if you do not have to."
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
9
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
10 def _iterdump(connection):
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
11 """
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
12 Returns an iterator to the dump of the database in an SQL text format.
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
13
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
14 Used to produce an SQL dump of the database. Useful to save an in-memory
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
15 database for later restoration. This function should not be called
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
16 directly but instead called from the Connection method, iterdump().
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
17 """
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
18
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
19 cu = connection.cursor()
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
20 yield('BEGIN TRANSACTION;')
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
21
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
22 # sqlite_master table contains the SQL CREATE statements for the database.
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
23 q = """
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
24 SELECT "name", "type", "sql"
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
25 FROM "sqlite_master"
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
26 WHERE "sql" NOT NULL AND
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
27 "type" == 'table'
81367
2cdb599172ab #15545: fix sqlite3.iterdump regression on unsortable row_factory objects.
R David Murray <rdmurray@bitdance.com>
parents: 74891
diff changeset
28 ORDER BY "name"
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
29 """
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
30 schema_res = cu.execute(q)
81367
2cdb599172ab #15545: fix sqlite3.iterdump regression on unsortable row_factory objects.
R David Murray <rdmurray@bitdance.com>
parents: 74891
diff changeset
31 for table_name, type, sql in schema_res.fetchall():
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
32 if table_name == 'sqlite_sequence':
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
33 yield('DELETE FROM "sqlite_sequence";')
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
34 elif table_name == 'sqlite_stat1':
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
35 yield('ANALYZE "sqlite_master";')
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
36 elif table_name.startswith('sqlite_'):
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
37 continue
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
38 # NOTE: Virtual table support not implemented
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
39 #elif sql.startswith('CREATE VIRTUAL TABLE'):
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
40 # qtable = table_name.replace("'", "''")
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
41 # yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
42 # "VALUES('table','{0}','{0}',0,'{1}');".format(
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
43 # qtable,
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
44 # sql.replace("''")))
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
45 else:
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
46 yield('{0};'.format(sql))
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
47
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
48 # Build the insert statement for each row of the current table
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
49 table_name_ident = table_name.replace('"', '""')
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
50 res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident))
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
51 column_names = [str(table_info[1]) for table_info in res.fetchall()]
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
52 q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format(
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
53 table_name_ident,
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
54 ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names))
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
55 query_res = cu.execute(q)
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
56 for row in query_res:
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
57 yield("{0};".format(row[0]))
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
58
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
59 # Now when the type is 'index', 'trigger', or 'view'
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
60 q = """
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
61 SELECT "name", "type", "sql"
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
62 FROM "sqlite_master"
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
63 WHERE "sql" NOT NULL AND
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
64 "type" IN ('index', 'trigger', 'view')
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
65 """
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
66 schema_res = cu.execute(q)
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
67 for name, type, sql in schema_res.fetchall():
74891
60aa7dacb605 Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes
Petri Lehtinen <petri@digip.org>
parents: 46176
diff changeset
68 yield('{0};'.format(sql))
46176
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
69
872abed7d069 Added missing files for new iterdump method.
Gerhard Häring <gh@ghaering.de>
parents:
diff changeset
70 yield('COMMIT;')