Skip to content
Snippets Groups Projects
synapse_port_db 35.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • Erik Johnston's avatar
    Erik Johnston committed
    ##############################################
    
    
    
    if __name__ == "__main__":
    
        parser = argparse.ArgumentParser(
            description="A script to port an existing synapse SQLite database to"
    
        parser.add_argument("-v", action="store_true")
    
            help="The snapshot of the SQLite database file. This must not be"
    
            required=True,
            help="The database config file for the PostgreSQL database",
    
            "--curses", action="store_true", help="display a curses based progress UI"
    
            help="The number of rows to select from the SQLite table each"
    
        args = parser.parse_args()
    
    
        logging_config = {
            "level": logging.DEBUG if args.v else logging.INFO,
    
            "format": "%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s",
    
        }
    
        if args.curses:
            logging_config["filename"] = "port-synapse.log"
    
        logging.basicConfig(**logging_config)
    
    
        sqlite_config = {
            "name": "sqlite3",
            "args": {
                "database": args.sqlite_database,
                "cp_min": 1,
                "cp_max": 1,
                "check_same_thread": False,
            },
        }
    
    
        hs_config = yaml.safe_load(args.postgres_config)
    
        if "database" not in hs_config:
            sys.stderr.write("The configuration file must have a 'database' section.\n")
            sys.exit(4)
    
        postgres_config = hs_config["database"]
    
        if "name" not in postgres_config:
    
            sys.stderr.write("Malformed database config: no 'name'\n")
    
            sys.exit(2)
        if postgres_config["name"] != "psycopg2":
    
            sys.stderr.write("Database must use the 'psycopg2' connector.\n")
    
        config = HomeServerConfig()
        config.parse_config_dict(hs_config, "", "")
    
    
        def start(stdscr=None):
            if stdscr:
                progress = CursesProgress(stdscr)
            else:
                progress = TerminalProgress()
    
            porter = Porter(
                sqlite_config=sqlite_config,
                progress=progress,
                batch_size=args.batch_size,
    
            @defer.inlineCallbacks
            def run():
                with LoggingContext("synapse_port_db_run"):
                    yield defer.ensureDeferred(porter.run())
    
            reactor.callWhenRunning(run)
    
        if end_error:
            if end_error_exec_info:
                exc_type, exc_value, exc_traceback = end_error_exec_info
                traceback.print_exception(exc_type, exc_value, exc_traceback)
    
            sys.stderr.write(end_error)