2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# Mimic the sqlite3 console shell's .dump command
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# Author: Paul Kippes <kippesp@gmail.com>
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								# Every identifier in sql is quoted based on a comment in sqlite
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# documentation "SQLite adds new keywords from time to time when it
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# takes on new features. So to prevent your code from being broken by
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# future enhancements, you should normally quote any identifier that
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								# is an English language word, even if you do not have to."
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								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 = """
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        SELECT "name", "type", "sql"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        FROM "sqlite_master"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            WHERE "sql" NOT NULL AND
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            "type" == 'table'
							 | 
						
					
						
							
								
									
										
										
										
											2013-01-10 11:04:09 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            ORDER BY "name"
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        """
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    schema_res = cu.execute(q)
							 | 
						
					
						
							
								
									
										
										
										
											2013-01-10 11:04:09 -05:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								    for table_name, type, sql in schema_res.fetchall():
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        if table_name == 'sqlite_sequence':
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            yield('DELETE FROM "sqlite_sequence";')
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        elif table_name == 'sqlite_stat1':
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            yield('ANALYZE "sqlite_master";')
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        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)"\
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        #        "VALUES('table','{0}','{0}',0,'{1}');".format(
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        #        qtable,
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        #        sql.replace("''")))
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        else:
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            yield('{0};'.format(sql))
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        # Build the insert statement for each row of the current table
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        table_name_ident = table_name.replace('"', '""')
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident))
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        column_names = [str(table_info[1]) for table_info in res.fetchall()]
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format(
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            table_name_ident,
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names))
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        query_res = cu.execute(q)
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        for row in query_res:
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								            yield("{0};".format(row[0]))
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    # Now when the type is 'index', 'trigger', or 'view'
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    q = """
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        SELECT "name", "type", "sql"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        FROM "sqlite_master"
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            WHERE "sql" NOT NULL AND
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								            "type" IN ('index', 'trigger', 'view')
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								        """
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    schema_res = cu.execute(q)
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    for name, type, sql in schema_res.fetchall():
							 | 
						
					
						
							
								
									
										
										
										
											2012-02-12 21:05:31 +02:00
										 
									 
								 
							 | 
							
								
									
										
									
								
							 | 
							
								
							 | 
							
							
								        yield('{0};'.format(sql))
							 | 
						
					
						
							
								
									
										
										
										
											2008-03-29 00:41:18 +00:00
										 
									 
								 
							 | 
							
								
							 | 
							
								
							 | 
							
							
								
							 | 
						
					
						
							| 
								
							 | 
							
								
							 | 
							
								
							 | 
							
							
								    yield('COMMIT;')
							 |