def list_files( self, *specification: 'Union[FileSpecification, str]', ) -> 'List[str]': """ Получение списка файлов с сервера. :param specification: Спецификация или маска имени файла (если нужны файлы, лежащие в папке текущей базы данных) :return: Список файлов """ if not self.check_connection(): return [] query = ClientQuery(self, LIST_FILES) is_ok = False for spec in specification: if isinstance(spec, str): spec = self.near_master(spec) query.ansi(str(spec)) is_ok = True result: 'List[str]' = [] if not is_ok: return result with self.execute(query) as response: lines = response.ansi_remaining_lines() lines = [line for line in lines if line] for line in lines: result.extend(one for one in irbis_to_lines(line) if one) return result
def connect(self, host: 'Optional[str]' = None, port: int = 0, username: '******' = None, password: '******' = None, database: 'Optional[str]' = None) -> IniFile: """ Подключение к серверу ИРБИС64. :return: INI-файл """ if self.connected: return self.ini_file self.host = host or self.host or throw_value_error() self.port = port or self.port or int(throw_value_error()) self.username = username or self.username or throw_value_error() self.password = password or self.password or throw_value_error() self.database = self._get_database(database) assert isinstance(self.host, str) assert isinstance(self.port, int) assert isinstance(self.username, str) assert isinstance(self.password, str) while True: self.query_id = 0 self.client_id = random.randint(100000, 999999) query = ClientQuery(self, REGISTER_CLIENT) query.ansi(self.username).ansi(self.password) with self.execute(query) as response: if response.get_return_code() == -3337: continue return self._connect(response)
def disconnect(self) -> None: """ Отключение от сервера. :return: None. """ if self.connected: query = ClientQuery(self, UNREGISTER_CLIENT) query.ansi(self.username) self.execute_forget(query) self.connected = False
async def disconnect_async(self) -> None: """ Асинхронное отключение от сервера. :return: None. """ if self.connected: query = ClientQuery(self, UNREGISTER_CLIENT) query.ansi(self.username) response = await self.execute_async(query) response.close() self.connected = False
def execute_ansi(self, *commands) -> ServerResponse: """ Простой запрос к серверу, когда все строки запроса в кодировке ANSI. :param commands: Команда и параметры запроса :return: Ответ сервера (не забыть закрыть!) """ query = ClientQuery(self, commands[0]) for line in commands[1:]: query.ansi(line) return self.execute(query)
def update_user_list(self, users: 'List[UserInfo]') -> bool: """ Обновление списка пользователей на сервере. :param users: Список пользователей :return: Признак успешности операции. """ if not self.check_connection(): return False assert isinstance(users, list) and users query = ClientQuery(self, SET_USER_LIST) for user in users: query.ansi(user.encode()) self.execute_forget(query) return True
def update_ini_file(self, lines: 'List[str]') -> bool: """ Обновление строк серверного INI-файла. :param lines: Измененные строки. :return: Признак успешности операции. """ if not self.check_connection(): return False if not lines: return True query = ClientQuery(self, UPDATE_INI_FILE) for line in lines: query.ansi(line) self.execute_forget(query) return True
def write_text_file(self, *specification: FileSpecification) -> bool: """ Сохранение текстового файла на сервере. :param specification: Спецификация (включая текст для сохранения). :return: Признак успешности операции. """ if not self.check_connection(): return False query = ClientQuery(self, READ_DOCUMENT) is_ok = False for spec in specification: assert isinstance(spec, FileSpecification) query.ansi(str(spec)) is_ok = True if not is_ok: return False return self._execute_with_bool_result(query)
async def connect_async(self) -> IniFile: """ Асинхронное подключение к серверу ИРБИС64. :return: INI-файл """ if self.connected: return self.ini_file while True: self.query_id = 0 self.client_id = random.randint(100000, 999999) query = ClientQuery(self, REGISTER_CLIENT) query.ansi(self.username).ansi(self.password) response = await self.execute_async(query) if response.get_return_code() == -3337: response.close() continue result = self._connect(response) response.close() return result