Source code for pg4n.main

import sys
from functools import reduce
from typing import Optional

import pexpect

from .config_reader import ConfigReader
from .config_values import ConfigValues
from .psqlconninfo import PsqlConnInfo
from .psqlparser import PsqlParser
from .psqlwrapper import PsqlWrapper
from .semanticrouter import SemanticRouter


[docs]def main() -> None: """Initiate session by getting psql connection parameters via psql \ child process, initializing semantic analysis and wrapper modules, \ and then starting the session.""" # Configuration is ignored if there is error reading config files config_values: Optional[ConfigValues] = None try: config_reader = ConfigReader() config_values = config_reader.read() except Exception as e: config_values = None if len(sys.argv) > 1: conn_info = PsqlConnInfo( reduce(lambda x, y: x + y, sys.argv[1:], "") # concat arguments ).get() if conn_info is not None: # asterisk unpacks the 5-tuple sem_router = SemanticRouter(*conn_info, config_values) psql = PsqlWrapper( sys.argv[1].encode("utf-8"), # semantic analysis: sem_router.run_analysis, # no syntax error analysis: lambda syntax_error_analysis: "", PsqlParser(), ) psql.start() else: # Psql is not connecting to any database, # e.g. "pg4n --help" is being run. # for simplicity, just use pexpect here psql_output = pexpect.spawn( "psql " + reduce(lambda x, y: x + y, sys.argv[1:], "") ) psql_output.expect(pexpect.EOF) print(bytes.decode(psql_output.before)) else: print("pg4n [psql arguments] <database name>")
if __name__ == "__main__": main()