Автор | Сообщение |
|
| |
Пост N: 2728
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.03.13 11:27. Заголовок: Leto DB Server (продолжение 10) (продолжение)
Продолжаем тут
|
|
|
Ответов - 191
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 506
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.15 00:10. Заголовок: alkresin, Pasha, а м..
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 не заданы - ставить дату времемя сервера таким образом можно отслеживаить менялясь таблица или нет без открытия оной
|
|
|
|
| Администратор
|
Пост N: 3248
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.03.15 12:22. Заголовок: Andrey пишет: Как м..
Andrey пишет: цитата: | Как можно отловить перезагрузку и работоспособность сервера LetoDB ? Т.е. при обращениях к ЛетоДБ как проверять, доступен он или нет (инет упал, сервер перегрузился и т.д.) - как обрабатывать ошибки ? |
| Можно после вызова leto_Conntct (или без него, соединение автоматически будет установлено при первом вызове команды use) опрашивать сервер вызовом функции LETO_MGGETINFO. Если ответ получен - значит, сервер работает, если нет - упал, тогда надо пробовать переконнектиться. Конечно, letodb не рассчитан на нестабильное соединение. Если работать с ним в таком режиме, то надо обязательно для любых изменений БД использовать транзакции.
|
|
|
|
| Администратор
|
Пост N: 3249
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.03.15 12:27. Заголовок: SergKis пишет: а мо..
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.
|
|
|
|
| |
Пост N: 4579
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.15 15:17. Заголовок: SergKis Можно ведь ..
SergKis Можно ведь сделать по аналогии Pasha пишет: (из прошлой темы) цитата: | В source\server\server.prg надо добавить функцию: FUNCTION leto_VolSerial( nUserStru ) RETURN VolSerial() линковать сервер с hbct.lib Вызов с клиента: leto_UDF("leto_VolSerial") Тоже самое можно сделать с mac-адресом, надо только найти такую функцию в харборе. Только в сырцы letodb я это включать не хочу, все-таки другая специфика. |
|
|
|
|
|
| постоянный участник
|
Пост N: 507
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.15 15:18. Заголовок: Pasha пишет:Поэтому ..
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 ... конечно добавить такой функционал в свою версию - это будет, я подумал может еще кому такое надо - потому и предложил
|
|
|
|
| постоянный участник
|
Пост N: 508
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.03.15 15:26. Заголовок: Dima пишет:Можно вед..
Dima пишет: цитата: | Можно ведь сделать по аналогии |
| мас адрес и VolSerial никакого отношения к таблице сервера не имеют, я говорю о работе с конкретной таблицой и ее данными
|
|
|
|
| |
Пост N: 4580
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.03.15 15:36. Заголовок: SergKis Да согласен..
SergKis Да согласен.
|
|
|
|
| постоянный участник
|
Пост N: 4044
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.03.15 23:41. Заголовок: Pasha пишет: опраши..
Pasha пишет: цитата: | опрашивать сервер вызовом функции LETO_MGGETINFO. Если ответ получен - значит, сервер работает, если нет - упал, тогда надо пробовать переконнектиться. |
| Спасибо, я про это и спрашивал !
|
|
|
|
| постоянный участник
|
Пост N: 4067
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.15 03:01. Заголовок: Всем доброй ночи......
Всем доброй ночи.... Пробовать новое получается только по ночам... Начал пробовать 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 и скопировать записи с сервера, к себе на комп в локальную базу ?
|
|
|
|
| |
Пост N: 101
Зарегистрирован: 23.06.08
|
|
Отправлено: 28.03.15 03:46. Заголовок: Здравствуйте! Пытаюс..
Здравствуйте! Пытаюсь собрать LetoDB 2.09 под Harbour 3.0.0 (Rev. 16951) на CentOS release 6.5 (Final). Harbour 3.0.0 собрался прекрасно, никаких ошибок нет. LetoDB вроде тоже нормально собирается, но на стадии линковки выдаёт следующую ошибку: [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 С путями вроде всё нормально, файл /apps/harbour/lib/linux/gcc/libhbvm.a существует. В чём может быть проблема?
|
|
|
|
| moderator
|
Пост N: 873
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 09:52. Заголовок: Andrey пишет: Устан..
Andrey пишет: цитата: | Установил на сервер в инете, попытался 4000 записей сразу создать, результат 8 минут |
| Естественно, это же 4000 обращений к серверу и 4000 ответов. Оформите это как транзакцию, или серию транзакций по группе записей в пакете - и количество обращений туда-сюда, а, соответственно, и затраченное время в разы уменьшится. цитата: | Можно как то бегунок отражать на экране, допустим при создании базы ? |
| Отражайте, кто вам мешает ? LetoDB тут ни при чем, он предназначен только для операций с БД и не знает, какой интерфейс у вас используется ( консоль, та или иная GUI библиотека ). цитата: | а как можно создать/открыть базу на локальном компе одновременно с LetoDB и скопировать записи с сервера, к себе на комп |
| use (cRemotePath + "db1") new via LETO use (cLocalPath + "db2") new via DBFCDX append from db1
|
|
|
|
|
| moderator
|
Пост N: 874
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 09:56. Заголовок: SkyNET пишет: gcc ...
SkyNET пишет: цитата: | gcc ... -obin/letodb -L/apps/harbour/lib ... /usr/bin/ld: cannot find -lhbvm |
| Путь к библиотекам прописан: /apps/harbour/lib, а они у вас, по вашим словам, в /apps/harbour/lib/linux/gcc/libhbvm.a
|
|
|
|
| |
Пост N: 4615
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.15 11:20. Заголовок: alkresin пишет: Ест..
alkresin пишет: цитата: | Естественно, это же 4000 обращений к серверу и 4000 ответов. Оформите это как транзакцию |
| Это как ? Было к примеру. For J=1 to 4000 dbappend() Next
|
|
|
|
| постоянный участник
|
Пост N: 516
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.03.15 12:41. Заголовок: Andrey пишет: letodb..
Andrey пишет: цитата: | letodb.ini - указав DataPath=C:\LetoDB\DATA |
| мой letodb.ini : [Main] Port = 2812 DataPath = . EnableFileFunc = 1 каталог DATA создаешь сам, дальше LETO_MAKEDIR( cDirName ) загрузку примерно так делаю: Скрытый текст
... // таблица 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() ...
|
|
|
|
|
| moderator
|
Пост N: 875
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 13:03. Заголовок: Dima пишет: Это как..
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 отправляется на сервер одним пакетом.
|
|
|
|
| постоянный участник
|
Пост N: 4070
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.03.15 14:02. Заголовок: SergKis пишет: загр..
SergKis пишет: цитата: | загрузку примерно так делаю |
| alkresin пишет: цитата: | Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом. |
| Спасибо БОЛЬШОЕ !!!
|
|
|
|
| |
Пост N: 4616
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.15 14:58. Заголовок: alkresin пишет: Все..
alkresin пишет: цитата: | Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом |
| А если вот так , это оптимально будет или нет ? На других станциях юзеры не испытают проблем с этой базой ? begin transaction do While !test->(eof()) sum+=test->summa test->(dbskip()) enddo end transaction
|
|
|
|
| moderator
|
Пост N: 876
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 15:25. Заголовок: Dima пишет: А если ..
Dima пишет: цитата: | А если вот так , это оптимально будет или нет ? |
| Транзакции применяются исключительно для записи данных. После begin transaction все операции добавления/изменения накапливаются в буфере и после end transaction передаются на сервер, где и исполняются - или все, или ни одна. Операции чтения при транзакциях работают также, как и без них, так что в приведенном вами коде begin transaction, end transaction ничего не изменят.
|
|
|
|
| |
Пост N: 4617
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.15 15:30. Заголовок: alkresin Понял. Спа..
alkresin Понял. Спасибо.
|
|
|
|
| moderator
|
Пост N: 878
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 15:45. Заголовок: Для ускорения операц..
Для ускорения операций чтения возможен другой вариант: LETO_SETSKIPBUFFER( nSkip ) - установить размер буфера чтения. Если, например, вы установили его в 100 ( по умолчанию, кажется 10 ) - то при dbSkip(1), если следующей записи нет в буфере, считываются сразу 100 записей - и, соответственно, следующие 100 dbskip(1) не будут обращаться к серверу. Потом лучше, наверное, опять уменьшить буфер - если читать помногу записей без надобности, это может затормозить работу.
|
|
|
Ответов - 191
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|