72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
import os
 | 
						|
import sqlite3
 | 
						|
import subprocess
 | 
						|
 | 
						|
 | 
						|
def from_sql(path, sql):
 | 
						|
    """
 | 
						|
    Creates an SQLite db and executes the passed sql statements on it.
 | 
						|
 | 
						|
    :param path: the path to the created db file
 | 
						|
    :param sql: the sql statements to execute on the newly created db
 | 
						|
    """
 | 
						|
 | 
						|
    connection = sqlite3.connect(path)
 | 
						|
    cursor = connection.cursor()
 | 
						|
    cursor.executescript(sql)
 | 
						|
    connection.commit()
 | 
						|
    connection.close()
 | 
						|
 | 
						|
 | 
						|
def to_sql(database):
 | 
						|
    """
 | 
						|
    Returns a string containing the sql export of the database. Used for
 | 
						|
    debugging.
 | 
						|
 | 
						|
    :param database: either the path to the SQLite db file or an open
 | 
						|
                     connection to it
 | 
						|
    :return: a string representing the sql export of the database
 | 
						|
    """
 | 
						|
 | 
						|
    if type(database) == str:
 | 
						|
        connection = sqlite3.connect(database)
 | 
						|
    else:
 | 
						|
        connection = database
 | 
						|
 | 
						|
    res = '\n'.join(connection.iterdump())
 | 
						|
 | 
						|
    if type(database) == str:
 | 
						|
        connection.close()
 | 
						|
 | 
						|
    return res
 | 
						|
 | 
						|
 | 
						|
def diff(left_db_path, right_db_path):
 | 
						|
    """
 | 
						|
    Uses the sqldiff cli tool to compare two sqlite files for equality.
 | 
						|
    Returns True if the databases differ, False if they don't.
 | 
						|
 | 
						|
    :param left_db_path: path to the left db file
 | 
						|
    :param right_db_path: path to the right db file
 | 
						|
    :return: True if the specified databases differ, False else
 | 
						|
    """
 | 
						|
 | 
						|
    command = ["sqldiff", left_db_path, right_db_path]
 | 
						|
 | 
						|
    child_process = subprocess.Popen(command,
 | 
						|
                                     shell=False,
 | 
						|
                                     stdout=subprocess.PIPE)
 | 
						|
    stdout, stderr = child_process.communicate()
 | 
						|
    exit_code = child_process.returncode
 | 
						|
 | 
						|
    if exit_code != 0 or stderr is not None:
 | 
						|
        raise RuntimeError("Command {} encountered an error, exit "
 | 
						|
                           "code: {}, stderr: {}"
 | 
						|
                           .format(" ".join(command),
 | 
						|
                                   exit_code,
 | 
						|
                                   stderr))
 | 
						|
 | 
						|
    # Any output from sqldiff means the databases differ.
 | 
						|
        return stdout != ""
 |