Artifact
2dfa71b19000414862a7ff5b5a713c288e4054f3:
- File
sqlite1c/SQL_DBF/longstrreader.cpp
— part of check-in
[8916a4c40e]
at
2008-11-18 08:54:41
on branch trunk
—
- Сделано принудительное округление чисел при типизации :Число, тк получатели
результата (кроме ТаблицыЗначений) сами этого не делают.
- Исправлена работа типизации при обработке NULL значений, тк получатели
результата (кроме ТаблицыЗначений) сами этого не делают.
- Изменена логика работы с Begin/EndReadSequnce. В немонопольном режиме падение
производительности, зато не падает.
- Добавлен метод SQLiteQuery::ОбработатьТекстЗапроса
- Добавлено свойство SQLiteQuery::ВыполнятьВТранзакции
- Исправлена ошибка программы при подключении таблиц шапки документа, не имеющего
реквизитов шапки.
- Исправлена ошибка при выборке из таблиц 1С, иногда могущая привести к зависанию
программы.
- Добавлено подключение таблиц ЖурналовРасчетов ДБФ версии 1С.
- Исправлена укладка списка объектов при наличии иерархии - неверно укладывались
объекты, содержащие в идентификаторе русские буквы (распределенка с русским
префиксом ИБ).
- Добавлен объект SQLiteDataProvider - поставщик данных табличного поля 1С++ для
таблиц sqlite и таблиц 1С DBF-версии.
(user:
orefkov
size: 1269)
// longstrreader.cpp
#include "StdAfx.h"
#include "longstrreader.h"
struct key : CKeyObj
{
key(CIndex *pI) : CKeyObj(pI, 0, 0){}
virtual void PrepareKey()
{
m_pStoreObj->FX_String(0, (char*)pFieldID, 4, 1);
m_pStoreObj->FX_String(1, (char*)pObjID, 9, 1);
m_pStoreObj->FX_String(2, " 0", 4, 1);
}
DWORD* pFieldID;
const char* pObjID;
};
void LongStrReader::ReadStr(LPCSTR pRecordBufer, DWORD mdCharID, CString& val)
{
key k(store.pIndex);
k.pFieldID = &mdCharID;
k.pObjID = pRecordBufer;
if(store.Goto(&k, ccE, 0))
{
LPCSTR ptr = pReadBuf + 17;
DWORD size = 0;
for(;;)
{
DWORD s = static_cast<DWORD>(static_cast<BYTE>(*ptr++));
if(s >= '0' && s <= '9')
size = size * 16 + s - '0';
else if(s != ' ')
size = size * 16 + s -'a' + 10;
else
break;
}
LPSTR pWrite = val.GetBufferSetLength(size);
if(size <= 71)
memcpy(pWrite, pReadBuf + 17 + 9, size);
else
{
memcpy(pWrite, pReadBuf + 17 + 9, 71);
pWrite += 71;
size -= 71;
ptr = pReadBuf + 17;
do
{
store.Goto(navNext, 0);
int copy = size < 80 ? size : 80;
memcpy(pWrite, ptr, copy);
pWrite += copy;
size -= copy;
}while(size);
}
}
else
val.Empty();
}