Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис   
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Страницы: <<12345678>>
Страница: 2 из 8
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 03, February, 2014 07:37

Цитата:
amironov73
Взглянуть бы на запись. И неплохо бы знать версию сервера/клиента.

Считываете любую запись из демонстрационной базы IBIS по её MFN, и затем попробуйте вызвать для неё метод FormatRecord("@", record). Он вернёт "". Версия сервера/клиента, думаю, не имеет значения, у меня такой же эффект возникал что сейчас на демо-версии 2013.1, что пару лет назад при работе с IRBIS64_CLIENT.DLL.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 03, February, 2014 15:23

amironov73 написал(а):
-------------------------------------------------------
>
> На данный момент никаких идей, как сделать
> индикацию занятости элегантно, не порушив
> совместимость с вышеперечисленными системами, нет.
> Предлагайте варианты – включим в клиент.
> smiling smiley
>

Может, имеет смысл реализовать отдельную версию библиотеки для десктопных приложений, основанную не на прямом вызове функций сервера, а на вызове соответствующих им функций IRBIS64_CLIENT.DLL? Ведь там вроде совпадают сигнатуры функций.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 13, February, 2014 08:36

Новая версия библиотеки. Что было сделано:

1. Исправлена очень важная ошибка, из-за которой записи, считанные с помощью метода SearchRead получались «немодифицируемыми» (сервер отвергал их при попытке сохранить). Теперь они должны сохраняться без проблем.

2. Добавлена автоматическая индикация длительных запросов в виде окошка со столь любимым пользователями сообщением «Подождите». Соответствующая функциональность вынесена в сборку IrbisUI (чтобы не захламлять основную сборку). Пример применения:
using ManagedClient;
using IrbisUI;

using (ManagedClient64 client = new ManagedClient64())
using (new IrbisBusyManager(client))
{
  ...
  client.Connect();
  ...
  // Выполняем какой-то длительный запрос
  // Окно «Подождите» появится и исчезнет автоматически
  IrbisRecord[] records = client.SearchRead("A=Пушкин$");
}
Если запрос к серверу недостаточно длительный, окно не появляется.

3. Появилась возможность массового чтения и массового сохранения записей, см. классы BatchRecordReader и RecordBuffer. Должно быть удобно при написании собственных расширенных глобальных корректировок.

4. Для любителей авантюр: появилась экспериментальная возможность чтения записей напрямую из базы. Обратите внимание: только чтение! Возможность модифицировать базу напрямую не предусмотрена! Если кто-нибудь проверит работоспособность на своих базах, буду благодарен.

5. Улучшена совместимость с «древними» версиями ИРБИС-сервера, вплоть до 2005.

6. Появилась документация (см. файл Manual.docx в архиве). Пока она находится в процессе создания и «причёсывания», и её объём невелик – 40 страниц. Если обнаружите ошибки, неточности, неясности – сообщайте.

Вложения: ManagedIrbis.7z (828.2KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 13, February, 2014 08:38

Спасибо. Ваша библиотека очень полезная

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 13, February, 2014 08:42

S-presso написал:
-------------------------------------------------------
> Считываете любую запись из демонстрационной базы
> IBIS по её MFN, и затем попробуйте вызвать для неё
> метод FormatRecord("@", record). Он вернёт "".

Это сервер возвращает пустую строку для формата "@". Есть два выхода: 1) просить авторов ИРБИС исправить ошибку, 2)реализовывать собственную логику оптимизации форматов. Оба пути весьма тернисты. smiling smiley

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 13, February, 2014 08:46

S-presso написал:
-------------------------------------------------------
> Может, имеет смысл реализовать отдельную версию
> библиотеки для десктопных приложений, основанную
> не на прямом вызове функций сервера, а на вызове
> соответствующих им функций IRBIS64_CLIENT.DLL?
> Ведь там вроде совпадают сигнатуры функций.

Сделана отдельная сборка IrbisUI на платформе WinForms, в которой есть класс IrbisBusyManager. Он умеет отслеживать изменение флага Busy, и если флаг поднят слишком долго, появляется окно «Подождите».

Кнопка «Прервать» пока не работает, т. к. сокеты клиента ещё не переведены в неблокирующий режим.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 13, February, 2014 09:04

Пример простого последовательного считывания записей из базы напрямую:
string path = @"C:\Irbis64\Datai\IBIS\IBIS";
using (IrbisDirectReader reader = new IrbisDirectReader(path, true))
{
  int maxMfn = reader.GetMaxMfn();
  Console.WriteLine("MAX MFN={0}", maxMfn);

  for (int mfn = 1; mfn < maxMfn; mfn++)
  {
    try
    {
      IrbisRecord record = reader.ReadRecord(mfn);
      if (record == null)
      {
        Console.WriteLine("MFN {0,7} DELETED", mfn);
      }
      Console.WriteLine(record);
    }
    catch (Exception ex)
    {
       Console.WriteLine("Ошибка: {0}", ex.Message);
    }
    Console.WriteLine(new string('-', 60));
  }
}

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 13, February, 2014 09:09

Пример простого поиска напрямую в базе:
string path = @"C:\Irbis64\Datai\IBIS\IBIS";
string key = "K=БЕТОН$";
using (IrbisDirectReader reader = new IrbisDirectReader(path, true))
{
  IrbisRecord[] records = reader.SearchReadSimple(key);
  foreach (IrbisRecord record in records)
  {
    Console.WriteLine(record);
    Console.WriteLine(new string('-',60));
  }
}

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 13, February, 2014 09:13

Пример получения всех версий записи с указанным MFN:
string path = @"C:\Irbis64\Datai\IBIS\IBIS";
using (IrbisDirectReader reader = new IrbisDirectReader(path, true))
{
  IrbisRecord[] versions = reader.ReadAllRecordVersions(1);
  foreach (IrbisRecord version in versions)
  {
    Console.WriteLine(record);
    Console.WriteLine(new string('-',60));
  }
}

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 17, February, 2014 12:33

У меня пара предложений по функционалу библиотеки.

1. Сделать Configuration объектом. Пусть client.Configuration.ToString() возвращает полную конфигурацию клиента, как происходит сейчас, а за отдельные параметры конфигурации будут отвечать различные свойства, например:

Configuration.DBListFile - хранит имя файла со списком баз данных клиента, записанное в конфигурации после DBNNAMECAT=;

Configuration.PftOptFile - хранит имя оптимизированного файла показа клиента, записанное в конфигурации после PftOpt=.

Чтобы не считывать все параметры конфигурации каждый раз при подключении клиента, можно было бы вызывать для этого метод типа client.Configuration.ReadParams().


2.
amironov73 написал(а):
-------------------------------------------------------
>
> Это сервер возвращает пустую строку для формата
> "@". Есть два выхода: 1) просить авторов ИРБИС
> исправить ошибку, 2)реализовывать собственную
> логику оптимизации форматов. Оба пути весьма
> тернисты. smiling smiley

Я делаю так. 1. Считываю значение параметра PftOptFile из текста конфигурации клиента. 2. Читаю содержимое файла с именем PftOptFile:
formatInfo = new FormatInfo();
GetOptInfo(PftOptFile, formatInfo);
3. Каждый раз при необходимости показать запись в оптимизированном формате выполняю такой код:
//string desc = client.FormatRecord("@", record);
int index;
String text = getOptFile(record, formatInfo, out index); // index здесь не используется
text = client.FormatRecord("@" + text, record);

Соответственно, предлагаю ввести такую модификацию в реализацию функции FormatRecord библиотеки ManagedIrbis:

...
if (format == "@" /* и версия сервера ниже той, когда разработчики наконец исправят ошибку */)
{
   int index;
   format += getOptFile(record, formatInfo, out index);
}
...

Структуры и методы для работы с PFT-файлами прилагаются (хотя Вы, безусловно, сделаете всё лучше и грамотнее smiling smiley):

    public struct FormatItems
    {
        public String docType;
        public String pftFilename;
    };    

    public class FormatInfo
    {
        public int fieldId;
        public int docTypeMaxLen;
        public FormatItems[] formatItems;
    };

        public int GetOptInfo(String optFileName, FormatInfo formatInfo)
        {
            int formatItemsCount;
            int index;
            String txtLine;
            try
            {
                string answer = client.ReadTextFile(IrbisPath.Data, dbCurrent.Name + "\\" + optFileName);
                String[] OptBuffer = answer.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
                //formatInfo = new FormatInfo();
                formatInfo.fieldId = Convert.ToInt32(OptBuffer[0]);
                formatInfo.docTypeMaxLen = Convert.ToInt32(OptBuffer[1]);
                formatItemsCount = OptBuffer.Length - 3;
                formatInfo.formatItems = new FormatItems[formatItemsCount];
                for (int i = 0; i < formatItemsCount; i++)
                {
                    txtLine = OptBuffer[i + 2];
                    index = txtLine.IndexOf(' ');
                    if (index == -1)
                        break;
                    formatInfo.formatItems[i].docType = txtLine.Substring(0, index);
                    while (txtLine[index] == ' ') index++;
                    formatInfo.formatItems[i].pftFilename = txtLine.Substring(index);
                }
                return formatItemsCount;

            }
            catch (IrbisException ex)
            {
                return ex.ErrorCode;
            }
        }

        private bool IsEqual(String str1, String str2, int count)
        {
            int index = str2.IndexOf('+');
            if (index == -1)
                return str1 == str2;

            if (index < count)
            {
                bool result;
                if (index != 0)
                    result = str1.Substring(0, index) == str2.Substring(0, index);
                else
                    result = true;

                if (!result)
                    return false;

                while (index < count && index < str1.Length && index < str2.Length)
                {
                    if (str2[index] != '+')
                    {
                        if (str1[index] != str2[index])
                            return false;
                    }
                    index++;
                }

                return (index < count && (index == str2.Length || index >= str1.Length));
            }
            else
                return false;
        }

        private string getOptFile(IrbisRecord record, FormatInfo formatInfo, out int index)
        {
            String text = record.FM(formatInfo.fieldId.ToString());

            index = -1;
            if (formatInfo.formatItems != null && text != null)
            {
                index = 0;
                foreach (FormatItems formatItem in formatInfo.formatItems)
                {
                    if (IsEqual(text, formatItem.docType, formatInfo.docTypeMaxLen))
                    {
                        text = formatItem.pftFilename;
                        break;
                    }
                    index++;
                }
            }
            return text;
        }

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 17, February, 2014 13:26

S-presso написал(а):
-------------------------------------------------------
> У меня пара предложений по функционалу
> библиотеки.
>
> 1. Сделать Configuration объектом. Пусть
> client.Configuration.ToString() возвращает полную
> конфигурацию клиента, как происходит сейчас, а за
> отдельные параметры конфигурации будут отвечать
> различные свойства, например:
...

Да, я думал сопоставить [наиболее важным] настройкам поля объекта IniFile Settings или аналогичного, просто руки пока не дошли, потому что хотелось добавить отслеживание изменившихся параметров с последующей отсылкой их на сервер (как это делает штатный клиент).

> Я делаю так. 1. Считываю значение параметра
> PftOptFile из текста конфигурации клиента. 2.
> Читаю содержимое файла с именем PftOptFile:
...

Ага, похожий мой код ждёт очереди на мердж в клиента smiling smiley
Надеюсь, что в следующей версии дело дойдёт и до него.

У меня встречный вопрос: насколько были бы востребованы объектные обёртки для различных полей записи, например, для 910 (сведения об экземплярах)?

Или вот сейчас в клиент была добавлена обёртка над сведениями о читателе: ФИО, категория, посещения и проч. Теперь, например, можно узнать дату последнего посещения библиотеки читателем, просто обратившись к полю LastVisitDate:
ReaderInfo reader = ReaderInfo.Parse(record);
Console.WriteLine
(
  "Последний раз был в библиотеке: {0}",
  reader.LastVisitDate
);
Стоит ли развиваться в этом направлении? Или стоит сосредоточиться на автоматическом восстановлении соединения после сбоев и подобном?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 17, February, 2014 22:15

amironov73 написал(а):
-------------------------------------------------------
>
> У меня встречный вопрос: насколько были бы
> востребованы объектные обёртки для различных полей
> записи, например, для 910 (сведения об
> экземплярах)?
>
> Стоит ли развиваться в этом направлении? Или стоит
> сосредоточиться на автоматическом восстановлении
> соединения после сбоев и подобном?

Наверное, тут всё зависит от количества и потребностей потенциальных пользователей. Конечно, чем больше будет различных фич, тем лучше, но каждому ведь не угодишь... Вот я, например, вообще хочу создать на базе этой библиотеки более-менее полноценный АРМ с поддержкой скриптов в части редактирования текста записей, в котором можно будет навешивать обработчики, написанные на сценарном языке, либо на отдельные поля, либо на любое поле, либо вообще генерировать создание новых записей из фрагментов готового текста (например, для ретроконверсии). Библиотека автоматизации с помощью JavaScript у Вас уже используется, осталось реализовать свои собственные средства взаимодействия с объектами программы.

А функции для получения всех вкладок таблички со строками полей записи в зависимости от её рабочего листа, как в Каталогизаторе, у Вас случайно не планируется? А то у меня есть работающий вариант кода, можно было бы включить в библиотеку.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 17, February, 2014 23:28

S-presso написал(а):
-------------------------------------------------------
> А функции для получения всех вкладок таблички со
> строками полей записи в зависимости от её рабочего
> листа, как в Каталогизаторе, у Вас случайно не
> планируется? А то у меня есть работающий вариант
> кода, можно было бы включить в библиотеку.

Честно говоря, не очень понял, что Вы называете «табличкой со строками полей записи»…

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 18, February, 2014 07:11

Под табличкой я подразумеваю внешнее отображение текущего рабочего листа, хотя на самом деле там несколько табличек, по одной на каждую вкладку с именами "Дублетность", "Коды", "Основное БО" и т.д. Насколько я помню, как и для оптимизированного формата показа, у каждого подключённого клиента имеется параметр в виде имени PFT-файла, в котором каждому виду рабочего листа соответствует свой файл с расширением WS. Эти файлы содержат наборы вкладок рабочего листа, каждой из которых соответствуют строки отображаемой таблицы (точнее, полные наборы параметров для каждого из полей записи), причём они могут обращаться к другим WS-файлам со своими наборами вкладок. Моя функция разбирает содержимое WS-файла и рекурсивно вызывает саму себя, когда встречает в файле обращение к другому WS-файлу. Вот я и подумал, что неплохо было бы, если такая функция будет присутствовать в сборке библиотеки и возвращать коллекцию вкладок рабочего листа, в каждую из которых вложена коллекция полей со своими параметрами. А также требуется функция обработки WSS-файла, содержащего все параметры для подполей данного поля.

Безусловно, моя реализация соответствующих методов является неполной и не учитывает всех параметров, но по крайней мере позволяет сопоставить свой DataTable каждой из вкладок с гридом, а для каждой из строк таблицы, кроме её названия, получить ещё и нужный тип ячейки (простое текстовое поле, текстовое поле с кнопкой для вызова подполей, поле со списком значений). Хорошо бы отделить формальное описание этих структур от их конкретного внешнего представления, вынеся всё это в отдельный класс библиотеки для работы с рабочими листами (Worksheet). Для этого Вы могли бы использовать мою заготовку (если, конечно, у Вас ещё нет собственной реализации этой логики).

Ещё хотелось бы видеть методы для получения наборов параметров для различных поисковых терминов. Цель - получать на выходе готовые DataSource для раскрывающихся списков . Каждый поисковый термин должен быть представлен структурой, включающей имя термина ("Ключевые слова", "Автор", "Тематический рубрикатор", "Заглавие/название", ... - для Workstation.Cataloger, для Reader - свои), соответствующий ему поисковый запрос ("K=", "A=", "T="...) и набор конкретных полей, по которым происходит поиск. А в идеале - должен был бы присутствовать ещё и парсер поисковых запросов, к которому будет обращаться метод, модифицирующий запись, проходясь по всем нужным полям и изменяя их текстовое значение согласно выбранной маске. Свою реализацию парсера и функций поиска/замены в тексте полей я набросал, для простых поисковых запросов, включающих "K=", "A=" и "T=" найденные термины в оптимизированном представлении записи уже подсвечиваются, но не учитывается то, что в зависимости от вида рабочего листа записи соответствующие термины могут присутствовать в различных полях.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Jakonda (IP-адрес скрыт)
Дата: 06, March, 2014 10:01

Добрый день! Подскажите, пожалуйста, когда планируется сделать поддержку работы с MNU?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 06, March, 2014 12:54

Jakonda написал(а):
-------------------------------------------------------
> Добрый день! Подскажите, пожалуйста, когда
> планируется сделать поддержку работы с MNU?

А что Вы подразумеваете под «поддержкой работы с MNU»?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Jakonda (IP-адрес скрыт)
Дата: 07, March, 2014 04:28

Позволяет ли ManagedClient записывать файлы на сервер. Т.е. есть ли метод наподобе WriteTextFile?

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 07, March, 2014 04:46

Jakonda написал(а):
-------------------------------------------------------
> Позволяет ли ManagedClient записывать файлы на
> сервер. Т.е. есть ли метод наподобе WriteTextFile?

Нет, подобный функционал в ManagedClient не реализован.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: prokushev (IP-адрес скрыт)
Дата: 07, March, 2014 06:17

amironov73 написал(а):
-------------------------------------------------------
> Jakonda написал(а):
> --------------------------------------------------
> -----
> > Позволяет ли ManagedClient записывать файлы на
> > сервер. Т.е. есть ли метод наподобе
> WriteTextFile?
>
> Нет, подобный функционал в ManagedClient не
> реализован.

А планируется? Судя по описанию, такой функционал TCP/IP сервер предоставляет.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 31, March, 2014 23:58

Вниманию сообщества ирбисоводов представляется инновационная экспериментальная разработка. На базе широко известного фреймворка ManagedIrbis разработаны три инновационных программных продукта:

1. TCP/IP-сервер, полностью совместимый с ИРБИС64 2013.1.
2. АРМ «Читатель»
3. АРМ «Каталогизатор»

Так как программы написаны на полностью портабельном коде, они работоспособны в среде Windows, Linux, Windows Phone, MacOS, iPhone, iPad и iPod. Ведутся работы по портированию на Android и Nokia 1100 (модель с монохромным экраном и фонариком).

Все три продукта 100% совместимы с оригинальными разработками ГПНТБ России и могут полностью заменить их, при этом имеют следующие дополнительные возможности:

1. Голосовое управление АРМ. Теперь вы можете не только вводить библиографическое описание с клавиатуры, но и диктовать его! Доступен также голосовой поиск с расширенными командами «Отменить поиск! Уже не надо!» и «Что ты там долго возишься?». В последний момент в релиз была добавлена голосовая команда «Что за фигня!?» производящая повторный поиск с повышенным коэффициентом релевантности результатов.

2. Вывод на печать списков литературы не только на бумагу, но и на стикеры, кружки и футболки, что, как мы надеемся, порадует читателей-студентов. Согласитесь, список литературы на футболке гораздо труднее потерять по дороге в библиотеку!

3. АРМ «Каталогизатор» снабжён обучающим модулем, облегчающим освоение АРМ молодыми сотрудниками. В лёгкой игровой форме каталогизатор осваивает этапы создания библиографического описания. Так, например, заполнение вкладки «Дублетность» реализовано в виде «Тетриса» (правильно заполненные строки «сгорают»), а на вкладке «Систематизация» – известные «Братья Марио» с элементами квеста при заполнении индекса ББК.

Описанные продукты распространяются бесплатно, обновления к ним также предоставляются бесплатно. Учитывая полную совместимость с оригинальными АРМ, с сегодняшнего дня отпадает необходимость в платной подписке на обновления ИРБИС у ГПНТБ России.

Прилагаемый архив содержит перечисленные программные продукты и исходный код – проект для Microsoft Visual Studio 2008, а также краткую инструкцию. В архив включены только исполняемые файлы. Базы данных и «обвязку» к ним (форматы и рабочие листы) предлагается взять от установленной у вас версии ИРБИС64.

Вложения: ManagedAll.rar (622.2KB)  
Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Куделя (IP-адрес скрыт)
Дата: 01, April, 2014 02:58

Отличная новость. Попробовали - ВСЁ РАБОТАЕТ! ;)

Иркутская ОГУНБ
ИРБИС64.21Турбо
WebИРБИС-PHP



Редактировано 1 раз. Последний раз 01.04.2014 03:10 пользователем Куделя.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: Дунаевская (IP-адрес скрыт)
Дата: 01, April, 2014 10:27

Подтверждаю.
Отличная идея и реализация.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 01, April, 2014 12:06

Как стало известно из достоверных источников, новый CEO Microsoft Сатья Наделла решил-таки окончательно "похоронить" классические нативные Windows-приложения, отказавшись от их поддержки в грядущей Windows 9. Как выразился Наделла, "незачем тянуть это убогое наследие Win32 в новый информационный век". Впрочем, потенциальным пользователям новой версии операционной системы волноваться не о чем: для всех желающих будет открыта платная ежемесячная подписка на Metro-приложение Classic Windows, позволяющее запускать на выделенном сервере в облаке все классические приложения, в число которых входит и ИРБИС64. В связи с этим уже планируется переориентировать библиотечные организации на облачные вычисления.

Кроме того, в связи с отказом Microsoft от стратегии приоритетного выпуска программных продуктов для Windows, ознаменованным выходом пакета Office для iPad, в скором времени будет выпущена специальная версия iRBIS 64s, рассчитанная на данную платформу.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: ochagova (IP-адрес скрыт)
Дата: 02, April, 2014 06:25

Хорошая шутка. Порадовали.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 17, September, 2014 07:07

Здравствуйте.

Я обнаружил еще одну неточность в библиотеке. Метод ManagedClient64.GetMaxMfn() выдает число, на единицу большее, чем реальное количество записей в БД.

Версия библиотеки от 11.01.2014 (размер файла 106 496 байт).

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: S-presso (IP-адрес скрыт)
Дата: 17, September, 2014 09:59

А это, скорее всего, не баг, а фича. Выдаётся тот Mfn, который должен быть присвоен новой записи. Например, если БД пуста, функция должна вернуть 1.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 17, September, 2014 15:38

artgonch написал(а):
-------------------------------------------------------
> Я обнаружил еще одну неточность в библиотеке.
> Метод ManagedClient64.GetMaxMfn() выдает число, на
> единицу большее, чем реальное количество записей в БД.

Метод выдаёт то значение, которое возвращает сервер. А он, в полном соответствии с документацией, сообщает MaxMfn+1, где MaxMfn – максимальный номер записи в базе данных.

См. документацию: http://sntnarciss.ru/irbis/spravka/wtcp007005030.htm

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 20, September, 2014 18:37

А вот у меня почему-то не работает метод модификации запись WriteRecord(). В объекта ManagedClient64 установлен MFN записи, которую я перед этим прочитал и модифицировал, в объекте IrbisRecord тоже стоит MFN прочитанной записи. А вот обновления записи в БД не происходит, хотя метод никакие исключения не выбрасывает. Ставлю в объекте IrbisRecord поле Mfn в 0, и в БД появляется новая запись. Версия ManagedClient.dll от 11.011.14 (размер файла 106 496 байт).

Все получилось.



Редактировано 2 раз. Последний раз 21.09.2014 08:02 пользователем artgonch.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: amironov73 (IP-адрес скрыт)
Дата: 21, September, 2014 08:24

artgonch написал(а):
-------------------------------------------------------
> А вот у меня почему-то не работает метод
> модификации запись WriteRecord(). В объекта
> ManagedClient64 установлен MFN записи, которую я
> перед этим прочитал и модифицировал, в объекте
> IrbisRecord тоже стоит MFN прочитанной записи. А
> вот обновления записи в БД не происходит, хотя
> метод никакие исключения не выбрасывает. Ставлю в
> объекте IrbisRecord поле Mfn в 0, и в БД
> появляется новая запись.

Судя по всему, у Вас происходит конфликт версий записи: сервер ожидает один номер версии записи, Вы посылаете запись с другим номером версии. Такое происходило в старой библиотеке, потому что она не умела отслеживать номера версий.

Возьмите обновлённую библиотеку по адресу https://www.assembla.com/spaces/arsmagna/documents, она умеет автоматически отслеживать версии записи и модификации, вносимые в запись autoin.gbl.

Re: Клиентская библиотека ИРБИС64 на языке C#
Пользователь: artgonch (IP-адрес скрыт)
Дата: 29, December, 2014 06:41

Здравствуйте.

С наступающим.

Решил я реализовать клиентскую библиотеку на Java. Методом проб и ошибок изучаю протокол обмена между клиентом и сервером. Сразу же видны неточности в документации.

Вот с какой принципиальной проблемой я столкнулся:
1. В пакете, отсылаемом на сервер, первые несколько байтов (дол символа с кодом 10) - это длина последующего пакета в байтах. Я формирую пакет, получаю его длину и отсылаю в два приема на сервер. С этим все в порядке.
2. В исходящем от сервера пакете длина не указана. Посему неясно, какого размера буфер выделять.

Вот исходный код из Вашей библиотеки:
        private string _Receive
            (
                bool cp1251
            )
        {
            byte[] buffer = _client.GetStream().ReadToEnd();

            if (AllowHexadecimalDump
                 && (DebugWriter != null))
            {
                DebugWriter.WriteLine("Received:");
                Utilities.DumpBytes(DebugWriter, buffer, 0, buffer.Length);
            }

            string result = _Encoding(cp1251)
                .GetString
                (
                    buffer,
                    0,
                    buffer.Length
                );

            return result;
        }

Но в реализации сетевых потоков в Java нет такого метода (ReeadToEnd). И я подозреваю, что в .NET реализован не лучшим образом...

Страницы: <<12345678>>
Страница: 2 из 8


Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.