Форум » LetoDB, HbNetio. » Leto DB Server (продолжение 9) » Ответить

Leto DB Server (продолжение 9)

Dima: Продолжаем тут

Ответов - 301, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All

alkresin: Павел, а зачем leto_writelog() урезали ?

Pasha: Там было 2 ветки: одна через функции hb_fs*, другая - через hb_fopen Первая ветка выполняет все, что нужно. Тогда зачем нужна вторая ? Только лишний модуль цепляется.

alkresin: Вторая ветка нужна для того, чтобы реализовать синтаксис, как в printf, например: leto_writelog( NULL, 0, "Name: %s Number: %d\r\n", szFile, iNum ); Это часто бывает очень удобно - вся нужная информация одной строчкой кода.


Pasha: Верну

Pasha: А как сделать dll из letocl.c ? Прицепить к проекту src\vm\maindllh.c, и добавить префикс для экспортируемых функций ? А надо предусмотреть и создание so-библиотеки для *nix

Pasha: Я в своих программах использую вызов hb_iperrorcode, для диагностики ошибок коннекта с сервером. Сейчас этой функции нет. Может быть, на клиенте стоит добавить модуль вроде такого: hbiph.c #include "hbapi.h" int hb_iperrorcode( void ); HB_FUNC( HB_IPERRORCODE ) { hb_retni( hb_iperrorcode( ) ); } HB_FUNC( HB_IPERRORDESC ) { hb_retc( strerror( hb_iperrorcode( ) ) ); } Тогда переменная errorDesc из hbip.c получается не нужна, ее можно будет убрать.

Pasha: Для LetoMemoRead нужен еще параметр - размер файла (для возможности передачи файлов, содержащих нулевой байт): char * LetoMemoRead( LETOCONNECTION * pConnection, char * szFile, unsigned long * ulLen ) И у меня что-то сваливается leto_MemoRead, размер файла десятки килобайт. Пока ищу причину.

alkresin: Pasha пишет: А как сделать dll из letocl.c ? Прицепить к проекту src\vm\maindllh.c, и добавить префикс для экспортируемых функций ? Еще не думал на эту тему. Наверное, просто поставить соответствующую опцию линкера. Maindllh.c тут, скорее всего, не нужен. Я в своих программах использую вызов hb_iperrorcode, для диагностики ошибок коннекта с сервером. Сейчас этой функции нет. Может быть, на клиенте стоит добавить модуль вроде такого: Да, стоит. Для LetoMemoRead нужен еще параметр - размер файла (для возможности передачи файлов, содержащих нулевой байт): Добавлю.

Pasha: Кажется, я понял причину падения leto_MemoRead. Падение происходит на файлах размером больше 16К В leto_Recv() в этом случае вызывается realloc для перевыделения памяти s_szBuffer. А ниже стоит вызов iRet = hb_ipRecv( hSocket, ptr, lMsgLen ); У меня в рабочей программе падение есть, а в тестах - нет. После вызова realloc адрес в s_szBuffer может измениться, а может остаться прежним. Если он изменился, то ptr указывает на уже освобожденный участок памяти, и в результате происходит крэш.

alkresin: Да, вполне вероятно, с realloc бывают такие неприятности. Я вставил там ptr = s_szBuffer; после realloc - теперь, может, заработает. Заодно и часть функций по работе с dbf через C client сделал - пока, правда, ходить по таблице еще нельзя.

Pasha: Да, теперь работает Думается, со временем из LETOAREA в LETOTABLE перекочует все, кроме area, pTable и lpdbPendingRel

alkresin: Да, наверное, по мере необходимости.

Pasha: Есть предложение переименовать несколько функций: LetoIsFileExist --> LetoFileExist LetoMakeDir --> LetoDirMake для выполнения соответствия LetoFile* / LetoDir* и LetoDbOpen --> LetoDbOpenTable LetoDbClose --> LetoDbCloseTable так как еще будут функции Open/Close Index

alkresin: Согласен.

alkresin: Павел, не могли бы вы пояснить мне строчки 1230-1239 из leto1.c, letoSeek(): if( pArea->area.dbfi.itmCobExpr != NULL && !pArea->area.dbfi.fOptimized ) { if( SELF_SKIPFILTER( ( AREAP ) pArea, ( bFindLast ? -1 : 1 ) ) == SUCCESS ) { PHB_ITEM pItem = leto_KeyEval( pArea, pTagInfo ); if( itmCompare( pItem, pKey, FALSE ) != 0 && ! bSoftSeek ) SELF_GOTO( ( AREAP ) pArea, 0 ); } }

Pasha: Если фильтр не оптимизирован, то надо сделать seek на сервере, и затем отработать фильтр на клиенте с проверкой ключа.

alkresin: А что это за поля в LETOTAGINFO - uiFCount и puiFields ? Они инициализируются, но нигде не используются.

Pasha: Я планирую в дальнейшем их использовать, поэтому и добавил. Сейчас при обновлении записи сбрасывается skip-буфер. Но, если обновляются неиндексные поля, его можно не сбрасывать, а использовать и далее, только пометить данную запись как измененную. Порядок записей в текущем ордере ведь не изменился. Это позволило бы существенно оптимизировать циклы вроде dbEval, while ! eof(), в которых выполняется обновление данных.

alkresin: Ну что ж, выделение С клиента для letodb в значительной мере сделано - можно ходить по базе ( go, skip, filter, seek ), добавлять и менять записи. Еще надо кое-что доделать и почистить, но основная часть готова.

Andrey: alkresin пишет: но основная часть готова Не смотря на праздники - работа идет !



полная версия страницы