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

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

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

Ответов - 191, стр: 1 2 3 4 5 6 7 8 9 10 All

SergKis: alkresin, Pasha, а можно добавить в letodb аналог функций: Local date, time // time идет с миллисекундами hb_fGetDateTime(cPath+"test1"+".dbf", @date, @time) hb_fSetDateTime(cPath+"test1"+".dbf", @date, @time) например: aDateTime := leto_fGetDateTime(cPath+"test1"+".dbf") leto_fSetDateTime(cPath+"test1"+".dbf", date, time) если data и time не заданы - ставить дату времемя сервера таким образом можно отслеживаить менялясь таблица или нет без открытия оной

Pasha: Andrey пишет: Как можно отловить перезагрузку и работоспособность сервера LetoDB ? Т.е. при обращениях к ЛетоДБ как проверять, доступен он или нет (инет упал, сервер перегрузился и т.д.) - как обрабатывать ошибки ? Можно после вызова leto_Conntct (или без него, соединение автоматически будет установлено при первом вызове команды use) опрашивать сервер вызовом функции LETO_MGGETINFO. Если ответ получен - значит, сервер работает, если нет - упал, тогда надо пробовать переконнектиться. Конечно, letodb не рассчитан на нестабильное соединение. Если работать с ним в таком режиме, то надо обязательно для любых изменений БД использовать транзакции.

Pasha: SergKis пишет: а можно добавить в letodb аналог функций: Local date, time // time идет с миллисекундами hb_fGetDateTime(cPath+"test1"+".dbf", @date, @time) hb_fSetDateTime(cPath+"test1"+".dbf", @date, @time) например: aDateTime := leto_fGetDateTime(cPath+"test1"+".dbf") leto_fSetDateTime(cPath+"test1"+".dbf", date, time) если data и time не заданы - ставить дату времемя сервера таким образом можно отслеживаить менялясь таблица или нет без открытия оной Формат dbf предусматривает только хранение даты изменения файла, но не времени. Поэтому стандартными средствами rdd это не сделаешь. Ну а нестандартными - можно создать отдельную таблицу dbf на сервере с полями: имя файла, дата и время изменения. Поскольку это нестандартное решение, то включать его в базовую функциональность letodb я смысла не вижу. Такие функции можно сделать в модуле letoudf.hrb.

Dima: SergKis Можно ведь сделать по аналогии Pasha пишет: (из прошлой темы) В source\server\server.prg надо добавить функцию: FUNCTION leto_VolSerial( nUserStru ) RETURN VolSerial() линковать сервер с hbct.lib Вызов с клиента: leto_UDF("leto_VolSerial") Тоже самое можно сделать с mac-адресом, надо только найти такую функцию в харборе. Только в сырцы letodb я это включать не хочу, все-таки другая специфика.

SergKis: Pasha пишет:Поэтому стандартными средствами rdd это не сделаешь. Вы правы, но есть стандартные средства windows, хранящие данные о времени создания файла, модификации, последненго использования (с миллисекундами) - почему не воспользоваться этим - это все без открытия файла, что несомненное преимущество по скорости в сравнении с различными таблицами. Давно использую такую методу на cdx и ntx файлах и в двух поточной старой версии letodb (с исп. триггера), конечно, есть особенности применения. Например: если Share_Tables = 1, то можно цепляться к самой таблице (dbf), dbCommit() и dbCloseArea() меняют дату, время в файле и эти изменения видны с др. клиента. если Share_Tables = 0, тогда надо использовать файл рядом с таблицей и расширением (например) .dtm (когда создаем dbCreate(...) сразу создаем рядом файл Leto_MemoWrite( cFileName+'.dtm', "for TimeStamp" )) и всегда, когда надо, делаем типа leto_fSetDateTime(cFileName+'.dtm'), с др. клиента читаем leto_fGetDateTime(cFileName+'.dtm') и сравниваем с запомненнным ранее значением ... на мой взгляд эти функции относятся к файловым как leto_fErase, leto_file, ... сколько было споров о нужности функции Leto_MemoWrite ... конечно добавить такой функционал в свою версию - это будет, я подумал может еще кому такое надо - потому и предложил

SergKis: Dima пишет:Можно ведь сделать по аналогии мас адрес и VolSerial никакого отношения к таблице сервера не имеют, я говорю о работе с конкретной таблицой и ее данными

Dima: SergKis Да согласен.

Andrey: Pasha пишет: опрашивать сервер вызовом функции LETO_MGGETINFO. Если ответ получен - значит, сервер работает, если нет - упал, тогда надо пробовать переконнектиться. Спасибо, я про это и спрашивал !

Andrey: Всем доброй ночи.... Пробовать новое получается только по ночам... Начал пробовать LetoDB+MiniGui. Еле запустил простой пример создания базы... По разному пробовал и без letodb.ini и с ним, сообщает об успехе коннекта, а базу создать не может: Error DBFCDX/1004 Create error: \DATA\test866.dbf Error DBFCDX/1004 Create error: \DATA\\127.0.0.1:2812test866.dbf Error DBFCDX/1004 Create error: \DATA\test866.dbf Error DBFCDX/1004 Create error: ..\DATA\test866.dbf Решил кардинально, через letodb.ini - указав DataPath=C:\LetoDB\DATA Установил на сервер в инете, попытался 4000 записей сразу создать, результат 8 минут и AVI-ка ожидания висит... Ладно, фиг с ней. Можно как то бегунок отражать на экране, допустим при создании базы ? Это не критично, но просто для примера, понять как можно делать. И второй вопрос, а как можно создать/открыть базу на локальном компе одновременно с LetoDB и скопировать записи с сервера, к себе на комп в локальную базу ?

SkyNET: Здравствуйте! Пытаюсь собрать LetoDB 2.09 под Harbour 3.0.0 (Rev. 16951) на CentOS release 6.5 (Final). Harbour 3.0.0 собрался прекрасно, никаких ошибок нет. LetoDB вроде тоже нормально собирается, но на стадии линковки выдаёт следующую ошибку: [pre2][root@57461-6 letodb-2.09-win]# make -f Makefile.linux gcc obj/linux/server.o obj/linux/common.o obj/linux/hbip.o obj/linux/common_c.o obj/linux/blowfish.o obj/linux/leto_2.o obj/linux/letofunc.o obj/linux/letolist.o obj/linux/letoacc.o obj/linux/letovars.o obj/linux/leto_lnx.o obj/linux/errint.o obj/linux/errorsys.o -obin/letodb -L/apps/harbour/lib -Wl,--start-group -lhbvm -lhbrtl -lhbcpage -lhblang -lhbrdd -lhbrtl -lhbmacro -lhbpp -lgtstd -lrddntx -lrddcdx -lrddfpt -lhbcommon -lhbsix -Wl,--end-group -lm -lpthread /usr/bin/ld: cannot find -lhbvm collect2: ld returned 1 exit status[/pre2] С путями вроде всё нормально, файл /apps/harbour/lib/linux/gcc/libhbvm.a существует. В чём может быть проблема?

alkresin: Andrey пишет: Установил на сервер в инете, попытался 4000 записей сразу создать, результат 8 минут Естественно, это же 4000 обращений к серверу и 4000 ответов. Оформите это как транзакцию, или серию транзакций по группе записей в пакете - и количество обращений туда-сюда, а, соответственно, и затраченное время в разы уменьшится. Можно как то бегунок отражать на экране, допустим при создании базы ? Отражайте, кто вам мешает ? LetoDB тут ни при чем, он предназначен только для операций с БД и не знает, какой интерфейс у вас используется ( консоль, та или иная GUI библиотека ). а как можно создать/открыть базу на локальном компе одновременно с LetoDB и скопировать записи с сервера, к себе на комп use (cRemotePath + "db1") new via LETO use (cLocalPath + "db2") new via DBFCDX append from db1

alkresin: SkyNET пишет: gcc ... -obin/letodb -L/apps/harbour/lib ... /usr/bin/ld: cannot find -lhbvm Путь к библиотекам прописан: /apps/harbour/lib, а они у вас, по вашим словам, в /apps/harbour/lib/linux/gcc/libhbvm.a

Dima: alkresin пишет: Естественно, это же 4000 обращений к серверу и 4000 ответов. Оформите это как транзакцию Это как ? Было к примеру. [pre2] For J=1 to 4000 dbappend() Next [/pre2]

SergKis: Andrey пишет: letodb.ini - указав DataPath=C:\LetoDB\DATA мой letodb.ini : [Main] Port = 2812 DataPath = . EnableFileFunc = 1 каталог DATA создаешь сам, дальше LETO_MAKEDIR( cDirName ) загрузку примерно так делаю:[pre2] ... // таблица LETO открыта exclusive nLenRec := ... // длина записи передаваемой на сервер nKolBuf := 500 // кол-во записей в буфере транзакции nMaxBuf := (nKolBuf+1) * nLenRec // размер буфера транзакции nKol := 0 // счетчик записей для транзакции nCnt := 0 // общий счетчик записей nDel := 0 // счетчик удаленных // текущий alias это LETO таблица leto_BeginTransaction(nMaxBuf) DO WHILE ! ( nInp )->( EOF() ) IF nKol >= nKolBuf nKol := 0 IF leto_InTransaction(); leto_CommitTransaction() ENDIF leto_BeginTransaction(nMaxBuf) ENDIF nCnt++ nKol++ dbAppend() IF ! NetErr() // из ( nInp )-> .... переносим данные Fields IF ( nInp )->( deleted() ) // на входе запись удаленная dbDelete() nDel++ ENDIF ENDIF ( nInp )->dbSkip(1) ENDDO IF leto_InTransaction(); leto_CommitTransaction() ENDIF dbCommit() ... [/pre2]

alkresin: Dima пишет: Это как ? Было к примеру. For J=1 to 4000 dbappend() Next Например, так: For J=1 to 40 begin transaction for j1 := 1 to 100 dbappend() next end transaction Next Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом.

Andrey: SergKis пишет: загрузку примерно так делаю alkresin пишет: Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом. Спасибо БОЛЬШОЕ !!!

Dima: alkresin пишет: Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом А если вот так , это оптимально будет или нет ? На других станциях юзеры не испытают проблем с этой базой ? [pre2] begin transaction do While !test->(eof()) sum+=test->summa test->(dbskip()) enddo end transaction [/pre2]

alkresin: Dima пишет: А если вот так , это оптимально будет или нет ? Транзакции применяются исключительно для записи данных. После begin transaction все операции добавления/изменения накапливаются в буфере и после end transaction передаются на сервер, где и исполняются - или все, или ни одна. Операции чтения при транзакциях работают также, как и без них, так что в приведенном вами коде begin transaction, end transaction ничего не изменят.

Dima: alkresin Понял. Спасибо.

alkresin: Для ускорения операций чтения возможен другой вариант: LETO_SETSKIPBUFFER( nSkip ) - установить размер буфера чтения. Если, например, вы установили его в 100 ( по умолчанию, кажется 10 ) - то при dbSkip(1), если следующей записи нет в буфере, считываются сразу 100 записей - и, соответственно, следующие 100 dbskip(1) не будут обращаться к серверу. Потом лучше, наверное, опять уменьшить буфер - если читать помногу записей без надобности, это может затормозить работу.



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