У меня пара предложений по функционалу библиотеки.
1. Сделать Configuration объектом. Пусть client.Configuration.ToString() возвращает полную конфигурацию клиента, как происходит сейчас, а за отдельные параметры конфигурации будут отвечать различные свойства, например:
Configuration.DBListFile - хранит имя файла со списком баз данных клиента, записанное в конфигурации после DBNNAMECAT=;
Configuration.PftOptFile - хранит имя оптимизированного файла показа клиента, записанное в конфигурации после PftOpt=.
Чтобы не считывать все параметры конфигурации каждый раз при подключении клиента, можно было бы вызывать для этого метод типа client.Configuration.ReadParams().
2.
amironov73 написал(а):
-------------------------------------------------------
>
> Это сервер возвращает пустую строку для формата
> "@". Есть два выхода: 1) просить авторов ИРБИС
> исправить ошибку, 2)реализовывать собственную
> логику оптимизации форматов. Оба пути весьма
> тернисты.
Я делаю так. 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-файлами прилагаются (хотя Вы, безусловно, сделаете всё лучше и грамотнее
):
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;
}