def setUp(self):
     mock_server = Server(utils.MockPGServerConnection())
     db = Database(mock_server, mock_server.maintenance_db_name)
     mock_server._child_objects[
         Database.__name__] = self._as_node_collection([db])
     mock_server._search_path = self._as_node_collection([MYSCHEMA])
     self.schema1 = Schema(mock_server, db, MYSCHEMA)
     self.schema2 = Schema(mock_server, db, MYSCHEMA2)
     db._schemas = self._as_node_collection([self.schema1, self.schema2])
     self.mock_server = mock_server
     self.executor: MetadataExecutor = MetadataExecutor(mock_server)
def refresh_casing(completer: PGCompleter or MySQLCompleter,
                   metadata_executor: MetadataExecutor):
    casing_file = completer.casing_file
    if not casing_file:
        return
    generate_casing_file = completer.generate_casing_file
    if generate_casing_file and not os.path.isfile(casing_file):
        casing_prefs = '\n'.join(metadata_executor.casing())
        with open(casing_file, 'w') as f:
            f.write(casing_prefs)
    if os.path.isfile(casing_file):
        with open(casing_file, 'r') as f:
            completer.extend_casing([line.strip() for line in f])
    def _bg_refresh(self, callbacks, history=None, settings=None):
        settings = settings or {}
        completer: PGCompleter or MySQLCompleter = COMPLETER_MAP[
            self.connection._provider_name](smart_completion=True,
                                            settings=settings)

        self.server.refresh()
        metadata_executor = MetadataExecutor(self.server)

        # If callbacks is a single function then push it into a list.
        if callable(callbacks):
            callbacks = [callbacks]

        try:
            while True:
                for do_refresh in self.refreshers.values():
                    do_refresh(completer, metadata_executor)
                    if self._restart_refresh.is_set():
                        self._restart_refresh.clear()
                        break
                else:
                    # Break out of while loop if the for loop finishes natually
                    # without hitting the break statement.
                    break

                # Start over the refresh from the beginning if the for loop hit the
                # break statement.
                continue

            # Load history into completer so it can learn user preferences
            n_recent = 100
            if history:
                for recent in history[-n_recent:]:
                    completer.extend_query_history(recent, is_init=True)

        except Exception as e:
            if self.logger:
                self.logger.exception('Error during metadata refresh: {0}', e)

        for callback in callbacks:
            callback(completer)

        if self._restart_refresh.is_set():
            self._restart_refresh.clear()
    def test_tables(self):
        # Given 2 tables in the database
        expected_table_tuples = []
        for x in range(0, 3):
            s1_table_name = 's1_t%s' % x
            s2_table_name = 's2_t%s' % x
            expected_table_tuples.append(
                tuple([self.schema1.name, s1_table_name]))
            expected_table_tuples.append(
                tuple([self.schema2.name, s2_table_name]))

        cursor = MockCursor(expected_table_tuples)
        mock_server = Server(utils.MockPGServerConnection(cursor))
        executor: MetadataExecutor = MetadataExecutor(mock_server)
        # When I query tables
        actual_table_tuples = executor.tables()

        # I expect to get 2 tables from the executor
        self.assertEqual(len(expected_table_tuples), len(actual_table_tuples))
        for expected in expected_table_tuples:
            self.assertTrue(expected in actual_table_tuples)
def refresh_functions(completer: PGCompleter or MySQLCompleter,
                      metadata_executor: MetadataExecutor):
    completer.extend_functions(metadata_executor.functions())
def refresh_databases(completer: PGCompleter or MySQLCompleter,
                      metadata_executor: MetadataExecutor):
    completer.extend_database_names(metadata_executor.databases())
def refresh_views(completer: PGCompleter or MySQLCompleter,
                  metadata_executor: MetadataExecutor):
    completer.extend_relations(metadata_executor.views(), kind='views')
    completer.extend_columns(metadata_executor.view_columns(), kind='views')
def refresh_tables(completer: PGCompleter or MySQLCompleter,
                   metadata_executor: MetadataExecutor):
    completer.extend_relations(metadata_executor.tables(), kind='tables')
    completer.extend_columns(metadata_executor.table_columns(), kind='tables')
    completer.extend_foreignkeys(metadata_executor.foreignkeys())
def refresh_schemata(completer: PGCompleter or MySQLCompleter,
                     metadata_executor: MetadataExecutor):
    completer.set_search_path(metadata_executor.search_path())
    completer.extend_schemata(metadata_executor.schemata())