Форум » 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

nbatocanin: Спасибо! Проблема решается, если задания функции через hrb, все работает как надо. Я изменил server.prg (потому что нам нужна функция VolSerial), так что я сделал функцию UDF_VolSerial в server.prg и все работало должным образом. Я не знаю, почему функция UDF_ArtKol не будет работать. Функции также работать нормально при использовании так (как сказал Паша): x := Leto_UdfExist("//192.168.99.1:2807/Udf_ArtKol")

nbatocanin: Функция сервера, второй раз: [pre]FUNCTION Udf_ArtKol (nUserStru) LOCAL cLetoMagKol, cLetoArt cLetoArt := leto_Alias (nUserStru, "Artikli") cLetoMagKol := leto_Alias (nUserStru, "MagKol") SELECT (cLetoMagKol) OrdSetFocus ("Mag_AM") SELECT (cLetoArt) IF (x := Leto_TableLock (nUserStru, 1)) GO TOP WHILE !Eof() (cLetoArt)->a_mk := "ABC" SKIP END DO Leto_TableUnlock (nUserStru, 1) END IF RETURN x[/pre] Эта функция не изменяет файл ARTIKLI и возвращает NIL. Я ожидал, что результате Leto_TableLock будет T или F? Что означает вторые параметр в Leto_TableLock? Readme говорит только, что это число 1-32.

Pasha: Функция leto_TableLock - это не аналог FLock. Она предназначена для блокировки таблицы при выполнении некоторых действий, к примеру - получения уникального ключа для новой записи. См. пример использования в letoudf.prg, функция UDF_AppendRec Для ваших целей используйте функции leto_RecLock / leto_recUnlock


nbatocanin: Большое спасибо! Сейчас все работает. Я сделал функцию, которая указывает, какие записи должны быть отфильтрованы (для замены RELATION TO). Функция работает очень быстро: 110.000 записей завершено в 1,6 секунды! [pre]FUNCTION Udf_ArtKol (nUserStru, aMag, nId) LOCAL cLetoMagKol, cLetoArt, i, lImaKol LOCAL nArt, x cLetoArt := leto_Alias (nUserStru, "Artikli") cLetoMagKol := leto_Alias (nUserStru, "MagKol") SELECT (cLetoMagKol) OrdSetFocus ("Mag_AM") x := 0 SELECT (cLetoArt) GO TOP WHILE !Eof() nArt := (cLetoArt)->a_id SELECT (cLetoMagKol) lImaKol := .F. FOR i := 1 TO Len(aMag) SEEK Str(nArt,10) + Str(aMag,10) IF Found() .AND. (cLetoMagKol)->k_kol <> 0 lImaKol := .T. EXIT END IF NEXT IF Leto_RecLock (nUserStru) (cLetoArt)->a_mk := Left((cLetoArt)->a_mk,nId-1) + IIF (lImaKol, "1", " ") + SubStr((cLetoArt)->a_mk,nId+1) Leto_RecUnlock (nUserStru) x++ END IF SELECT (cLetoArt) SKIP END DO RETURN x [/pre]

nbatocanin: Я вижу, что есть функция Leto_MakeDir, но если функция Leto_RemoveDir?

sashaBG: Вот такой тест: procedure main() local _Server := '//127.0.0.1:2812/' REQUEST DBFCDX REQUEST LETO RDDSETDEFAULT( "DBFCDX" ) use ('file') new copy to ('file1') dbclosearea() RDDSETDEFAULT( "LETO" ) use (_Server+'file1') excl new zap APPEND FROM ('file') VIA "DBFCDX" go top browse() return в первое текстовое поле начинается с пробелом и все текстовые поля смещаются на один символ в право версия LetoDB последняя вроде ! 2014-11-17 17:10 UTC+0300 Pavel Tsarenko (tpe2/at/mail.ru) * source/client/leto1.c ! fixed gpf in some functions, that occured with no leto area

sashaBG: А если делаем APPEND FROM из LETODB все ОК :) procedure main() local _Server := '//127.0.0.1:2812/' REQUEST DBFCDX REQUEST LETO RDDSETDEFAULT( "LETO" ) use (_Server+'file') new copy to (_Server+'file1') browse() dbclosearea() RDDSETDEFAULT( "DBFCDX" ) use ('file1') excl new zap APPEND FROM (_Server+'file') VIA "LETO" go top browse() return

Pasha: Вопрос в том, что буфер записи leto и dbfcdx несовместим, в leto он не содержит 1-й байт deleted. Думаю, надо в leto сделать такой же формат, как и в dbfcdx

Pasha: Сделал. Теперь APPEND FROM будет работать

alkresin: Сделал небольшое исправление в server.prg, hs_createindex() - добавил строчки после IF !Empty( cBagName ): IF Empty( cTagName ) cTagName := hb_FNameName( cBagName ) ENDIF Это связано с проблемой, изложенной на [url=https://groups.google.com/forum/#!topic/harbour-users/p2f9ffWM0sk]harbour-users[/url]. Когда индекс создавался командой INDEX ON ... TO ... имя тэга было пустое, leto_addTag() его не добавлял и leto_FindTag(), соответственно, потом ничего не находил.

sashaBG: Паша ! Добавление данных в сторону Letodb опять не работает и при COPY TO и при APPEND FROM если первое поле тип C в нем все ОК но остальных нету если первое поле тип N - остаются оно и второе , а остальные Тю Тю :) **************** procedure main() local _Server := '//127.0.0.1:2812/' REQUEST DBFCDX REQUEST LETO //CDX use ('file') new VIA "DBFCDX" browse() copy to (_Server+'file_leto') VIA "LETO" dbclosearea() //LETO use (_Server+'file_leto') excl new VIA "LETO" go top browse() zap APPEND FROM ('file') VIA "DBFCDX" go top browse() return

alkresin: Да, действительно, есть проблема. Попробую разобраться.

alkresin: Исправил. Теперь должно работать.

sashaBG: Благодарю г-н Кресин ! Извиняюсь за поздний ответ ! Теперь все работает отлично ! Я высоко оцениваю Ваш труд и Пашин тоже ! И думаю, что проекту нужна какая-то финансовая подмога на его дальнейшее развитие . Ребята кто пользуются етим сервером давайте ето обсудим ! у нас в Болгарии говорят , попробую перевести ( Дружба есть дружба , но брынза стоит денег ) :)

alkresin: sashaBG пишет: Благодарю г-н Кресин ! Лучше - товарищ :). "Господа" у нас даже через 25 лет после переворота 1991г. как-то не привились.

nbatocanin: sashaBG пишет: Я высоко оцениваю Ваш труд и Пашин тоже ! И думаю, что проекту нужна какая-то финансовая подмога на его дальнейшее развитие . Ребята кто пользуются етим сервером давайте ето обсудим ! Я согласен с этим. Будет хорошо, чтобы открыть счет для помощи. Если вы хотите, я могу зарегистрировать сайт LetoDB.com?

alkresin: nbatocanin пишет: Если вы хотите, я могу зарегистрировать сайт LetoDB.com? Сайтом надо заниматься, чем-то его наполнять, регулярно обновлять, чтобы он жил. На это нужны в первую очередь человеческие ресурсы, которых не хватает. Когда Letodb появился на свет, Patrick Mast зарегистрировал letodb.org, но сайт мы так и не создали - не было времени и мотивации.

SergKis: Режим: RddInfo( RDDI_TABLETYPE, DB_DBF_VFP ) - работа с новыми полями, сервер делает все ok, а клиент нет. за основу взял test_dbf.prg из tests для CDX: [pre2] Function Main( cPath ) Local aNames := { "Petr", "Ivan", "Alexander", "Pavel", "Alexey", "Fedor", ; "Konstantin", "Vladimir", "Nikolay", "Andrey", "Dmitry", "Sergey" } Local i, aStru SET DATE FORMAT "dd/mm/yy" RDDSETDEFAULT( "DBFCDX" ) RddInfo( RDDI_TABLETYPE, DB_DBF_VFP ) cPath := 'temp' MakeDir(cPath) cPath += '\' fErase(cPath+"test1"+".dbf") dbCreate( cPath+"test1", { {"NAME" , "C", 10, 0}, ; {"NUM" , "N", 4, 0}, ; {"INFO" , "C", 32, 0}, ; {"DINFO" , "D", 8, 0}, ; {"TM" , "@", 8, 0}, ; {"TS" , "=", 8, 0}, ; {"VM" , "^", 8, 0}, ; {"ID" , "+", 4, 0} ; } ) ? "File has been created, tabletype", RddInfo( RDDI_TABLETYPE ), rddSetDefault() USE ( cPath+"test1" ) New aStru := dbStruct() ? "Fields:", Len( aStru ) FOR i := 1 TO Len( aStru ) ? i, padr(aStru[i,1], 10), aStru[i,2], aStru[i,3], aStru[i,4], hb_FieldType( i ) NEXT ? 'Press any key ...' inkey(0) FOR i := 1 TO Len( aNames ) APPEND BLANK REPLACE NUM WITH i+1000 dbSkip(0) // modify VM, sets ID, sets TS REPLACE NAME WITH aNames[ i ], ; INFO WITH "This is a record number "+Ltrim(Str(i)), ; DINFO WITH Date()+i-1 dbSkip(0) // modify VM ? str(RecNo(),3), NAME, NUM, TM, TS, str(VM,5), str(ID,5) NEXT ? "Records has been added" inkey(0) dbCloseArea() Return [/pre2] для LETO: [pre2] Function Main( cPath ) Local aNames := { "Petr", "Ivan", "Alexander", "Pavel", "Alexey", "Fedor", ; "Konstantin", "Vladimir", "Nikolay", "Andrey", "Dmitry", "Sergey" } Local i, aStru SET DATE FORMAT "dd/mm/yy" RDDSETDEFAULT( "LETO" ) cPath := "//127.0.0.1:2812/temp/" leto_fErase(cPath+"test1"+".dbf") dbCreate( cPath+"test1", { {"NAME" , "C", 10, 0}, ; {"NUM" , "N", 4, 0}, ; {"INFO" , "C", 32, 0}, ; {"DINFO" , "D", 8, 0}, ; {"TM" , "@", 8, 0}, ; {"TS" , "=", 8, 0}, ; {"VM" , "^", 8, 0}, ; {"ID" , "+", 4, 0} ; } ) ? "File has been created, tabletype", RddInfo( RDDI_TABLETYPE ), rddSetDefault() USE ( cPath+"test1" ) New aStru := dbStruct() ? "Fields:", Len( aStru ) FOR i := 1 TO Len( aStru ) ? i, padr(aStru[i,1], 10), aStru[i,2], aStru[i,3], aStru[i,4], hb_FieldType( i ) NEXT ? 'Press any key ...' inkey(0) FOR i := 1 TO Len( aNames ) APPEND BLANK REPLACE NUM WITH i+1000 dbSkip(0) // modify VM, sets ID, sets TS REPLACE NAME WITH aNames[ i ], ; INFO WITH "This is a record number "+Ltrim(Str(i)), ; DINFO WITH Date()+i-1 dbSkip(0) // modify VM ? str(RecNo(),3), NAME, NUM, TM, TS, VM, ID NEXT ? "Records has been added" inkey(0) dbCloseArea() Return [/pre2] в LETO: - типы T, @ превращаются в = - пустое поле типа = не заполняется значением TimeStamp - значения VM и ID не отображаются, видим NIL или я что то не так делаю ?

SergKis: PS сервер делает все ok для полей типа ^ и +

SergKis: смотрю в сервере отключены триггера - это специально или нарочно ? [pre2] PROCEDURE StartServer() PUBLIC oApp := HApp():New() REQUEST DBFNTX REQUEST DBFCDX #ifdef __BM REQUEST BMDBFNTX REQUEST BMDBFCDX #endif WrLog( "Leto DB Server has been started." ) leto_InitSet() leto_CreateData() leto_HrbLoad() IF ! leto_Server( oApp:nPort, oApp:nTimeOut ) #if __HARBOUR__ > 0x020100 WrLog( "Socket error " + hb_socketErrorString() ) #else WrLog( "Socket error " ) #endif ENDIF WrLog( "Server has been closed." ) // !!!!!!! уже конец работы IF ! EMPTY( oApp:cTrigger ) HB_RddInfo( RDDI_TRIGGER, oApp:cTrigger, leto_Driver( oApp:nDriver ) ) ENDIF IF ! EMPTY( oApp:cPendingTrigger ) HB_RddInfo( RDDI_PENDINGTRIGGER, oApp:cPendingTrigger, leto_Driver( oApp:nDriver ) ) ENDIF RETURN [/pre2]



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