Esempio n. 1
0
    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
Esempio n. 2
0
    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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
    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)
Esempio n. 6
0
    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
Esempio n. 7
0
    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
Esempio n. 8
0
    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)
Esempio n. 9
0
    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