# HG changeset patch # User Radek Brich # Date 1323184853 -3600 # Node ID 73f0d53fef6b12b7df34161b31be6af9519e2cc2 # Parent e526ca146fa9eae63455c7e3a510a7dd8a149be4 PgManager: Do not add NullHandler to logger. Rewrite get_instance(). ToolBase: fix prepare_conns() method. diff -r e526ca146fa9 -r 73f0d53fef6b pgtoolkit/pgmanager.py --- a/pgtoolkit/pgmanager.py Sun Nov 27 17:02:42 2011 +0100 +++ b/pgtoolkit/pgmanager.py Tue Dec 06 16:20:53 2011 +0100 @@ -81,6 +81,9 @@ from psycopg2 import DatabaseError, IntegrityError, OperationalError +log = logging.getLogger("pgmanager") + + class PgManagerError(Exception): pass @@ -351,26 +354,13 @@ raise PgManagerError('Unknown isolation level name: "%s"', level) return level - -try: - NullHandler = logging.NullHandler -except AttributeError: - class NullHandler(logging.Handler): - def emit(self, record): - pass - - -log = logging.getLogger("pgmanager") -log.addHandler(NullHandler()) - - -instance = None + @classmethod + def get_instance(cls): + if not hasattr(cls, '_instance'): + cls._instance = cls() + return cls._instance def get_instance(): - global instance - if instance is None: - instance = PgManager() - return instance + return PgManager.get_instance() - diff -r e526ca146fa9 -r 73f0d53fef6b pgtoolkit/toolbase.py --- a/pgtoolkit/toolbase.py Sun Nov 27 17:02:42 2011 +0100 +++ b/pgtoolkit/toolbase.py Tue Dec 06 16:20:53 2011 +0100 @@ -6,6 +6,10 @@ from pgtoolkit.highlight import highlight +class ConnectionInfoNotFound(Exception): + pass + + class ToolBase: def __init__(self, name, desc): self.parser = argparse.ArgumentParser(description=desc) @@ -19,11 +23,12 @@ self.pgm = pgmanager.get_instance() - def init(self): + def init(self, *args): self.config.load('pgtoolkit.conf') self.args = self.parser.parse_args() self.init_logging() - + self.prepare_conns(*args) + def init_logging(self): # logging handler = logging.StreamHandler() @@ -41,32 +46,43 @@ logger = logging.getLogger('pgmanager') logger.addHandler(handler) - def buildconn(self, name, lookup_name): + def prepare_conn_from_metadb(self, name, lookup_name): + '''Create connection in pgmanager using meta DB. + + name -- Name for connection in pgmanager. + lookup_name -- Name of connection in meta DB. + + ''' with self.pgm.cursor('meta') as curs: curs.execute(self.config.meta_query, [lookup_name]) row = curs.fetchone_dict() curs.connection.commit() - - if not row: - raise Exception('Unknown database "%s"' % lookup_name) - - self.pgm.create_conn(name=name, **row) + if row: + self.pgm.create_conn(name=name, **row) + return True - def prepareconns(self, *pgm_names): - # use meta db + def prepare_conn_from_config(self, name, lookup_name): + '''Create connection in pgmanager using info in config.databases.''' + if self.config.databases: + if lookup_name in self.config.databases: + dsn = self.config.databases[lookup_name] + self.pgm.create_conn(name=name, dsn=dsn) + return True + + def prepare_conns(self, *pgm_names): if self.config.meta_db: self.pgm.create_conn(name='meta', dsn=self.config.meta_db) - for name in pgm_names: - lookup_name = self.args.__dict__[name] - self.buildconn(name, lookup_name) - self.pgm.close_conn('meta') + + for name in pgm_names: + lookup_name = self.args.__dict__[name] + found = self.prepare_conn_from_config(name, lookup_name) + if not found and self.config.meta_db: + found = self.prepare_conn_from_metadb(name, lookup_name) + if not found: + raise ConnectionInfoNotFound('Connection name "%s" not found in config nor in meta DB.' % lookup_name) - # use config dict 'databases' - if self.config.databases: - for name in pgm_names: - lookup_name = self.args.__dict__[name] - dsn = self.config.databases[lookup_name] - self.pgm.create_conn(name=name, dsn=dsn) + if self.config.meta_db: + self.pgm.close_conn('meta') class SimpleTool(ToolBase): @@ -75,8 +91,7 @@ self.parser.add_argument('target', metavar='target', type=str, help='Target database') def init(self): - ToolBase.init(self) - self.prepareconns('target') + ToolBase.init(self, 'target') class SrcDstTool(ToolBase): @@ -86,6 +101,5 @@ self.parser.add_argument('dst', metavar='destination', type=str, help='Destination database') def init(self): - ToolBase.init(self) - self.prepareconns('src', 'dst') + ToolBase.init(self, 'src', 'dst')