Автор | Сообщение |
|
| |
Пост 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: 478
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.02.15 11:47. Заголовок: SergKis пишет: leto ..
SergKis пишет: цитата: | leto сервер делает все ok для полей типа ^ и + - типы T, @ превращаются в = - пустое поле типа = не заполняется значением TimeStamp |
| причина в разном case: leto1.c(line 1950) case HB_FT_MODTIME: cType = '@'; break; case HB_FT_DATETIME: case HB_FT_DAYTIME: cType = 'T'; break; rdd\dbf1.c(line 3050) case HB_FT_TIMESTAMP: pThisField->bType = pArea->bTableType == DB_DBF_VFP ? 'T' : '@'; pField->uiLen = 8; pThisField->bLen = ( BYTE ) pField->uiLen; pThisField->bFieldFlags = HB_FF_BINARY; pArea->uiRecordLen += pField->uiLen; break; case HB_FT_MODTIME: pThisField->bType = '='; pField->uiLen = 8; pThisField->bLen = ( BYTE ) pField->uiLen; pArea->uiRecordLen += pField->uiLen; pArea->fModStamp = TRUE; break; т.е. в cdx типы T,@ - HB_FT_TIMESTAMP, тип = HB_FT_MODTIME, в leto другие
|
|
|
|
| постоянный участник
|
Пост N: 479
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.02.15 10:48. Заголовок: полная катавасия со ..
полная катавасия со структурой (поля типа TIMESTAMP, MODTIME): - на клиенте подаем в dbCreate ..., {"TM", "@", 8, 0}, {"TS", "=", 8, 0},... - на сервере имеем в HS_CREATETABLE (пришло с клиента) ..., {"TM", "T", 8, 0}, {"TS", "@", 8, 0},... - на сервере имеем в HS_OPENTABLE (после dbStruct)..., {"TM", "@", 8, 0}, {"TS", "@", 8, 0},... - на клиенте после dbStruct имеем ..., {"TM", "=", 8, 0}, {"TS", "=", 8, 0},... придется остатья на старой версии (двухпотчной)
|
|
|
|
| Администратор
|
Пост N: 3246
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.02.15 14:44. Заголовок: SegKis пишет: смотрю..
SegKis пишет: цитата: | смотрю в сервере отключены триггера - это специально или нарочно ? |
| Конечно, не специально, и не нарочно. Эта реализация была пропущена при реорганизации кода почти 4 года назад. Поправил.
|
|
|
|
| постоянный участник
|
Пост N: 481
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.02.15 13:20. Заголовок: Pasha добавил в ser..
Pasha добавил в server.prg: Скрытый текст
#include "hbsxdef.ch" ... leto_HrbLoad() IF ! EMPTY( oApp:cTrigger ) WrLog( "Trigger "+oApp:cTrigger+" "+_u2s(leto_Driver( oApp:nDriver )) ) HB_RddInfo( RDDI_TRIGGER, oApp:cTrigger, leto_Driver( oApp:nDriver ) ) ENDIF IF ! EMPTY( oApp:cPendingTrigger ) WrLog( "pendingTrigger "+oApp:cTrigger+" "+_u2s(leto_Driver( oApp:nDriver )) ) HB_RddInfo( RDDI_PENDINGTRIGGER, oApp:cPendingTrigger, leto_Driver( oApp:nDriver ) ) ENDIF ... /////////////////////////////////////////////////////////////////////////////// FUNCTION tst_Trigger( nEvent, nArea, nPos, xTrigVal ) LOCAL i := nEvent, j := '', k k := _u2s(nEvent)+':'+_u2s(nArea)+':'+_u2s(nPos)+':'+_u2s(xTrigVal) WrLog(procname()+':'+k) IF nEvent == EVENT_POSTUSE // 2 dbInfo(DBI_TRIGGER, .F.) j := 'EVENT_POSTUSE' k := _u2s(nEvent)+':'+j+':'+_u2s(nArea)+':'+_u2s(nPos)+':'+_u2s(xTrigVal) WrLog(procname()+':'+k) dbInfo(DBI_TRIGGER, .T.) RETURN .T. ELSEIF nEvent == EVENT_PRECLOSE // 11 dbInfo(DBI_TRIGGER, .F.) j := 'EVENT_PRECLOSE' k := _u2s(nEvent)+':'+j+':'+_u2s(nArea)+':'+_u2s(nPos)+':'+_u2s(xTrigVal) WrLog(procname()+':'+k) dbInfo(DBI_TRIGGER, .T.) RETURN .T. ELSEIF nEvent < EVENT_UPDATE .or. nEvent > EVENT_ZAP dbInfo(DBI_TRIGGER, .F.) j := 'EVENT_UPDATE-EVENT_ZAP' k := _u2s(nEvent)+':'+j+':'+_u2s(nArea)+':'+_u2s(nPos)+':'+_u2s(xTrigVal) WrLog(procname()+':'+k) dbInfo(DBI_TRIGGER, .T.) RETURN .T. ENDIF dbInfo(DBI_TRIGGER, .F.) DO CASE CASE nEvent == EVENT_UPDATE // 3 j := 'EVENT_UPDATE' CASE nEvent == EVENT_APPEND // 4 j := 'EVENT_APPEND' CASE nEvent == EVENT_DELETE // 5 j := 'EVENT_DELETE' CASE nEvent == EVENT_RECALL // 6 j := 'EVENT_RECALL' CASE nEvent == EVENT_PACK // 7 j := 'EVENT_PACK' CASE nEvent == EVENT_ZAP // 8 j := 'EVENT_ZAP' ENDCASE k := _u2s(nEvent)+':'+j+':'+_u2s(nArea)+':'+_u2s(nPos)+':'+_u2s(xTrigVal) WrLog(procname()+':'+k) * CASE nEvent == EVENT_PREUSE // 1 * CASE nEvent == EVENT_POSTUSE // 2 * CASE nEvent == EVENT_PACK // 7 * CASE nEvent == EVENT_ZAP // 8 * CASE nEvent == EVENT_PUT // 9 * CASE nEvent == EVENT_GET // 10 * CASE nEvent == EVENT_PRECLOSE // 11 * CASE nEvent == EVENT_POSTCLOSE // 12 * CASE nEvent == EVENT_PREMEMOPACK // 13 * CASE nEvent == EVENT_POSTMEMOPACK // 14 dbInfo(DBI_TRIGGER, .T.) RETURN .T. /////////////////////////////////////////////////////////////////////////////// STATIC FUNCTION _u2s( uValue ) LOCAL cType := ValType( uValue ) IF cType == "L" RETURN iif( uValue, ".T.", ".F." ) ELSEIF cType == "N" RETURN AllTrim( Str( uValue ) ) ELSEIF cType == "D" RETURN Dtoc( uValue ) ELSEIF cType == "A" RETURN 'ARRAY['+AllTrim( Str( len(uValue) ) )+']' ELSEIF cType == "C" RETURN trim(uValue) ELSEIF cType == "U" RETURN 'NIL' ELSE uValue := 'VALTYPE='+cType ENDIF RETURN uValue letodb.ini: [Main] Port = 2812 DataPath = . EnableFileFunc = 1 Trigger = tst_Trigger ;PendingTrigger = tst_Trigger
| тестовая test_dbf.prg: Скрытый текст
#include "wvtwin.ch" #include "hbgtinfo.ch" #include "rddleto.ch" #include "dbinfo.ch" REQUEST HB_GT_WVT REQUEST HB_GT_WVT_DEFAULT REQUEST HB_CODEPAGE_LV866 REQUEST LETO, DBFCDX Function Main( cPath ) Local aNames := { "Petr", "Ivan", "Alexander", "Pavel", "Alexey", "Fedor", ; "Konstantin", "Vladimir", "Nikolay", "Andrey", "Dmitry", "Sergey" } Local i, aStru Local cFont Field NAME, NUM, INFO, DINFO hb_gtInfo( HB_GTI_CODEPAGE, 866) hb_setCodePage( "LV866" ) hb_setTermCP( "LV866" ) hb_GtInfo( HB_GTI_FONTNAME , cFont ) hb_gtInfo( HB_GTI_FONTQUALITY, 3 ) RDDSETDEFAULT( "LETO" ) SET DATE FORMAT "dd/mm/yy" cPath := "//127.0.0.1:2812/temp/" ? "Connect to " + cPath + " - " IF ( leto_Connect( cPath ) ) == -1 nRes := leto_Connect_Err() IF nRes == LETO_ERR_LOGIN ?? "Login failed" ELSEIF nRes == LETO_ERR_RECV ?? "Recv Error" ELSEIF nRes == LETO_ERR_SEND ?? "Send Error" ELSE ?? "No connection" ENDIF Return Nil ELSE ?? "Ok" ENDIF 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" USE ( cPath+"test1" ) New ? "File has been opened", used(), alias() 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 inkey(0) FOR i := 1 TO Len( aNames ) APPEND BLANK REPLACE NAME WITH aNames, NUM WITH i+1000, ; INFO WITH "This is a record number "+Ltrim(Str(i)), ; DINFO WITH Date()+i-1 // dbCommit() // dbGoto(RecNo()) // dbSkip(0) dbGoto(RecNo()) ? str(RecNo(), 3), NAME, NUM, TM, TS, VM, ID NEXT ? ? "Records has been added", LastRec() ? "Press any key to finish..." Inkey(0) Return Nil получаем letodb.log: 02/23/15 12:03:17: Leto DB Server has been started. Leto DB Server v.2.15 ! INIT: DataPath=., ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 02/23/15 12:03:17: Trigger tst_Trigger DBFCDX 02/23/15 12:18:09: Send STOP to server... 02/23/15 12:18:12: Server has been closed.
| т.е. триггер ставится, но работает, для PendingTrigger такой же результат.
|
|
|
|
| постоянный участник
|
Пост N: 482
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.02.15 13:24. Заголовок: PS. повторяю искажен..
PS. повторяю искаженное: FOR i := 1 TO Len( aNames ) APPEND BLANK REPLACE NAME WITH aNames[ i ], NUM WITH i+1000, ; ...
|
|
|
|
| постоянный участник
|
Пост N: 483
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.02.15 20:09. Заголовок: SergKis пишет:т.е. т..
SergKis пишет: цитата: | т.е. триггер ставится, но работает, для PendingTrigger такой же результат. |
| что то буквы съелись. Должно быть: цитата: | т.е. триггер ставится, но НЕ работает, для PendingTrigger такой же результат. |
|
|
|
|
|
| moderator
|
Пост N: 857
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.03.15 14:35. Заголовок: SergKis пишет: полн..
SergKis пишет: цитата: | полная катавасия со структурой (поля типа TIMESTAMP, MODTIME): - на клиенте подаем в dbCreate ..., {"TM", "@", 8, 0}, {"TS", "=", 8, 0},... - на сервере имеем в HS_CREATETABLE (пришло с клиента) ..., {"TM", "T", 8, 0}, {"TS", "@", 8, 0},... |
| А можно короткий тестовый пример, чтоб сразу откомпилировать и проверить ?
|
|
|
|
| постоянный участник
|
Пост N: 491
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.15 14:41. Заголовок: alkresin пишет:А мож..
|
|
|
|
| постоянный участник
|
Пост N: 492
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.15 14:59. Заголовок: alkresin letodb..pr..
alkresin letodb..prg добавил: ... hs_createtable(...) ... aStru := Array( nLen, 4 ) FOR i := 1 TO nLen aStru[i,1] := GetCmdItem( cCommand, nPos + 1, @nPos ) aStru[i,2] := GetCmdItem( cCommand, nPos + 1, @nPos ) aStru[i,3] := Val( GetCmdItem( cCommand,nPos + 1,@nPos ) ) aStru[i,4] := Val( GetCmdItem( cCommand,nPos + 1,@nPos ) ) NEXT WLog(procname()+":"+hb_valtoexp(aStru)) // добавил ... hs_opentable(...) ... // line: ~457 aStru := dbStruct() WLog(procname()+":"+hb_valtoexp(aStru)) // добавил ...
|
|
|
|
| постоянный участник
|
Пост N: 493
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.15 15:01. Заголовок: PS опять буква сълас..
PS опять буква сълась WrLog(...) добавлял
|
|
|
|
| moderator
|
Пост N: 858
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.03.15 16:49. Заголовок: Ту небольшую путаниц..
Ту небольшую путаницу я, вроде, исправил. Остается один неприятный момент с теми полями, которые формируются автоматически на сервере при добавлении записи. Поскольку на клиентской стороне работает буферизация, то если добавить запись и потом сразу прочитать, то она берется не с сервера. а из буфера - и значения тех полей пустые.
|
|
|
|
|
| постоянный участник
|
Пост N: 495
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.15 17:11. Заголовок: alkresin пишет:на кл..
alkresin пишет: цитата: | на клиентской стороне работает буферизация,... |
| как правило, сразу может понадобится поле "+" для заполнения в другую таблицу, в массив ключей, ... как осуществлять доступ ? делать dbcommit, leto_commit, закрывать\открывать таблицу ? на даты типа Timestamp и "^" запрос, как првило отложенный (могут быть в тегах индекса)
|
|
|
|
| постоянный участник
|
Пост N: 496
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.03.15 17:25. Заголовок: PS. всегда в cdx, nt..
PS. всегда в cdx, ntx, six было dbSkip(0) - перечитать\перезаполнить буфер
|
|
|
|
| постоянный участник
|
Пост N: 497
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.03.15 11:10. Заголовок: alkresin пишет:Ту не..
alkresin пишет: цитата: | Ту небольшую путаницу я, вроде, исправил. |
| Работает. Большое СПАСИБО Вместо dbSkip(0) обновляет буфер на клиенте dbGoto(RecNo())
|
|
|
|
| постоянный участник
|
Пост N: 498
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.03.15 15:34. Заголовок: SergKis пишет:Работа..
SergKis пишет: поторопился, timestamp работает, а "^" и "+" - что то не то при отображении в dbf все хорошо ? str(RecNo(), 3), NAME, str(NUM, 4), TS, VM, ID дает: Rec NAME NUM TS VM ID === ========== ==== ===================== ==================== ========== 1 Petr 1001 05/03/15 14:26:54.731 16660054396318011 1413165115 2 Ivan 1002 05/03/15 14:26:54.731 16660054396318267 1413165115 3 Alexander 1003 05/03/15 14:26:54.731 16660054396318523 943406395 4 Pavel 1004 05/03/15 14:26:54.747 16660054396318779 3878971 5 Alexey 1005 05/03/15 14:26:54.747 16660054396319035 989870896 6 Fedor 1006 05/03/15 14:26:54.747 16660054396319291 3878912 7 Konstantin 1007 05/03/15 14:26:54.762 16660054396319547 993540925 8 Vladimir 1008 05/03/15 14:26:54.762 16660054396319803 993853499 9 Nikolay 1009 05/03/15 14:26:54.762 16660054396320059 1023425280 10 Andrey 1010 05/03/15 14:26:54.778 4264973925457342779 993853440 11 Dmitry 1011 05/03/15 14:26:54.778 4264973925457408315 993853440 12 Sergey 1012 05/03/15 14:26:54.778 4264973925457473851 993853440
|
|
|
|
| moderator
|
Пост N: 860
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.03.15 09:53. Заголовок: А у меня все нормаль..
А у меня все нормально отображается. Это ведь тот ваш пример, только dbSkip(0) заменено на go Recno() ?
|
|
|
|
| moderator
|
Пост N: 861
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.03.15 10:05. Заголовок: Все ясно. Это я небо..
Все ясно. Это я небольшое исправление в серверной части не выложил на CVS - думал, оно не имеет значение, а в моем рабочеи каталоге оно осталось. Теперь выложил.
|
|
|
|
| постоянный участник
|
Пост N: 500
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.03.15 10:31. Заголовок: alkresin пишет:Тепер..
alkresin пишет: Работает. Большое СПАСИБО.
|
|
|
|
| постоянный участник
|
Пост N: 4040
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.03.15 20:57. Заголовок: Как можно отловить п..
Установил наконец то сервер на Win2012. Вроде работает. Пытаюсь дальше разбираться.... Как можно отловить перезагрузку и работоспособность сервера LetoDB ? Т.е. при обращениях к ЛетоДБ как проверять, доступен он или нет (инет упал, сервер перегрузился и т.д.) - как обрабатывать ошибки ?
|
|
|
|
| |
Пост N: 4578
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.03.15 22:11. Заголовок: Andrey пишет: Вроде..
Andrey пишет: цитата: | Установил наконец то сервер на Win2012. Вроде работает. |
| Только он глючит порой не по теме , пытались его тоже юзать , откатились на 2008. Andrey пишет: цитата: | Как можно отловить перезагрузку и работоспособность сервера LetoDB ? |
| Не читал letodb\readme_rus.txt ? Цитата Возможно проверить доступность сервера перед открытием файлов вызовом функции leto_Connect( cAddress ), которая вернет -1 в случае неудачной попытки: IF leto_Connect( "//192.168.5.22:2812/mydir/" ) == -1 Alert( "Can't connect to server ..." ) ENDIF + пункт 7.1 Управление соединением В LETODB в этом плане масса способов что бы проверить запущен ли (работает) LETODB по сравнению с ADS
|
|
|
|
| постоянный участник
|
Пост 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) не будут обращаться к серверу. Потом лучше, наверное, опять уменьшить буфер - если читать помногу записей без надобности, это может затормозить работу.
|
|
|
|
| |
Пост N: 4618
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.15 16:17. Заголовок: Я пробовал играться ..
Я пробовал играться с аналогом LETO_SETSKIPBUFFER , в ADS и особого ускорения не увидел. Пробовал руками разные значения и спец функцию........ Функция такая , для определения кол-ва кэшируемых записей Func LenReCash(als) local ret:=0 local i FOR i = 1 TO (als)->(fcount()) ret+=(als)->(FIELDSIZE(i)) NEXT ret+=4 return int((65535/ret)/5.4)
|
|
|
|
|
| moderator
|
Пост N: 879
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 17:02. Заголовок: Честно говоря, не по..
Честно говоря, не понял, как это определяет количество кэшируемых записей и что это за магические числа = 65535 и 5.4 :). Не помню уже аналог из ADS, но для LetoDB эта функция ( leto_setskipbuffer()) реально работает, если применять ее по назначению - например, увеличить буфер при последовательном чтении dbf.
|
|
|
|
| |
Пост N: 4619
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.03.15 17:17. Заголовок: alkresin пишет: Не ..
alkresin пишет: цитата: | Не помню уже аналог из ADS |
| AdsCacheRecords()
|
|
|
|
| |
Пост N: 102
Зарегистрирован: 23.06.08
|
|
Отправлено: 28.03.15 19:18. Заголовок: alkresin пишет: Пут..
alkresin пишет: цитата: | Путь к библиотекам прописан: /apps/harbour/lib, а они у вас, по вашим словам, в /apps/harbour/lib/linux/gcc/libhbvm.a |
| Спасибо, действительно, не обратил внимания. Но теперь возникла другая ошибка: 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 obj/linux/leto_2.o: In function `thread2': leto_2.c:(.text+0x79d): undefined reference to `hb_vmThreadInit' leto_2.c:(.text+0x918): undefined reference to `hb_vmThreadQuit' collect2: ld returned 1 exit status make: *** [bin/letodb] Error 1
|
|
|
|
| moderator
|
Пост N: 880
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 19:38. Заголовок: SkyNET пишет: gcc ...
SkyNET пишет: цитата: | gcc ... -obin/letodb -L/apps/harbour/lib -Wl,--start-group -lhbvm -lhbrtl ... |
| Вообще-то здесь должна быть hbvmmt, а не hbvm. Какая у вас версия letodb и где вы ее взяли ?
|
|
|
|
| moderator
|
Пост N: 881
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 19:50. Заголовок: alkresin пишет: Как..
alkresin пишет: цитата: | Какая у вас версия letodb и где вы ее взяли ? |
| Ясно, у нас там лежит для скачивания старая версия. Воспользуйтесь CVS: @echo off SET CVSROOT=:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb SET HOME=C:\CVS\ c:\cvs\cvs login c:\cvs\cvs checkout -r rel-1-mt -P letodb Или на Sourceforge вот тут: http://letodb.cvs.sourceforge.net/viewvc/letodb/letodb/?pathrev=rel-1-mt внизу страницы - Download GNU tarball
|
|
|
|
| moderator
|
Пост N: 882
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.15 20:32. Заголовок: Загрузил на Sourcefo..
Загрузил на Sourceforge letodb-2.15-src.zip - самые свежие исходники.
|
|
|
|
| |
Пост N: 103
Зарегистрирован: 23.06.08
|
|
Отправлено: 29.03.15 17:46. Заголовок: alkresin пишет: Ясн..
alkresin пишет: цитата: | Ясно, у нас там лежит для скачивания старая версия. |
| alkresin пишет: Спасибо, с новой версией собралось без проблем.
|
|
|
|
| постоянный участник
|
Пост N: 4073
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.03.15 18:12. Заголовок: alkresin пишет: Все..
alkresin пишет: цитата: | Все, что между begin transaction ... end transaction отправляется на сервер одним пакетом. |
| Что то не компилируется... Выдает ошибку: Harbour 3.2.0dev (r1503131756) Copyright (c) 1999-2015, http://harbour-project.org/ demo_letodb.prg(269) Error E0030 Syntax error "syntax error at 'TRANSACTION'" demo_letodb.prg(298) Error E0010 ENDIF does not match IF 2 errors Может в коде неправильно ставлю ? Скрытый текст bErrHandler := ErrorBlock( { | VAR | BREAK( VAR ) } ) BEGIN SEQUENCE USE ( cFileDbf2 ) Alias TEMP866 NEW VIA "DBFCDX" CODEPAGE "RU866" SHARED RECOVER MsgStop( "БАЗА (BASE)" + cFileDbf2 + " уже открыта (now open) !", "Ошибка ! Error !" ) RETURN END SEQUENCE ErrorBlock( bErrHandler ) SELECT TEMP866 aDbf := DbStruct() // создание базы 1251 / create a database 1251 cFileDbf := cPathServer + "test1251.dbf" DBCreate( cFileDbf, aDbf, "LETO" ) USE ( cFileDbf ) Alias TEMP1251 NEW VIA "LETO" CODEPAGE "RU1251" EXCLUSIVE begin transaction SELECT TEMP866 GOTO TOP DO WHILE !EOF() // считываем значение полей в массив aFieldArray := {} FOR nI := 1 TO FCOUNT() AADD( aFieldArray, FIELDGET( nI ) ) NEXT SELECT TEMP1251 APPEND BLANK FOR nI := 1 TO FCOUNT() FIELDPUT( nI, aFieldArray[ nI ] ) NEXT SELECT TEMP866 SKIP ENDDO end transaction CLOSE TEMP866 CLOSE TEMP1251
|
|
|
|
|
| постоянный участник
|
Пост N: 1039
Зарегистрирован: 27.01.07
|
|
Отправлено: 29.03.15 20:01. Заголовок: 1. REQUEST LETO не з..
1. REQUEST LETO не забыл? 2. И может на самом деле проблема в "demo_letodb.prg(298) Error E0010 ENDIF does not match IF" ?
|
|
|
|
| moderator
|
Пост N: 883
Зарегистрирован: 06.07.06
|
|
Отправлено: 29.03.15 20:04. Заголовок: Это я уже подзабыл. ..
Это я уже подзабыл. Правильно будет: LETO_BEGINTRANSACTION() ... LETO_COMMITTRANSACTION()
|
|
|
|
| постоянный участник
|
Пост N: 1040
Зарегистрирован: 27.01.07
|
|
Отправлено: 29.03.15 20:06. Заголовок: alkresin пишет: Пра..
alkresin пишет: цитата: | Правильно будет: LETO_BEGINTRANSACTION() ... LETO_COMMITTRANSACTION() |
| Да, точно. )
|
|
|
|
| постоянный участник
|
Пост N: 517
Зарегистрирован: 17.02.12
|
|
Отправлено: 29.03.15 21:04. Заголовок: Andrey а мой пример..
Andrey а мой пример не смотрел ? там же все есть, даже с буфером для транзакции (его размер по умолчанию, раньше был небольшой и при широкой записи были проблемы - буфер перевыделялся и загрузка шла долго, потом Pasha подправлял) я всегда использую буфер
|
|
|
|
| |
Пост N: 4621
Зарегистрирован: 17.05.05
|
|
Отправлено: 29.03.15 21:19. Заголовок: Andrey Заведи #comm..
Andrey Заведи #command BEGIN TRANSACTION => LETO_BEGINTRANSACTION() #command END TRANSACTION => LETO_COMMITTRANSACTION()
|
|
|
|
| постоянный участник
|
Пост N: 4074
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.03.15 22:54. Заголовок: Dima пишет: а мой п..
Dima пишет: цитата: | а мой пример не смотрел ? |
| Смотрел, просто решил маленький пример сначала сделать, а потом уж поболее делать. PSP пишет: цитата: | 1. REQUEST LETO не забыл? 2. И может на самом деле проблема в "demo_letodb.prg(298) Error E0010 ENDIF does not match IF" ? |
| 1) Стоит. 2) до этого не доходить, ошибка компиляции до этого, а эта ошибка неправильно вылазит..
|
|
|
|
| постоянный участник
|
Пост N: 4075
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.03.15 23:06. Заголовок: alkresin пишет: LET..
alkresin пишет: цитата: | LETO_BEGINTRANSACTION() ... LETO_COMMITTRANSACTION() |
| Компилирует нормально, но вылетает при работе: Error DBFCDX/1031 Синтаксическая ошибка</p><BR> Called from LETO_COMMITTRANSACTION(0) Called from CREATEDBF1251(290) Called from (b)MAIN(87) Called from _DOCONTROLEVENTPROCEDURE(1651) Called from EVENTS(1516) Called from _DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1373) Called from MAIN(125) Строка (290) - LETO_COMMITTRANSACTION()
|
|
|
|
| постоянный участник
|
Пост N: 4076
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.03.15 01:16. Заголовок: alkresin пишет: Ест..
alkresin пишет: цитата: | Естественно, это же 4000 обращений к серверу и 4000 ответов. Оформите это как транзакцию, или серию транзакций по группе записей в пакете - и количество обращений туда-сюда, а, соответственно, и затраченное время в разы уменьшится. |
| Я был не прав. Тормоза в тесте были от показа GRID'a ! Сделал правильный тест, 5000 записей (4 поля) : 1) отправка на сервер в инете (в моем городе) БЕЗ транзакций: 15 сек. 2) отправка на сервер в инете (в Москву) БЕЗ транзакций: 1 мин. 57 сек. Просто супер... Не знаю как дальше будет, если базу увеличить... Бегунок тоже сделал.... Только AVI-ка замирает при передаче... Не особенно красиво, хотя собираю с ключом -mt. Кому интересно - вот пример на МиниГуи https://cloud.mail.ru/public/0a167351289f/LetoDB-demo-MiniGui.7z
|
|
|
|
| постоянный участник
|
Пост N: 518
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 08:25. Заголовок: Andey пишет: вот при..
Andey пишет: 1. вынеси connect до окна (если его нет, то сообщение и конец) или в oninit (тогда сначала контрлы hide или disable, если connect есть переводи в рабочее соостояние, иначе сообщение ...). 2. в цикл загрузки ставь do events 3. если файл на сервере постоянный и с индексами, то делай OrdSetFocus(0), zap, загрузку, reindex, OrdSetFocus(1) 4. не мучай grid перезагрузкой Item-ов, используй browse (skipbuffer устанавливай в кол-во строк в browse (default 10)) 5. получить длину записи области RecSize()+1, или посчитать длины из dbStruct() и +1.
|
|
|
|
| moderator
|
Пост N: 884
Зарегистрирован: 06.07.06
|
|
Отправлено: 30.03.15 09:53. Заголовок: Andrey пишет: Компи..
Andrey пишет: цитата: | Компилирует нормально, но вылетает при работе: Error DBFCDX/1031 Синтаксическая ошибка</p><BR> Called from LETO_COMMITTRANSACTION(0) |
| Вставьте перед LETO_COMMITTRANSACTION(): SELECT TEMP1251 Уж не помню, почему это было сделано, но при committransaction текущей должна быть удаленная таблица.
|
|
|
|
| постоянный участник
|
Пост N: 519
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 10:15. Заголовок: Andrey пишет:Строка ..
Andrey пишет: цитата: | Строка (290) - LETO_COMMITTRANSACTION() |
| транзакция leto для областей rdd LETO, для др. rdd могут быть свои механизмы транзакций ... SELECT TEMP866 SKIP ENDDO // здесь DBFCDX !!! LETO_COMMITTRANSACTION() //end transaction alkresin пишет: цитата: | Вставьте перед LETO_COMMITTRANSACTION(): SELECT TEMP1251 |
| +1 SergKis пишет: цитата: | // текущий alias это LETO таблица - leto_BeginTransaction(nMaxBuf)... |
| просто Андрею немного внимательней надо см. примеры
|
|
|
|
| постоянный участник
|
Пост N: 4077
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.03.15 11:45. Заголовок: SergKis пишет: прос..
SergKis пишет: цитата: | просто Андрею немного внимательней надо см. примеры |
| Да это уж точно... Просто внимания уже не хватает, раньше быстрей схватывал.
|
|
|
|
| |
Пост N: 4622
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.03.15 13:59. Заголовок: Andrey Так может те..
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 07.02.13
|
|
Отправлено: 30.03.15 14:39. Заголовок: Dima пишет: Продолж..
Dima пишет: Как-то странно создано продолжение. А где начало? Открываешь тему, жмёшь на стр. 2 или 3 и остальные стр. в перечислении пропадают!
|
|
|
|
| постоянный участник
|
Пост N: 4079
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.03.15 14:49. Заголовок: marrinass пишет: От..
Dima пишет: цитата: | Andrey Так может тебе сюда уже |
| Согласен ! Нечего засорять ветку другими сообщениями... marrinass пишет: цитата: | Открываешь тему, жмёшь на стр. 2 или 3 и остальные стр. в перечислении пропадают! |
| Ага, и у меня так же...
|
|
|
|
| постоянный участник
|
Пост N: 4081
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.03.15 15:12. Заголовок: Тест, 5000 записей (..
Тест, 5000 записей (4 поля) : 1) отправка на сервер через инете (в моем городе) БЕЗ транзакций: 13 сек. отправка на сервер через инете (в моем городе) С транзакцией: 4 сек. 2) отправка на сервер через инете (сервер в Москве) БЕЗ транзакций: 2 мин. 01 сек. отправка на сервер через инете (сервер в Москве) С транзакций: 3 сек.
|
|
|
|
| |
Пост N: 217
Зарегистрирован: 03.12.08
|
|
Отправлено: 30.03.15 15:21. Заголовок: Вопрос к гуру : Е..
Вопрос к гуру : Есть - WEB-сайт . Крутится вроде на LINUX (точную версию пока не знаю) . Там есть MySQL и кой-какие базы (для сайта) работают . Хочется использовать сайт для обмена данными с программами на Harbour : Запись информации в БД на сервер , Скачивание , выборка по параметрам , и т д . Он-лайн торговля (через клиентское приложение ) Отсюда два варианта : 1) Использовать MySQL 2) Использовать LETO_DB По первому варианту - не могу понять в какую сторону рыть для начала .... По второму - видимо нужно скомпилировать LETO_DB для работы в LINUX .... опять-же - трудности с этим .... Если кто-то может дать подробную инструкцию - буду благодарен ! Сам склоняюсь к использованию LETO_DB .... :)
|
|
|
|
| постоянный участник
|
Пост N: 4083
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.03.15 15:28. Заголовок: Softlog86 пишет: По..
Softlog86 пишет: цитата: | По второму - видимо нужно скомпилировать LETO_DB для работы в LINUX .... опять-же - трудности с этим .... Если кто-то может дать подробную инструкцию - буду благодарен ! |
| http://dimao.blogspot.ru/p/blog-page.html Без точной версии LINUX собрать невозможно.
|
|
|
|
| |
Пост N: 218
Зарегистрирован: 03.12.08
|
|
Отправлено: 30.03.15 15:32. Заголовок: Версию узнаем .... В..
Версию узнаем .... Вопрос - кто соберет под нужную ОС ? : и поможет с запуском sm20: Server Type : Apache/2.2.14 (FreeBSD) PHP/5.2.12 with Suhosin-Patch mod_fcgid/2.3.5 mod_ssl/2.2.14 OpenSSL/0.9.7e-p1
|
|
|
|
| постоянный участник
|
Пост N: 520
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 16:12. Заголовок: Andrey ты просил на..
Andrey ты просил набросать. вот что то набрал (дополняй сам): Скрытый текст
STATIC lLetoConnect := .F. FUNCTION MAIN() LOCAL cTable, cAlias, nSkip, hBrowse LOCAL cFileDbf .... IF ! myConnnect() RETURN NIL ENDIF cFileDbf := cPathLocal + "test866.dbf" cTable := cPathServer+"test1251.dbf" cAlias := "TEST_1251" // ------ я выношу проверку и создание таблиц в отдельный модуль aStru := { ; { "FIO" , "C", 25, 0 }, ; { "STATUS" , "C", 10, 0 }, ; { "CLASS" , "C", 4, 0 }, ; { "ID" , "+", 4, 0 } ; } aIndex := { ; {'FIO', 'UPPER(FIO)', .F.} ; } IF ! file(cFileDbf) // ... // создаем файл cFileDbf !!! // ... ENDIF IF ! Table_Create( cTable, aStru, aIndex) MsgStop('Table not create :'+ chr(10))+cTable, 'ERROR') RETURN NIL ENDIF // ------ IF ! Table_Open(cTable, cAlias, .T.) MsgStop('Table not open :'+ chr(10))+cTable, 'ERROR') RETURN NIL ENDIF DEFINE WINDOW Form_6 ; ... @ 55, 10 BROWSE Browse_1 WIDTH 575 HEIGHT 130 ; HEADERS { '№№', 'ФИО/FIO', 'Статус/Status', 'Класс/Class' } ; WORKAREA &cAlias ; WIDTHS { 60, 280, 110, 100 } ; FIELDS {"ID", "FIO", "STATUS", "CLASS"} ; FONT "Tahoma" SIZE 10 BOLD ; BACKCOLOR aGrColor ; DYNAMICFORECOLOR { fColor , fColor, fColor, fColor } ; DYNAMICBACKCOLOR { fColor2, fColor2, fColor2, fColor2 } // ставим размер skip buffer (можно в on init это сделать) hBrowse := Form_6.Browse_1.Handle // GetControlHandle("Browse_1", ThisWindow.Name) nSkip := ListViewGetCountPerPage(hBrowse) // строк на browse ( cAlias )->( LETO_SETSKIPBUFFER( nSkip ) ) // // ... END WINDOW ... RETURN NIL /////////////////////////////////////////////////////////////////////////// FUNC myConnect() LOCAL nRes IF ( leto_Connect( cPathServer ) ) == - 1 nRes := leto_Connect_Err() IF nRes == LETO_ERR_LOGIN cMsg := "Login failed to LetoDB" ELSEIF nRes == LETO_ERR_RECV cMsg := "Recv Error to LetoDB" ELSEIF nRes == LETO_ERR_SEND cMsg := "Send Error to LetoDB" ELSE cMsg := "No connection to LetoDB" ENDIF MsgStop( cMsg , "Error" ) RETURN .F. ENDIF lLetoConnect := .T. // connect есть RETURN .T. /////////////////////////////////////////////////////////////////////////// FUNC Table_Open( cTable, cAlias, lShared ) // открываем таблицу LOCAL lRet IF ! lLetoConnect; RETURN .F. ENDIF Default lShared := .T. lRet := UseArea( cTable, cAlias, lShared, 'LETO') IF lRet .and. OrdCount() > 0 // есть индекс подключаем OrdSetFocus(1) dbGotop() ENDIF RETURN lRet /////////////////////////////////////////////////////////////////////////// FUNC Table_Create( cTable, aStru, aIndex ) // создание таблицы LOCAL lTable, cPath, cFile, cExt, cTag, cKey, lUnique, i,j,k IF ! lLetoConnect; RETURN .F. ENDIF hb_FNameSplit(cTable, @cPath, @cFile, @cExt) IF empty(cExt); cTable += '.dbf' ENDIF lTable := leto_file(cTable) IF ! lTable leto-fErase(cPath+cFile+'.cdx') dbCreate(cTable, aStru, 'LETO', .T., "") // можно задать алиас вместо "" IF hb_IsArray(aIndex) k := len(aIndex) FOR i := 1 TO k cTag := aIndex[ i ][1] // Tag Name cKey := aIndex[ i ][2] // Tag Key lUnq := aIndex[ i ][3] // Tag Unique OrdCreate( , cTag, cKey, &( "{||" + cKey + "}" ), lUnq ) NEXT ENDIF dbCloseArea() lTable := .T. ENDIF RETURN lTable FUNC Dbf_2_Table( cFileDbf, cTable, lZap ) // load dbf 866 в таблицу LOCAL nInp, nKol, nCnt, nDel, nAdd, i, k LOCAL nLenRec, nMaxBuf, nKolBuf IF ! file(cFileDbf) MsgStop('File not found !'+chr(10)+cFileDbf, "ERROR") RETURN .F. ENDIF USE ( cFileDbf ) ALIAS TEMP866 CODEPAGE "RU866" VIA "DBFCDX" //NEW SHARED IF ! Used() MsgStop('File not open !'+chr(10)+cFileDbf, "ERROR") RETURN .F. ENDIF nInp := select() IF ! Table_Open(cTable, , .T.) // exclusive ( nInp )->( dbClosearea() ) MsgStop('Table not open !'+chr(10)+cTable, "ERROR") RETURN .F. ENDIF IF OrdCount() > 0 // есть индекс отключаем OrdSetFocus(0) dbGotop() ENDIF IF ! empty(lZap) // очистим таблицу ZAP ENDIF k := fCount() - 1 // последнее поле (ID) не учитываем - заполняет rdd // таблица LETO открыта exclusive nLenRec := RecSize()+1 // длина записи передаваемой на сервер (Как считать ?) = кол-ву символов полей в БД ? nKolBuf := 1000 // кол-во записей в буфере транзакции nMaxBuf := (nKolBuf+1) * nLenRec // размер буфера транзакции nKol := 0 // счетчик записей для транзакции nCnt := 0 // общий счетчик записей nDel := 0 // счетчик удаленных nAdd := 0 // счетчик реально добавленных // текущий alias это LETO таблица - // ------ здесь уст. начальную позицию бегунка - индикатора leto_BeginTransaction(nMaxBuf) DO WHILE ! ( nInp )->( EOF() ) IF nKol >= nKolBuf nKol := 0 IF leto_InTransaction(); leto_CommitTransaction() ENDIF // ------ здесь меняем позицию бегунка - индикатора DO EVENTS // ------ leto_BeginTransaction(nMaxBuf) ENDIF nCnt++ nKol++ dbAppend() IF ! NetErr() nAdd++ FOR i := 1 TO k // из ( nInp )-> .... переносим данные Fields FieldPut( i, ( nInp )->FieldGet(i) ) NEXT IF ( nInp )->( deleted() ) // на входе запись удаленная dbDelete() nDel++ ENDIF ENDIF ( nInp )->dbSkip(1) ENDDO IF leto_InTransaction(); leto_CommitTransaction() ENDIF dbCommit() dbGotop() IF OrdCount() > 0 // есть индекс REINDEX OrdSetFocus(1) dbGotop() ENDIF ( nInp )->( dbCloseArea() ) // ------ здесь завершаем позицию бегунка - индикатора Form_6.Browse_1.Refresh RETURN .T. /////////////////////////////////////////////////////////////////////////// FUNC UseArea( cFile, cAls, lShare, cRdd, nWhl ) // Открыть таблицу или DBF LOCAL w := 10, lRet, oError, bOldError, lAuto, lLeto LOCAL cPth, cFil, cExt IF hb_IsNumeric(nWhl) .and. nWhl > 0; w := nWhl ENDIF IF ! hb_IsChar(cRdd); cRdd := RddSetDefault() ENDIF lLeto := ( cRdd == 'LETO' ) IF lLeto; lAuto := Set( _SET_AUTOPEN, .T. ) ENDIF select 0 IF empty(cAls) .or. ! hb_IsChar(cAls) // алиас не задан - формируем сами hb_FNameSplit(cFile, @cPth, @cFil, @cExt) cAls := upper(cFil) IF select(cAls) > 0; cAls := '_XYZ_'+hb_ntos(select()) ENDIF ENDIF IF ! hb_IsLogical(lShare); lShare := .T. ENDIF NetErr( .F. ) bOldError := ErrorBlock({ |oErr| break(oErr) }) DO WHILE w-- > 0 BEGIN SEQUENCE lRet := DbUseArea(.F., cRdd, cFile, cAls, lShare, .F.) RECOVER USING oError lRet := .F. END SEQUENCE IF lRet .AND. ! NetErr() lRet := Used() EXIT ENDIF hb_IdleSleep(0.2) ENDDO ErrorBlock( bOldError ) IF lLeto; Set( _SET_AUTOPEN, lAuto ) ENDIF RETURN lRet
| если что спрашивай
|
|
|
|
| постоянный участник
|
Пост N: 521
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 16:21. Заголовок: Andrey вместо LOCAL..
Andrey вместо LOCAL ... lUnique надо lUnq в FUNC Table_Create(...)
|
|
|
|
| постоянный участник
|
Пост N: 522
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 16:23. Заголовок: Dima не увидел про ..
Dima не увидел про перенос темы, извини и перекинь мои крайние посты тоже. Спасибо
|
|
|
|
| постоянный участник
|
Пост N: 523
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 16:30. Заголовок: Softlog86 Есть - WE..
Softlog86 1. он Ваш или сторонний и у вас только hosting ? 2. он на CMS или как то иначе ? 3. Он-лайн торговля (через клиентское приложение ) на hb или как то иначе ?
|
|
|
|
| постоянный участник
|
Пост N: 4087
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.03.15 16:34. Заголовок: SergKis пишет: есл..
SergKis пишет: Слишком много буковок... Пошёл разбираться.... СПАСИБО БОЛЬШОЕ !
|
|
|
|
| |
Пост N: 219
Зарегистрирован: 03.12.08
|
|
Отправлено: 30.03.15 16:56. Заголовок: 2 SergKis отвечаю :..
2 SergKis отвечаю : 1. он Ваш или сторонний и у вас только hosting ? -> НАШ - связь с автором сайта ЕСТЬ 2. он на CMS или как то иначе ? -> не знаю что это такое :( спросим у автора 3. Он-лайн торговля (через клиентское приложение ) на hb или как то иначе ? -> есть клиентское приложение на HARBOUR+MINIGUI - программа прайс-лист с возможностью заказов (плюс базы данных по кросс-кодам и тд - .DBF) собственно это приложение и хочу переделать для работы не по FTP а сразу с БД на сервере ....
|
|
|
|
| постоянный участник
|
Пост N: 525
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 17:04. Заголовок: Softlog86 Спасибо. ..
Softlog86 Спасибо. понятно, что в данном случае все в ваших руках. и если используется cms (инструмент создания сайтов) с mysql, то из своего приложения туда тоже можно достучаться, есть rdd в hb для работы с mysql
|
|
|
|
| |
Пост N: 4625
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.03.15 17:54. Заголовок: marrinass пишет: От..
marrinass пишет: цитата: | Открываешь тему, жмёшь на стр. 2 или 3 и остальные стр. в перечислении пропадают! |
| Это косяк движка форума.
|
|
|
|
| постоянный участник
|
Пост N: 526
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.03.15 18:40. Заголовок: Dima пишет:Это косяк..
Dima пишет: в GUI потыкал некоторые темы, там нормально.
|
|
|
|
| moderator
|
Пост N: 885
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.03.15 09:14. Заголовок: Softlog86 пишет: За..
Softlog86 пишет: цитата: | Запись информации в БД на сервер , Скачивание , выборка по параметрам , и т д . Он-лайн торговля (через клиентское приложение ) Отсюда два варианта : 1) Использовать MySQL 2) Использовать LETO_DB |
| Слишком мало конкретной информации, чтобы посоветовать тот или иной вариант. Вот, например, клиентское приложение для онлайн торговли - что имется ввиду, веб-магазин ? цитата: | По первому варианту - не могу понять в какую сторону рыть для начала .... |
| contrib/hbmysql - вполне работающая библиотека, я ее лет 10 назад начал использовать для некоторых мелочей. цитата: | По второму - видимо нужно скомпилировать LETO_DB для работы в LINUX .... опять-же - трудности с этим .... |
| А какие именно трудности ? Просто запускаете make_linux.sh, предварительно поставив свои пути Harbour.
|
|
|
|
| moderator
|
Пост N: 886
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.03.15 09:19. Заголовок: Andrey пишет: Без т..
Andrey пишет: цитата: | Без точной версии LINUX собрать невозможно. |
| Версия Linux не имеет значения. Главное - правильно указать пути к Harbour, самому компилятору, библиотекам и include.
|
|
|
|
| |
Пост N: 220
Зарегистрирован: 03.12.08
|
|
Отправлено: 31.03.15 11:34. Заголовок: Если-б кто скинул го..
Если-б кто скинул готовый LITO_DB сервер для указанной системы (FreeBSD).... для пробы пера так сказать .... (пока устанивлю LINUX , пока скачаю нужные компоненты для компиляции ... нет времени ... ведь есть основная работа и она не ждёт ) Пойду тормошить разработчика сайта чтоб сказал что делать для запуска LETO на WEB_сервере .....
|
|
|
|
| moderator
|
Пост N: 887
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.03.15 11:52. Заголовок: Softlog86 пишет: Ес..
Softlog86 пишет: цитата: | Если-б кто скинул готовый LITO_DB сервер для указанной системы (FreeBSD) |
| У меня нету. цитата: | Пойду тормошить разработчика сайта чтоб сказал что делать для запуска LETO на WEB_сервере |
| Для однократного запуска - просто запустить ./letodb. Где прописать, чтобы LETO сам запускался при включении сервера - это вопрос к тем, кто знаком с FreeBSD.
|
|
|
|
| постоянный участник
|
Пост N: 529
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.03.15 13:53. Заголовок: Softlog86 пишет: для..
Softlog86 пишет: цитата: | для пробы пера так сказать... |
| для пробы (отработки методик) достаточно и localhost в win, в сети потом даже быстрее фурычит
|
|
|
|
| |
Пост N: 221
Зарегистрирован: 03.12.08
|
|
Отправлено: 31.03.15 14:24. Заголовок: Локальное лето в WIN..
Локальное лето в WINDOWS уже работает ( в других приложениях) .... Проба заключается в работе именно с хранилищем в Интернете на нашем Сайте ....
|
|
|
|
| постоянный участник
|
Пост N: 530
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.03.15 14:55. Заголовок: Softlog86 пишет:с хр..
Softlog86 пишет: цитата: | с хранилищем в Интернете на нашем Сайте .... |
| если ваш сайт cms (типа joomla) с mysql, то доступ к letodb в основмном через cgi. у нас именно такой вариант был, мы с него ушли (все работало, но при разрастании все становилось не удобным, громоздким). развите требовало загружать mysql+php, но не хотелось уходить с hb. Перешли к варианту joomla (для сайта клиента - доомоуправление, жск ... со своей инф. ) + http сервер на hb (на базе http://www.dbtopas.lt/hrb/uhttpd-0.3.zip) + letodb (Share_Tables = 1). задача квартплата работает с letodb, заполнение счетчитчиков по воде жильцами возможна с сайта и отчеты по ней на сайте. такая схема работает уже полгода в нескольких домоуправлениях. все очень стабильно, быстро. Для развития сайта (возможно даже замена какихто режимов на MiniGui) смотрим в сторону http://w2ui.com
|
|
|
|
| |
Пост N: 222
Зарегистрирован: 03.12.08
|
|
Отправлено: 31.03.15 16:59. Заголовок: Ой как сложно ... З..
Ой как сложно ... Задача простая : У клиента установлена программа на Харборе . Работаем с DBF-файлами . Обмен (обновление локальных данных и отправка своих : заказов идёт через FTP на сайт в определенные папки ) Пользователей всего-то около трёх сотен . Работает одновременно - максимум 20-30 . И то - скачивают новые прайсы / остатки и т д .... опять-же - это по FTP . Хотелось-бы чтоб коннектились к таблицам на сайте и тащили только новую информацию а не все таблицы ....
|
|
|
|
| постоянный участник
|
Пост N: 531
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.03.15 17:05. Заголовок: Softlog86 Вы так и ..
Softlog86 Вы так и не ответили на чем Ваш сайт. Статические страницы (на ftp закидываются) или apache+mysql+php. не могу понять доступ через Chrome\Explorer к страницам вашей информации, если есть ввод на страницах - как попадает в базу ?
|
|
|
|
| постоянный участник
|
Пост N: 532
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.03.15 17:21. Заголовок: Softlog86 пишет: Обм..
Softlog86 пишет: цитата: | Обмен (обновление локальных данных и отправка своих : заказов идёт через FTP на сайт в определенные папки ) |
| это задача не сайт, такой вариант у меня тоже есть: Clipper+localdbf+mysql+ftp, при переводе на hb, получилось local dbf+letodb, т.е. задача (отчеты, справочники, операт. информация - local инф.) letodb - производная база от local, hb console+MiniGui работают с letodb (могут и с local по устан.) изменения с letodb попадают на local по запросам (timer), так проще было переводить с clipper и + требования клиента о живучести (оперативная работа склад, торговые точки, ...) если летит сервер - проблем не должно быть, клиент у кассы ждать не будет.
|
|
|
|
| |
Пост N: 223
Зарегистрирован: 03.12.08
|
|
Отправлено: 31.03.15 21:12. Заголовок: Уточнение : У клиент..
Уточнение : У клиентов - EXE-модуль на HARBOUR+MINIGUI . Локальные файлы - .DBF : Это различные таблицы - список товаров , кросс-коды , и т д . На FTP-сервере в Интернет (физически на нашем информационном сайте ) в различных папках , к которым есть доступ по паролю находятся ZIP(внутри - таблицы DBF). Клиент выбирает пункт "ОБНОВИТЬ БАЗЫ ДАННЫХ" . Прога лезет на FTP и скачивает к себе что нужно : Раскрывает архивы , извлекает .DBF и из них переписываетв в свои локальные базы нужную информацию . Разумеется - это всё статические данные , которые НА FTP мы забрасываем по мере необходимости . Задача - при ОБНОВЛЕНИИ ( клиентом) - идёт подключение (через MySQL или LETO_DB ) к соответствующим таблицам в Интернете и считываем нужные данные , одновременно записывая в локальные базы (обновление или добавление ) . При этом клиент записывает и на сервер какую-то информацию (лог работы , собранные собственные данные : заявки/заказы/отчеты и т д) Разница в том , что при таком способе нет необходимости гнать файлы ( до 2-5 Мбайт x 2-50 шт)
|
|
|
|
| постоянный участник
|
Пост N: 533
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.03.15 22:04. Заголовок: Softlog86 пишет:У кл..
Softlog86 пишет: цитата: | У клиентов - EXE-модуль на HARBOUR+MINIGUI . |
| я уже понял, что у Вас "толстый" клиент на hb и файловый сервер на ftp. т.е. та же технология, что у меня было на Clipper ...(см. пост выше) и Вам требуется перейти на letodb или mysql вместо ftp. Если у Вас hb+MiniGui локально решают все вопросы, а ftp - хранилище zip данных, то, на мой взгляд, letodb лучше - проще. 1. Разделите dbf файлы на рабочие (local) и серверные. 2. Сделайте модуль загрузки инф. на сервер 3. Задайте пути на сервер для серверных файлов (надо учесть разницу файловых функций leto_file и file, ...) и практически вперед ... (конечно нюансов Вашей задачи я не знаю) пока нет версии под линукс, делайте все на win версии - чтобы время не терять
|
|
|
|
| |
Пост N: 224
Зарегистрирован: 03.12.08
|
|
Отправлено: 31.03.15 22:54. Заголовок: Да , но нужно чтоб с..
Да , но нужно чтоб сервер LETO работал на нашем виртуальном сервере (LINUX FreeBSD :наш сайт крутится там - и соответственно базы лежат которые LETO и будет обрабатывать ) По-любому нужно 1) LETO_DB Сервер для LINUX 2) в настройках сервера сделать его запуск
|
|
|
|
| постоянный участник
|
Пост N: 534
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.04.15 09:35. Заголовок: Softlog86 пишет:Да ,..
Softlog86 пишет: цитата: | Да , но нужно чтоб сервер LETO работал на нашем виртуальном сервере |
| Так я не возражаю, только какя польза будет, если сервер УЖЕ крутится, а задача об этом ничего не знает. Главное, что бы задача умела работать с сервером, а где он запущен - вторично. И времени на это может уйти больше.
|
|
|
|
| постоянный участник
|
Пост N: 535
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.04.15 09:44. Заголовок: PS. Задачу с letodb,..
PS. Задачу с letodb, делаю, отлаживаю в local 127.0.0.1:2812, по мере готовности проверяю в локальной сети, с letodb в инет на удаленном сервере и + через мобильньный модем соединение.
|
|
|
|
| |
Пост N: 225
Зарегистрирован: 03.12.08
|
|
Отправлено: 01.04.15 10:57. Заголовок: Ребята , в локально..
Ребята , в локальной сети LETO уже работает и все нужные мне действия производит . Нужно разместить Лето-сервер на LINUX-машине (Виртуальный сервер ) ... и пробовать 'достучаться' к нему по Интернету (IP): Прилагаю скриншоты : БАЗЫ ДАННЫХ САЙТА ФАЙЛОВАЯ СИСТЕМА ИНФОРМАЦИЯ О САЙТЕ
|
|
|
|
| moderator
|
Пост N: 889
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.04.15 11:28. Заголовок: Softlog86 пишет: Ну..
Softlog86 пишет: цитата: | Нужно разместить Лето-сервер на LINUX-машине (Виртуальный сервер ) ... и пробовать 'достучаться' к нему по Интернету (IP): |
| 1) Скопируйте туда исходники Harbour 2) Откомпилируйте 3) Скопируйте исходники LetoDb 4) Откомпилируйте Если у вас есть доступ к нему по ssh, это делается достаточно просто и быстро.
|
|
|
|
| |
Пост N: 226
Зарегистрирован: 03.12.08
|
|
Отправлено: 01.04.15 11:58. Заголовок: Это виртуальный серв..
Это виртуальный сервер от VDS . Я из браузера туда захожу через какую-то консоль ..... думаю проще будет установить Линукс на свой комп и пробовать создать Лето ...:) Что куда потом прописывать чтоб сервер стартовал на той виртуальной машине в сети (у хостера) ...- вот тут нужна помощь тех кто уже делал такое ...
|
|
|
|
| moderator
|
Пост N: 890
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.04.15 12:59. Заголовок: Softlog86 пишет: ду..
Softlog86 пишет: цитата: | думаю проще будет установить Линукс на свой комп |
| в смысле, FreeBSD ( это не Linux, вообще-то ). цитата: | Что куда потом прописывать чтоб сервер стартовал на той виртуальной машине в сети (у хостера) |
| Т.е., сервер, все-таки, не ваш, имеется еще хостер А он согласится установить у себя LetoDb ? Обычно хостеры крайне неохотно идут на установку неизвестных им лично программ. Вот хостеры моего сайта не захотели даже fossil устанавливать - именно по той причине, что это, по их мнению, неизвестно что :) - я, правда, и не настаивал.
|
|
|
|
| |
Пост N: 227
Зарегистрирован: 03.12.08
|
|
Отправлено: 01.04.15 13:21. Заголовок: Я думал что если мы ..
Я думал что если мы купили хостинг на их машине - значит можем там делать всё что захотим ,,,,, а тут вот значит какая загогулина есть ещё и подводные камни с установщиками .... Значит нужно пробовать работать с MySQL . К этим базам мы можем подключиться из HARBOUR ? Что посоветуете попробовать ? Пока буду играться с примерами из комплекта MiniGUI ....
|
|
|
|
| moderator
|
Пост N: 891
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.04.15 13:55. Заголовок: Softlog86 пишет: Я ..
Softlog86 пишет: цитата: | Я думал что если мы купили хостинг на их машине - значит можем там делать всё что захотим |
| Если вы купили виртуальную машину, изолированную от физического сервера, то, наверное, вы можете устанавливать все, что угодно, т.к. падение этой виртуальной машины вызовет проблемы только у вас. В любом случае, свяжитесь с хостером и выясните у него все. цитата: | Значит нужно пробовать работать с MySQL . К этим базам мы можем подключиться из HARBOUR ? Что посоветуете попробовать ? |
| harbour/contrib/hbmysql - этого будет достаточно.
|
|
|
|
| |
Пост N: 6
Зарегистрирован: 06.12.14
|
|
Отправлено: 05.04.15 16:43. Заголовок: Добавить функционал
Есть ли возможность биндить сервер к одному конкретному адресу, если нет, возможно ли добавить? Возможно ли добавить в Leto DB функцию эквивалентную FCREATE? Отличается ли работа Leto_FileWrite от FWRITE?
|
|
|
|
| moderator
|
Пост N: 897
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.04.15 09:27. Заголовок: finder пишет: Есть ..
finder пишет: цитата: | Есть ли возможность биндить сервер к одному конкретному адресу |
| Поясните, что именно вы имеете ввиду. цитата: | Возможно ли добавить в Leto DB функцию эквивалентную FCREATE? |
| Leto_FileWrite() создает новый файл с указанным именем, если он не существует и поэтому может служить заменой FCreate(). цитата: | Отличается ли работа Leto_FileWrite от FWRITE? |
| И да, и нет. FWrite(), как вы знаете, записывает буфер в предварительно открытый файл, начиная с текущей позиции. Leto_FileWrite() открывает файл ( или создает, если его нет ), переходит на указанную позицию (fseek), записывает буфер и закрывает файл.
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 06.12.14
|
|
Отправлено: 06.04.15 11:02. Заголовок: alkresin пишет: Ест..
alkresin пишет: цитата: | Есть ли возможность биндить сервер к одному конкретному адресу Поясните, что именно вы имеете ввиду. |
| Сейчас сервер стартует без указания IP адреса, т.е. использует все доступные IP адреса с указанным портом. Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP адресе, например 127.0.0.1 или любой другой ОДИН адрес который можно было бы указать. Думаю это было бы более разумно для различных условий использования Leto DB. alkresin пишет: цитата: | Возможно ли добавить в Leto DB функцию эквивалентную FCREATE? Leto_FileWrite() создает новый файл с указанным именем, если он не существует и поэтому может служить заменой FCreate(). Отличается ли работа Leto_FileWrite от FWRITE? И да, и нет. FWrite(), как вы знаете, записывает буфер в предварительно открытый файл, начиная с текущей позиции. Leto_FileWrite() открывает файл ( или создает, если его нет ), переходит на указанную позицию (fseek), записывает буфер и закрывает файл. |
| Теперь хоть ясно, а то было непонятно почему отсутствовала функция создания файла при наличии функции записи. Пара уточнений: 1. Как поведет себя Leto_FileWrite без указания позиции начала записи? запишет сначала? 2. Как обрезать файл до размера соответствующего объему записываемых данных? В случае fcreate + fwrite независимо от наличия файла создается новый файл с нужными правами доступа и в него записывается нужная порция информации. В случае летних функций я так понимаю это должно выглядеть Leto_Ferase Leto_FileWrite ? А в случае когда есть необходимость дописать в конец файла надо использовать Leto_FileSize чтобы узнать в какой позиции находится конец файла, ввиду отсутствия функции fseek? Несколько непривычно получается, но теперь по крайней мере механизм понятен. Еще вопрос, в пользовательских функциях есть возможность задать стартовую функцию типа RunOnStart которая будет автоматически запускаться разово после загрузки letoudf.hrb ? Ну и может быть заодно RunOnStop при выгрузке/перезагрузке letoudf.hrb. P.S. Уточню - меня больше интересует работа под *nix системами, так вот. Только что проверил работу Leto_FileWrite, файл создался с правами чтение/запись для всех. В случае использования стандартных файловых функций при создании устанавливаются такие атрибуты. /* File create flags */ FC_NORMAL - чтение/запись для всех FC_READONLY - только чтение для всех FC_HIDDEN - чтение/запись только для владельца FC_SYSTEM - чтение/исполнение для всех + запись для владельца P.P.S. Описание не совсем корректное? Leto_FileWrite( cFileName, nStart, cBuf ) --> lSuccess Записывает переменную <cBuf> в файл на сервере со смещения <nStart> размером <nLen> Кто такой <nLen> ? Насколько корректен возврат lSuccess при условиях не записалось все или не записалось часть, подозреваю в обоих будет .F., а правильнее было бы наверное <nLen>.
|
|
|
|
| moderator
|
Пост N: 899
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.04.15 11:48. Заголовок: finder пишет: Хотел..
finder пишет: цитата: | Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP |
|
Я посмотрю, что можно сделать. цитата: | 1. Как поведет себя Leto_FileWrite без указания позиции начала записи? запишет сначала? |
|
Да. Но лучше указать 0 ( сейчас в LETO_FILEWRITE() стоит hb_parnl(2) без проверки типа передаваемого значения ). цитата: | 2. Как обрезать файл до размера соответствующего объему записываемых данных? |
| Вы сами и ответили на этот вопрос. цитата: | Несколько непривычно получается, но теперь по крайней мере механизм понятен. |
| LetoDb создавался, в общем-то, для лругих целей. Эти функции были добавлены позже по запросам пользователей и были сделаны с учетом уже сложившейся реализации программы. цитата: | Еще вопрос, в пользовательских функциях есть возможность задать стартовую функцию... |
|
Это к Павлу, я сам эту часть кода еще не смотрел. цитата: | В случае использования стандартных файловых функций при создании устанавливаются такие атрибуты. |
| Соответствующая функция LetoDb не устанавливает права - просто вызывается стандартная ф-я Harbour hb_fsOpen(). Я вижу, 2-го апреля Павел добавил ф-ю leto_FileAttr() - сее поощью, наверное, можно установить нужные атрибуты.
|
|
|
|
| Администратор
|
Пост N: 3254
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.04.15 14:01. Заголовок: Если в модуле letoud..
Если в модуле letoudf присутствует функция с именем udf_init, она будет запущена после загрузки модуля.
|
|
|
|
| moderator
|
Пост N: 900
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.04.15 17:06. Заголовок: alkresin пишет: ци..
alkresin пишет: цитата: | цитата: Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP Я посмотрю, что можно сделать. |
| Добавил новый параметр в ini-файл: ip, где можно указать этот единственный ip.
|
|
|
|
| |
Пост N: 8
Зарегистрирован: 06.12.14
|
|
Отправлено: 07.04.15 00:04. Заголовок: Pasha пишет: Если в..
Pasha пишет: цитата: | Если в модуле letoudf присутствует функция с именем udf_init, она будет запущена после загрузки модуля. |
|
ТОЧНО ) Прошу прощения - провтыкал... alkresin пишет: цитата: | цитата: Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP Я посмотрю, что можно сделать. Добавил новый параметр в ini-файл: ip, где можно указать этот единственный ip. |
| Проверил, вроде работает ) Спасибо. Имя параметра в letodb.ini окончательное, меняться не будет?
|
|
|
|
| |
Пост N: 9
Зарегистрирован: 06.12.14
|
|
Отправлено: 07.04.15 00:21. Заголовок: Пользовательские переменные
Какие ограничения есть на имена пользовательских групп и переменных? Длина, набор символов, количество, etc...? Доступна ли работа с ними из пользовательских функций? Возможно ли удалить группу? В этих переменных можно хранить только CNL типы?
|
|
|
|
| moderator
|
Пост N: 901
Зарегистрирован: 06.07.06
|
|
Отправлено: 07.04.15 09:44. Заголовок: finder пишет: Имя п..
finder пишет: цитата: | Имя параметра в letodb.ini окончательное, меняться не будет? |
| Окончательное. цитата: | Какие ограничения есть на имена пользовательских групп и переменных? Длина, набор символов, количество, etc...? |
| Нет ограничений. цитата: | Доступна ли работа с ними из пользовательских функций? |
| leto_var...(), или вы о чем-то другом ? цитата: | Возможно ли удалить группу? |
| Попробуйте leto_vardel( cGroupName, "" ) цитата: | В этих переменных можно хранить только CNL типы? |
| Да.
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 06.12.14
|
|
Отправлено: 07.04.15 10:30. Заголовок: alkresin пишет: До..
alkresin пишет: цитата: | Возможно ли удалить группу? Попробуйте leto_vardel( cGroupName, "" ) |
| С пустой строкой в имени переменной помогло, до этого пробовал указывать только имя группы alkresin пишет: цитата: | Доступна ли работа с ними из пользовательских функций? leto_var...(), или вы о чем-то другом ? |
| letoudf.prg цитата: | #include "rddleto.ch" Function UDF_Init LETO_VARSET( 'GroupNameTest', 'VarNameTest', 'VarContent', LETO_VCREAT ) Return NIL |
| hbmk2 letoudf.prg -gh letodb stop letodb start letodb.log цитата: | 04/07/15 10:20:25: Leto DB Server has been started. Leto DB Server v.2.15 ! INIT: DataPath=/path/data, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 04/07/15 10:20:25: Error BASE/6101 Unknown or unregistered symbol: LETO_VARSET ERROR! SETHRBERROR - pUStru not found!!!!!!!!!!!!!!!!!!!! |
| Возможно я делаю что-то не так? С пользовательскими переменными можно работать только с клиента?
|
|
|
|
| постоянный участник
|
Пост N: 554
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.04.15 11:36. Заголовок: finder readme_rus.t..
finder readme_rus.txt в конце цитата: | Функции letoUseArea, letoOrdListAdd, letoOrdCreate, letoCloseArea, leto_RecLock, leto_RecLock предназначены для использования в udf-функциях вместо rdd функций: dbUseArea, OrdListAdd, OrdCreate, dbCloseArea, RLock, dbUnlock LETO_VARSET( nUserStru, cGroupName, cVarName, xValue[, nFlags ) --> lSuccess LETO_VARGET( nUserStru, cGroupName, cVarName ) --> xValue LETO_VARINCR( nUserStru, cGroupName, cVarName ) --> nValue LETO_VARDECR( nUserStru, cGroupName, cVarName ) --> nValue LETO_VARDEL( nUserStru, cGroupName, cVarName ) --> lSuccess LETO_VARGETLIST( nUserStru, [cGroupName, [lValue]] ) --> aList |
|
|
|
|
|
| постоянный участник
|
Пост N: 555
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.04.15 11:42. Заголовок: PS. в пред.версии le..
PS. в пред.версии letodb (двухпоточной): leto_varSet( NIL, cGru, cNam, cVal, LETO_VCREAT ) ... cVal := leto_varGet( NIL, cGru, cNam ) в этой версии еще не пробовал
|
|
|
|
| постоянный участник
|
Пост N: 556
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.04.15 11:47. Заголовок: finder пишет:04/07/1..
finder пишет: цитата: | 04/07/15 10:20:25: Error BASE/6101 Unknown or unregistered symbol: LETO_VARSET |
| добавьте: #include "rddleto.ch"
|
|
|
|
| moderator
|
Пост N: 902
Зарегистрирован: 06.07.06
|
|
Отправлено: 07.04.15 11:58. Заголовок: finder пишет: С пол..
finder пишет: цитата: | С пользовательскими переменными можно работать только с клиента? |
| Leto_var... функции определены и в серверной части. Я сейчас добавил в server.prg REQUEST для них, теперь не должен ругаться. Правда, при вызове из udf_init() выскакивает ошибка - возможно, на этот момент что-то недоинициализировано, надо проверить.
|
|
|
|
| постоянный участник
|
Пост N: 557
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.04.15 13:49. Заголовок: SergKis пишет:добавь..
SergKis пишет: цитата: | добавьте: #include "rddleto.ch" |
| правильнее будет для работы с leto_var...: #define LETO_VCREAT 1 #define LETO_VOWN 2 #define LETO_VDENYWR 4 #define LETO_VDENYRD 8 #define LETO_VPREVIOUS 1 т.к. #include "rddleto.ch" содержит: #define LETO_NTX 1 #define LETO_CDX 2 что повторяется с server.prg (line 64) или убрать в server.prg (line 64, 65) и использовать #include "rddleto.ch" что лучше - это к alkresin и Pasha
|
|
|
|
| moderator
|
Пост N: 903
Зарегистрирован: 06.07.06
|
|
Отправлено: 08.04.15 09:33. Заголовок: или убрать в server...
цитата: | или убрать в server.prg (line 64, 65) и использовать #include "rddleto.ch" |
| Убрал, добавил. alkresin пишет: цитата: | Правда, при вызове из udf_init() выскакивает ошибка - возможно, на этот момент что-то недоинициализировано, надо проверить. |
| Просмотрел код. Функции leto_..., вызываемые из udf, должны в качестве первого параметра передавать nUserStru - параметр, который получает udf ф-я, это идентификатор клиента, который выполняет udf ф-ю. Поскольку udf_init() выполняется автоматически при старте и ни одного пользователя к этому моменту не определено, то leto_... функции не могут вызываться из нее.
|
|
|
|
| |
Пост N: 11
Зарегистрирован: 06.12.14
|
|
Отправлено: 08.04.15 10:36. Заголовок: alkresin пишет: Про..
alkresin пишет: цитата: | Просмотрел код. Функции leto_..., вызываемые из udf, должны в качестве первого параметра передавать nUserStru - параметр, который получает udf ф-я, это идентификатор клиента, который выполняет udf ф-ю. Поскольку udf_init() выполняется автоматически при старте и ни одного пользователя к этому моменту не определено, то leto_... функции не могут вызываться из нее. |
| Спасибо, понял, буду использовать внешний инициализатор. Может стоит в readme что-то сделать с этим описанием, а то получается что суть <nLen> не раскрыта? Возможно стоит добавить так же, что при отсутствии файла он создается. цитата: | Leto_FileWrite( cFileName, nStart, cBuf ) --> lSuccess Write <cBuf> character string to a file at the server from <nStart> offset and <nLen> length |
|
|
|
|
|
| постоянный участник
|
Пост N: 560
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.04.15 10:41. Заголовок: alkresin пишет: ни о..
alkresin пишет: цитата: | ни одного пользователя к этому моменту не определено, то leto_... функции не могут вызываться из нее. |
| в пред.версии letodb (двухпоточной) Pasha специально делал для функций leto_var..., с nUserStru := NIL - работа с общими переменными: leto_varSet( NIL, cGru, cNam, cVal, LETO_VCREAT ) cVal := leto_varGet( NIL, cGru, cNam )
|
|
|
|
| |
Пост N: 12
Зарегистрирован: 06.12.14
|
|
Отправлено: 08.04.15 10:44. Заголовок: SergKis пишет: в пр..
SergKis пишет: цитата: | в пред.версии letodb (двухпоточной) Pasha специально делал для функций leto_var..., с nUserStru := NIL - работа с общими переменными: leto_varSet( NIL, cGru, cNam, cVal, LETO_VCREAT ) cVal := leto_varGet( NIL, cGru, cNam ) |
| Я проверил после обновления, на имя функции ругаться перестало, но валится если их вызывать из udf_init() Кстати это первый раз когда у меня получилось уронить letodb letodb_crash.log цитата: | Breakdown at: 2015.04.08 10:46:06 Unrecoverable error 6005: Exception %s at address %s SIGSEGV 0x17 ------------------------------------------------------------------------ User: 127.0.0.1 (null) (null) Command: udf_rel |
| Код такой letoudf.prg цитата: | #include "rddleto.ch" Function UDF_Init LETO_VARSET( NIL, 'GroupNameTest', 'VarNameTest', 'VarContent', LETO_VCREAT ) Return NIL |
|
|
|
|
|
| постоянный участник
|
Пост N: 561
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.04.15 10:51. Заголовок: finder пишет:но вали..
finder пишет: цитата: | но валится если их вызывать из udf_init() |
| буду знать. я ф-ии использовал в триггере, поэтому было все ok.
|
|
|
|
| moderator
|
Пост N: 904
Зарегистрирован: 06.07.06
|
|
Отправлено: 08.04.15 10:53. Заголовок: finder пишет: Может..
finder пишет: цитата: | Может стоит в readme что-то сделать с этим описанием, а то получается что суть <nLen> не раскрыта? |
| Да, никакого nLen нет в этой функции, используется длина cBuf. Исправлю.
|
|
|
|
| |
Пост N: 18
Зарегистрирован: 06.05.14
|
|
Отправлено: 08.04.15 19:46. Заголовок: дебуг
Есть ли где описание команды в дебуг режиме? цитата: | close;16; unlock;14;02; unlock;15;02; goto;15;1695;par_naz;A; rcou;15; skip;15;-1;1695;par_naz;A; rcou;15; rcou;15; rcou;15; skip;15;1;1695;par_naz;A; rcou;15; rcou;15; rcou;15; |
|
|
|
|
|
| moderator
|
Пост N: 905
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.04.15 09:32. Заголовок: nbatocanin пишет: Е..
nbatocanin пишет: цитата: | Есть ли где описание команды в дебуг режиме? |
| Нет. Посмотреть можно только по исходникам - source/client/letocl.c
|
|
|
|
| moderator
|
Пост N: 908
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 10:22. Заголовок: Я немного изменил си..
Я немного изменил систему нумерации версий LetoDb - добавил туда номер сборки ( build ), чтобы можно было, не меняя все время основной номер версии, выкладывать на Sourceforge обновленные пакеты. Выложен letodb-2.15-b2.src.zip
|
|
|
|
| |
Пост N: 4705
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.04.15 10:24. Заголовок: alkresin Раздел соз..
alkresin Раздел создавать по LetoDB Server ? Название такое и будет LetoDB Server ?
|
|
|
|
| moderator
|
Пост N: 910
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.04.15 11:56. Заголовок: Я бы назвал "Let..
Я бы назвал "LetoDB, HbNetio и пр." "пр." - на всякий случай :) И в разделе GUI подзаголовок, наверное, надо переименовать "GUI в [x]Harbour"
|
|
|
|
| |
Пост N: 13
Зарегистрирован: 06.12.14
|
|
Отправлено: 12.04.15 00:17. Заголовок: Пользовательские переменные в пользовательских функциях
Пользовательские переменные в пользовательских функциях не работают. Попытка создать переменную приводит к падению сервера. При этом без разницы указан nUserStru или просто NIL. letoudf.prg цитата: | #include "rddleto.ch" Function VarTest( nUserStru ) LETO_VARSET( nUserStru, 'TestGroupName', 'TestVarName', 'TestVarContent', LETO_VCREAT ) //LETO_VARSET( NIL, 'TestGroupName', 'TestVarName', 'TestVarContent', LETO_VCREAT ) Return .T. |
| testvars.prg цитата: | #include "rddleto.ch" #define LETOSERVER "//127.0.0.1:2812/" Procedure Main(a) local aa REQUEST LETO RDDSETDEFAULT("LETO") leto_Connect( LETOSERVER ) ? "aa:=LETO_UDF( LETOSERVER+'VarTest' )", aa:=LETO_UDF( LETOSERVER+'VarTest' ) ? 'valtype( aa )', valtype( aa ) return ? 'hb_valtoexp( aa )', hb_valtoexp( aa ) return ? 'hb_valtoexp(LETO_VARGETLIST())', hb_valtoexp(LETO_VARGETLIST()) return ? aa:=leto_vargetlist() return ? hb_valtoexp(leto_vargetlist()) return |
| Возможно это как-то победить?
|
|
|
|
| moderator
|
Пост N: 917
Зарегистрирован: 06.07.06
|
|
Отправлено: 14.04.15 12:28. Заголовок: finder пишет: Возмо..
finder пишет: цитата: | Возможно это как-то победить? |
| Победил.
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 06.12.14
|
|
Отправлено: 14.04.15 15:07. Заголовок: УРААА!!!
УРААА!!! Заработало! И похоже работает даже из UDF_Init Буду тестировать в расширенном варианте. Огромное Вам, Александр, человеческое СПАСИБО! Небольшое уточнение, это уже будет окончательно без откатов и насовсем?
|
|
|
|
| moderator
|
Пост N: 918
Зарегистрирован: 06.07.06
|
|
Отправлено: 14.04.15 16:27. Заголовок: finder пишет: Небол..
finder пишет: цитата: | Небольшое уточнение, это уже будет окончательно без откатов |
| Конечно. Там были реальные ошибки, зачем откатывать. До тех пор, пока новых ошибок не наплодим
|
|
|
|
| |
Пост N: 15
Зарегистрирован: 06.12.14
|
|
Отправлено: 14.04.15 23:45. Заголовок: Эта команда leto_var..
Эта команда leto_vardel( 'GroupNone', '' ) - удаляет группу со всеми переменными? Мусор оставлять за собой такое удаление не будет? При попытке удалить несуществующую группу переменных - сервер падает, значит ли это, что надо проверять ее наличие со стороны клиента перед удалением? При удалении отсутствующих переменных внутри группы такого не замечено.
|
|
|
|
| moderator
|
Пост N: 920
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.04.15 09:39. Заголовок: finder пишет: Эта к..
finder пишет: цитата: | Эта команда leto_vardel( 'GroupNone', '' ) - удаляет группу со всеми переменными? |
| Да. цитата: | При попытке удалить несуществующую группу переменных - сервер падает |
| Пример на стол. Мне не удалось воспроизвести падение сервера при удалении несуществующей группы.
|
|
|
|
| moderator
|
Пост N: 921
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.04.15 09:49. Заголовок: Впрочем, я сейчас ис..
Впрочем, я сейчас исправил возможный источник проблемы, но у меня и так почему-то работало.
|
|
|
|
| постоянный участник
|
Пост N: 572
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.04.15 10:48. Заголовок: alkresin подключени..
alkresin подключение триггера в letodb не работает (в 2-х поточной версии все Ok): letodb.ini : ... Trigger = my_Trigger ... FUNCTION my_Trigger( nEvent, nArea, nPos, xTrigVal ) dbInfo(DBI_TRIGGER, .F.) WrLog( Procname()+" "+ hb_valtoexp({ nEvent, nArea, nPos, xTrigVal }) ) dbInfo(DBI_TRIGGER, .T.) RETURN .T. включение этой функции в letodb.hrb или letodb.prg не срабатывает ни разу при операциях над таблицей это можно побороть ?
|
|
|
|
| |
Пост N: 4732
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.04.15 10:55. Заголовок: SergKis А каков фун..
SergKis А каков функционал у dbInfo(DBI_TRIGGER...... , для чего она ?
|
|
|
|
| |
Пост N: 16
Зарегистрирован: 06.12.14
|
|
Отправлено: 15.04.15 11:15. Заголовок: alkresin пишет: При..
alkresin пишет: цитата: | Пример на стол. Мне не удалось воспроизвести падение сервера при удалении несуществующей группы. |
| #include "rddleto.ch" #define LETOSERVER "//127.0.0.1:2812/" Procedure Main(a) local cTmp:='', aa REQUEST LETO RDDSETDEFAULT("LETO") leto_Connect( LETOSERVER ) ? leto_vardel( 'GroupNone', '' ) ? leto_vardel( 'GroupNone', '' ) return сервер запускал без letoudf.hrb для чистоты эксперимента результат выполнения Breakdown at: 2015.04.15 11:11:46 Unrecoverable error 6005: Exception %s at address %s SIGSEGV (nil) ------------------------------------------------------------------------ User: 127.0.0.1 localhost testvars Command: var P.S. Только что пересобрал сервер. Теперь при тесте он не падает, но тестовое приложение зависает ничего не выводя т.е. как я понимаю где-то внутри функции удаления группы.
|
|
|
|
| moderator
|
Пост N: 922
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.04.15 12:01. Заголовок: finder пишет: Тольк..
finder пишет: цитата: | Только что пересобрал сервер. Теперь при тесте он не падает, но тестовое приложение зависает ничего не выводя т.е. как я понимаю где-то внутри функции удаления группы. |
| Исправил
|
|
|
|
| |
Пост N: 17
Зарегистрирован: 06.12.14
|
|
Отправлено: 15.04.15 13:23. Заголовок: alkresin пишет: Исп..
alkresin пишет: Спасибо, сейчас отрабатывает.
|
|
|
|
| постоянный участник
|
Пост N: 573
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.04.15 14:07. Заголовок: Dima пишет:А каков ф..
Dima пишет: цитата: | А каков функционал у dbInfo(DBI_TRIGGER...... , для чего она ? |
| Сейчас триггер заполняет поля : IDNNN (N10) - идентификатор от поля + (клиент 2-х поточной версии не понимает новые поля) IDDATEADD(C17) - дата добавления Timestamp -> в строку IDDATEUPD (C17) - дата модификации Timestamp -> в строку IDDATEDEL (C17) - дата удаления Timestamp -> в строку эти поля обязательны по закондательству и планировал на новой версии перенести с клиента ведение логов по изменению таблиц.
|
|
|
|
| moderator
|
Пост N: 923
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.04.15 14:21. Заголовок: SergKis пишет: вклю..
SergKis пишет: цитата: | включение этой функции в letodb.hrb или letodb.prg не срабатывает ни разу при операциях над таблицей это можно побороть ? |
| Можно, конечно. Только надо сначала разобраться - я не смотрел еще в ту сторону.
|
|
|
|
| moderator
|
Пост N: 924
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.04.15 18:17. Заголовок: По-видимому, дело в ..
По-видимому, дело в том, что новые потоки не наследуют RDDI_... установки, их надо переустанавливать для каждого вновь создаваемого потока.
|
|
|
|
| постоянный участник
|
Пост N: 575
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.04.15 20:10. Заголовок: alkresin пишет:По-ви..
alkresin пишет: цитата: | По-видимому, дело в том, что новые потоки не наследуют RDDI_... установки, |
| наверное, правильно, устанавливать "свой" триггер только для нужной области (с клиента), но общий, в некоторых, ситуациях лучше и лежать триггеру лучше в letodb.hrb - для клиента свой hrb и триггеры
|
|
|
|
| постоянный участник
|
Пост N: 579
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 08:26. Заголовок: alkresin, Pasha изви..
alkresin, Pasha извините, что достаю ..., но есть предложение добавить в letodb.ini режим AutoMakeDir = [0] \ 1 - автомат. создание директорий при создании таблицы. такой штукой пользуемся ~5 лет - очень упрощет код на клиенте Скрытый текст
FUNCTION hs_createtable( nUserStru, cCommand ) ... IF Lower(cName) = "/mem:" cDataPath := "" cName := Substr(cName, 2) ELSE cDataPath := leto_GetAppOptions( 1 ) ENDIF // IF ! empty(cDataPath) // cFileName := cDataPath + cName // ENDIF // _MakeDir_(cFileName) // // BEGIN SEQUENCE WITH { |e|break( e ) } ... STATIC FUNCTION _MakeDir_( cDBF ) LOCAL i, cCt, aCt := {} i := RAt(DEF_SEP, cDBF) cCt := Left(cDBF, i-1) DO WHILE ! hb_DirExists( cCt ) i := RAt(DEF_SEP, cCt) IF i == 0 ; EXIT ENDIF AAdd( aCt , subs(cCt, i+1) ) cCt := Left( cCt, i-1) ENDDO i := Len( aCt ) DO WHILE i > 0 cCt += (DEF_SEP + aCt[i--]) MakeDir( cCt ) ENDDO RETURN .T.
| возвращаюсь к наличию в letodb аналогов функций hb_fSetDateTime, hb_fGetDateTime. потестировал: Скрытый текст
FUNCTION UDF_fGetDateTime( nUserStru, cFile ) LOCAL dDate, cTime, lFile, cPath := leto_GetAppOptions(1) IF left(cFile, 1) == DEF_CH_SEP cFile := subs(cFile, 3) cFile := subs(cFile, At(DEF_CH_SEP, cFile)) cFile := StrTran(cFile, DEF_CH_SEP, DEF_SEP) cFile := subs(cFile, len(cPath)+1) ENDIF cPath += DEF_SEP lFile := file(cPath+cFile) IF lFile; hb_fGetDateTime(cPath+cFile, @dDate, @cTime) ENDIF RETURN { dDate, cTime } FUNCTION UDF_fSetDateTime( nUserStru, cFile, dDate, cTime ) LOCAL lFile, cPath := leto_GetAppOptions(1) IF empty(dDate); dDate := Date() ENDIF IF empty(cTime); cTime := Time() ENDIF IF ! '.' $ cTime; cTime += '.001' ENDIF IF left(cFile, 1) == DEF_CH_SEP cFile := subs(cFile, 3) cFile := subs(cFile, At(DEF_CH_SEP, cFile)) cFile := StrTran(cFile, DEF_CH_SEP, DEF_SEP) cFile := subs(cFile, len(cPath)+1) ENDIF cPath += DEF_SEP lFile := file(cPath+cFile) IF lFile; hb_fSetDateTime(cPath+cFile, @dDate, @cTime) ENDIF RETURN lFile
| работает хорошо, но как мне думается, наличие такого механизма в файловой части letodb (режим EnableFileFunc = 1) более правильное решение, которое позволит организовывать зеркальный letodb, получение изменений на localhost, в mysql, FTP, ... без открытия таблиц (по тэгу модификации dbgobottom, получение данного и закрытие таблицы), что упростит код на клиенте конечно вместо 2-х функций можно соорудить одну: leto_fDateTime(cFileName \ aFileName [, dDate \ .T. [, cTime ]]) leto_fDateTime(cFileName \ aFileName) - возвращает {dDate, cTime} или {{dDate, cTime}, ...} leto_fDateTime(cFileName \ aFileName, .T.) - ставит файлу\файлам дату, время сервера leto_fDateTime(cFileName \ aFileName, dDate, cTime) - - ставит файлу\файлам дату, время параметров наличие такого механизма позволит, попробовать использовать skipbuffer(LastRec()) с прочитанным целиком справочником и отключенной очисткой skipbuffer (вместо чтения в массив или memio) сейчас, в 2-х поточной версии letodb, работает механизм с открытием, ..., закрытием таблиц и набралось ~200 таблиц (только опрос - время) и приходится по клиенту размазывать (урезать) список, перед вых. формами весь, перед документом - связанное с этим докум., и .т.д.
|
|
|
|
| moderator
|
Пост N: 925
Зарегистрирован: 06.07.06
|
|
Отправлено: 16.04.15 10:33. Заголовок: Вроде работают тепер..
Вроде работают теперь триггеры, но, учтите, располагаться сами функции должны в letoudf.hrb. Мне не понятно, почему вы все время говорите о letodb.hrb - файл с таким именем нигде в коде сервера не упоминается. SergKis пишет: цитата: | наверное, правильно, устанавливать "свой" триггер только для нужной области (с клиента) |
|
В смысле - для нужной таблицы ? Я тоже так думаю. Установка общего триггера довольно накладна - эта процедура вызывается при всех операциях со всеми таблицами. А вот насчет "с клиента" - не соглашусь. Триггер должен быть определен только на сервере, в этом весь его смысл - чтобы он работал независимо от того, что написано в клиентской программе.
|
|
|
|
| постоянный участник
|
Пост N: 584
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 10:59. Заголовок: alkresin letodb.hrb..
alkresin letodb.hrb - это описка, конечно letoudf.hrb цитата: | А вот насчет "с клиента" - не соглашусь. Триггер должен быть определен только на сервере |
| Здесь, мы друг друга не допоняли. Триггер(ы) определен(ы) ТОЛЬКО на сервере в letoudf.hrb, но активировать (нужный) триггер для нужной таблицы - с клиента, я это имел ввиду говоря "с клиента" Общий триггер, тоже полезная штука - сейчас (в 2-х поточной версии) работает общий и для всех таблиц заполняет поля обязательные (пост был выше) - нет мороки ставить\снимать для таблиц Если выбирать, какой предпочтительней, то по моей ситуации на сегодня лучше общий - переход на новую версию безболезненный Как разграничить алгоритмы ... ? Если в ini задан Trigger - то общий, иначе с клиента, что то типа leto_SetTrigger(...)
|
|
|
|
| постоянный участник
|
Пост N: 586
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 11:52. Заголовок: alkresin пишет:Вроде..
alkresin пишет: цитата: | Вроде работают теперь триггеры |
| туплю в SIXNSX было: /* * USE command with support for TRIGGER and PASSWORD clauses */ #command USE <(db)> [VIA <rdd>] [ALIAS <a>] [<nw: NEW>] ; [<ex: EXCLUSIVE>] [<sh: SHARED>] [<ro: READONLY>] ; [CODEPAGE <cp>] [INDEX <(index1)> [, <(indexN)>]] ; [TRIGGER <trig>] [PASSWORD <pass>] => ; [Sx_SetTrigger( TRIGGER_PENDING, <trig>, <rdd> ); ] <-trig-> ; [Sx_SetPass( <pass>, 1, <rdd> ); ] <-pass-> ; dbUseArea( <.nw.>, <rdd>, <(db)>, <(a)>, ; if(<.sh.> .or. <.ex.>, !<.ex.>, NIL), <.ro.> [, <cp>] ) ; [; dbSetIndex( <(index1)> )] ; [; dbSetIndex( <(indexN)> )] как ставить ? sele 0 HB_RddInfo( RDDI_PENDINGTRIGGER, 'my_Trigger', 'LETO' ) или HB_RddInfo( RDDI_PENDINGTRIGGER, 'my_Trigger', 'DBFCDX' ) dbUseArea(.F., 'LETO', ...) разъясните, пожалуйста и в чем разница RDDI_PENDINGTRIGGER и RDDI_TRIGGER ?
|
|
|
|
| moderator
|
Пост N: 926
Зарегистрирован: 06.07.06
|
|
Отправлено: 16.04.15 12:29. Заголовок: SergKis пишет: Триг..
SergKis пишет: цитата: | Триггер(ы) определен(ы) ТОЛЬКО на сервере в letoudf.hrb, но активировать (нужный) триггер для нужной таблицы - с клиента, я это имел ввиду говоря "с клиента" |
| Насколько я понимаю предназначение триггеров, они должны работать всегда, независимо от того, активирует их или нет клиентская программа. Если вы ставите, например, триггер на добавление записи в table1 - чтобы при этом и в table2 что-то добавлялось, а в table3, например, увеличивался счетчик - то важно, чтобы это работало всегда, иначе пострадает целостность базы данных. Обеспечение целостности данных, целостности связей между таблицами, как я понимаю, одна из важнейших задач триггеров. цитата: | как ставить ? sele 0 HB_RddInfo( RDDI_PENDINGTRIGGER, 'my_Trigger', 'LETO' ) или HB_RddInfo( RDDI_PENDINGTRIGGER, 'my_Trigger', 'DBFCDX' ) dbUseArea(.F., 'LETO', ...) |
| О чем это вы ? Имя процедуры ведь на сервере в letodb.ini указывается. цитата: | и в чем разница RDDI_PENDINGTRIGGER и RDDI_TRIGGER ? |
| Честно говоря, понятия не имею.
|
|
|
|
| постоянный участник
|
Пост N: 588
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 12:58. Заголовок: alkresin пишет:О чем..
alkresin пишет: цитата: | О чем это вы ? Имя процедуры ведь на сервере в letodb.ini указывается. |
| Не увидел в текстах, где установка, потому и непонятка возникла, если как было через ini, то пошел пробовать. Спасибо.
|
|
|
|
| moderator
|
Пост N: 927
Зарегистрирован: 06.07.06
|
|
Отправлено: 16.04.15 13:54. Заголовок: По поводу RDDI_PENDI..
По поводу RDDI_PENDINGTRIGGER. Он используется в dbf1.c следующим образом: if( SELF_RDDINFO( SELF_RDDNODE( &pArea->area ), RDDI_PENDINGTRIGGER, pOpenInfo->ulConnection, pItem ) == HB_SUCCESS ) { if( HB_IS_STRING( pItem ) ) hb_dbfTriggerSet( pArea, pItem ); } if( ! pArea->fTrigger ) { if( SELF_RDDINFO( SELF_RDDNODE( &pArea->area ), RDDI_TRIGGER, pOpenInfo->ulConnection, pItem ) == HB_SUCCESS ) { if( HB_IS_STRING( pItem ) ) hb_dbfTriggerSet( pArea, pItem ); } } Т.е., при открытии таблицы сначала устанавливается он, а затем, если его не удалось установить (а это может произойти, если соответствующая функция не найдена), RDDI_TRIGGER. Мне не очень понятно, зачем это может понадобиться.
|
|
|
|
| постоянный участник
|
Пост N: 590
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.04.15 14:50. Заголовок: alkresin Спасибо..
alkresin Спасибо
|
|
|
|
| |
Пост N: 18
Зарегистрирован: 06.12.14
|
|
Отправлено: 06.05.15 13:04. Заголовок: Возникла пара вопрос..
Возникла пара вопросов после крайнего обновления. Увидел что добавилась функция Udf_Exit() Если я правильно понимаю: Udf_Init() - вызывается как при запуске сервера так и при загрузке letoudf.hrb Udf_Exit() - вызывается только при остановке сервера, но не при выгрузке letoudf.hrb Есть ли возможность добавить, что-то типа Udf_Unload() - которая будет вызываться при выгрузке letoudf.hrb когда идет команда reload.
|
|
|
|
| |
Пост N: 19
Зарегистрирован: 06.05.14
|
|
Отправлено: 06.06.15 16:36. Заголовок: Transaction
Я тестирую Leto_*Transaction: цитата: | USE (cPath + "Artikli1") ALIAS Artikli1 SHARED NEW VIA "LETO" USE (cPath + "Artikli2") ALIAS Artikli2 SHARED NEW VIA "LETO" FLock () SELECT Artikli1 Leto_BeginTransaction () GO TOP WHILE !Eof() Artikli2->(DBAppend()) Artikli2->a_naziv := Upper(a_naziv) Artikli2->a_naziv2 := Lower(a_naziv2) Artikli2->a_por := a_por + "ABC" ... SKIP END DO Leto_CommitTransaction () |
| Эта программа работает 73 секунд. Без Begin/EndTransaction работает 15 секунд. Почему это так, и может ли это быть ускорено? Спасибо, Ненад
|
|
|
|
| |
Пост N: 4877
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.06.15 16:43. Заголовок: nbatocanin Давно я ..
nbatocanin Давно я работал с LETO но попробуйте Leto_CommitTransaction () поставить до SKIP а Leto_BeginTransaction () перед Artikli2->(DBAppend())
|
|
|
|
| |
Пост N: 20
Зарегистрирован: 06.05.14
|
|
Отправлено: 07.06.15 04:41. Заголовок: Dima пишет: Давно я..
Dima пишет: цитата: | Давно я работал с LETO но попробуйте Leto_CommitTransaction () поставить до SKIP а Leto_BeginTransaction () перед Artikli2->(DBAppend()) |
| Я пробовал, когда это сделать получается 790 секунд :(
|
|
|
|
| постоянный участник
|
Пост N: 4231
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.06.15 13:00. Заголовок: nbatocanin пишет: Я..
nbatocanin пишет: цитата: | Я пробовал, когда это сделать получается 790 секунд :( |
| Попробуйте тесты, которые я сделал и проверял. - https://cloud.mail.ru/public/Lr52/WR9soGyFn TEST_DBF.hbp - терминалка сделанная SergKis. Закачивает базу на сервер супер быстро. Сборка под МиниГуи для терминалки. DbftoServer.hbp - загрузка dbf на сервер. Сборка под МиниГуи. Задание вручную параметров размера буфера транзакций.
|
|
|
|
| Администратор
|
Пост N: 3276
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.06.15 13:35. Заголовок: nbatocanin пишет: Э..
nbatocanin пишет: цитата: | Эта программа работает 73 секунд. Без Begin/EndTransaction работает 15 секунд. Почему это так, и может ли это быть ускорено? Спасибо, Ненад |
| Если транзакция большая, то желательно задать параметр для Leto_BeginTransaction([ nBlockLen ]) Это размер памяти в байтах для выделения и перевыделения памяти. Попробуйте задать этот параметр равным 16k, или больше Можно разбить большую транзакцию на несколько маленьких, по количеству добавляемых записей.
|
|
|
|
| |
Пост N: 2
Зарегистрирован: 10.01.15
|
|
Отправлено: 08.06.15 14:38. Заголовок: leto_directory
Почему leto_directory бы не вернуться имена каталога на сервере LetoDB? У меня есть 3 каталоги на сервере LetoDB но пример вернуться только один файл (test2.txt) #include "rddleto.ch" Function Main( cPath ) Local lRes, cBuf, arr, i REQUEST LETO RDDSETDEFAULT( "LETO" ) IF Empty( cPath ) cPath := "//127.0.0.1:2812/" ELSE cPath := "//" + cPath + Iif( Right(cPath,1) $ "/\", "", "/" ) ENDIF ? "Connect to " + cPath + " - " IF ( leto_Connect( cPath ) ) == -1 nRes := leto_Connect_Err() IF nRes == LETO_ERR_LOGIN ?? "Login failed" ELSEIF nRes == LETO_ERR_RECV ?? "Recv Error" ELSEIF nRes == LETO_ERR_SEND ?? "Send Error" ELSE ?? "No connection" ENDIF Return Nil ELSE ?? "Ok" ENDIF ? ? 'leto_file( "test1.txt" ) - ' ?? Iif( leto_file( cPath + "test1.txt" ), "Ok", "No" ) ? 'leto_memowrite( "test1.txt", "A test N1" ) - ' ?? Iif( leto_memowrite( cPath + "test1.txt", "A test N1" ), "Ok", "Failure" ) ? 'leto_file( "test1.txt" ) - ' ?? Iif( leto_file( cPath + "test1.txt" ), "Ok", "No" ) ? 'leto_memoread( "test1.txt" ) - ' ?? leto_memoread( cPath + "test1.txt" ) ? 'leto_frename( "test1.txt","test2.txt" ) - ' ?? Iif( leto_frename( cPath + "test1.txt","test2.txt" ) == 0, "Ok", "Failure" ) ? 'leto_file( "test1.txt" ) - ' ?? Iif( leto_file( cPath + "test1.txt" ), "Ok", "No" ) ? 'leto_file( "test2.txt" ) - ' ?? Iif( leto_file( cPath + "test2.txt" ), "Ok", "No" ) ? 'leto_fileread( "test2.txt", 7, 2 ) - ' ?? Iif( leto_fileread( cPath + "test2.txt", 7, 2, @cBuf ) > 0, cBuf, "Failure" ) ? 'leto_filewrite( "test2.txt", 7, "N2" ) - ' ?? Iif( leto_filewrite( cPath + "test2.txt", 7, "N2" ), "Ok", "Failure" ) ? 'leto_memoread( "test2.txt" ) - ' ?? leto_memoread( cPath + "test2.txt" ) ? 'leto_filesize( "test2.txt" ) - ' ?? leto_filesize( cPath + "test2.txt" ) arr := leto_directory( cPath ) ? 'leto_directory(): (' + Ltrim(Str(Len(arr))) + ")" ? "Press any key to continue..." Inkey(0) FOR i := 1 TO Len( arr ) ? arr[i,1] NEXT ? "----------" ? 'leto_ferase( "test2.txt" ) - ' ?? Iif( leto_fErase( cPath + "test2.txt" ) == 0, "Ok", "Failure" ) ? ? "Press any key to finish..." Inkey(0) Return Nil
|
|
|
|
| Администратор
|
Пост N: 3277
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.06.15 15:14. Заголовок: Добавьте при вызове ..
Добавьте при вызове функции 2-й параметр: arr := leto_directory( cPath, "D" ) и массив arr будет включать и имена каталогов.
|
|
|
|
| |
Пост N: 3
Зарегистрирован: 10.01.15
|
|
Отправлено: 08.06.15 19:31. Заголовок: спасибо! но опять не..
спасибо! но опять некоторое время возвращает пустую строку, когда вы запустите программу снова это хорошо
|
|
|
|
| Администратор
|
Пост N: 3279
Зарегистрирован: 23.05.05
|
|
Отправлено: 09.06.15 07:55. Заголовок: Дайте пожалуйста при..
Дайте пожалуйста пример
|
|
|
|
| |
Пост N: 21
Зарегистрирован: 06.05.14
|
|
Отправлено: 12.06.15 17:46. Заголовок: Pasha пишет: Pasha..
Pasha пишет: [quote]` Pasha пишет: цитата: | Если транзакция большая, то желательно задать параметр для Leto_BeginTransaction([ nBlockLen ]) Это размер памяти в байтах для выделения и перевыделения памяти. Попробуйте задать этот параметр равным 16k, или больше Можно разбить большую транзакцию на несколько маленьких, по количеству добавляемых записей. |
| Извините за задержку. Я пытался изменить этот параметр, и получил небольшое улучшение (69 секунд). Менся здесь действительно не нужно транзакции, я просто хочу, чтобы ускорить группа REPLACE команды. Я думал, что транзакции это сделать.
|
|
|
|
| |
Пост N: 22
Зарегистрирован: 06.05.14
|
|
Отправлено: 12.06.15 18:26. Заголовок: Andrey пишет: Попро..
Andrey пишет: цитата: | Попробуйте тесты, которые я сделал и проверял. - https://cloud.mail.ru/public/Lr52/WR9soGyFn TEST_DBF.hbp - терминалка сделанная SergKis. Закачивает базу на сервер супер быстро. Сборка под МиниГуи для терминалки. DbftoServer.hbp - загрузка dbf на сервер. Сборка под МиниГуи. Задание вручную параметров размера буфера транзакций. |
| Очень интересные и полезные примеры! Спасибо!
|
|
|
|
| |
Пост N: 23
Зарегистрирован: 06.05.14
|
|
Отправлено: 12.06.15 18:47. Заголовок: Unrecoverable error 6005
У меня есть проблемы с одной программе (Win 2003 Server, XP станций). 4-5 раза в день распространенная ошибка: цитата: | Application Internal Error - G:\Firma\App.exe Terminated at: 2015.05.12 12:41:40 Unrecoverable error 6005: Exception error: Exception Code:C0000005 Exception Address:00417CEB EAX:00000001 EBX:01D21768 ECX:01440407 EDX:00000068 ESI:0022ED7C EDI:00000000 EBP:00000001 CS:EIP:001B:00417CEB SS:ESP:0023:0022ED40 DS:0023 ES:0023 FS:003B GS:0000 Flags:00010246 CS:EIP: 8B 5F 04 89 34 24 89 5C 24 04 E8 AE 23 34 00 85 SS:ESP: 01440468 0022ED54 00000000 4020063C 00001FFD 01D30CE8 00000000 00000000 01443848 00000000 0022EE1C 004A1A5C 0089B98D 00762F80 0024BC70 00000068 C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... Modules: 0x00400000 0x00A96000 G:\Firma\App.exe 0x7C900000 0x000B2000 C:\WINDOWS\system32\ntdll.dll 0x7C800000 0x000F6000 C:\WINDOWS\system32\kernel32.dll 0x77DD0000 0x0009B000 C:\WINDOWS\system32\ADVAPI32.DLL 0x77E70000 0x00093000 C:\WINDOWS\system32\RPCRT4.dll 0x77FE0000 0x00011000 C:\WINDOWS\system32\Secur32.dll 0x763B0000 0x00049000 C:\WINDOWS\system32\COMDLG32.DLL 0x5D090000 0x0009A000 C:\WINDOWS\system32\COMCTL32.dll 0x77F10000 0x00049000 C:\WINDOWS\system32\GDI32.dll 0x7E410000 0x00091000 C:\WINDOWS\system32\USER32.dll 0x7C9C0000 0x00818000 C:\WINDOWS\system32\SHELL32.dll 0x77C10000 0x00058000 C:\WINDOWS\system32\msvcrt.dll 0x77F60000 0x00077000 C:\WINDOWS\system32\SHLWAPI.dll 0x774E0000 0x0013E000 C:\WINDOWS\system32\OLE32.dll 0x77120000 0x0008B000 C:\WINDOWS\system32\OLEAUT32.DLL 0x77C00000 0x00008000 C:\WINDOWS\system32\VERSION.dll 0x73000000 0x00026000 C:\WINDOWS\system32\WINSPOOL.DRV 0x71AB0000 0x00017000 C:\WINDOWS\system32\WS2_32.dll 0x71AA0000 0x00008000 C:\WINDOWS\system32\WS2HELP.dll 0x76390000 0x0001D000 C:\WINDOWS\system32\IMM32.DLL 0x773D0000 0x00103000 C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.6028_x-ww_61e65202\comctl32.dll 0x71A50000 0x0003F000 C:\WINDOWS\system32\mswsock.dll 0x662B0000 0x00058000 C:\WINDOWS\system32\hnetcfg.dll 0x71A90000 0x00008000 C:\WINDOWS\System32\wshtcpip.dll 0x5AD70000 0x00038000 C:\WINDOWS\system32\uxtheme.dll 0x74720000 0x0004C000 C:\WINDOWS\system32\MSCTF.dll 0x755C0000 0x0002E000 C:\WINDOWS\system32\msctfime.ime 0x01870000 0x002C5000 C:\WINDOWS\system32\xpsp2res.dll 0x76360000 0x00010000 C:\WINDOWS\system32\WINSTA.dll 0x5B860000 0x00055000 C:\WINDOWS\system32\NETAPI32.dll Called from DBSEEK(0) Called from KARZAT(0) in KAR.PRG Called from MAIN(0) in app.prg |
| Ошибка не всегда то же самое, но это всегда связано с такими командами, как DbSeek, Skip.... Идентичные программа работает нормально, когда не используется Letodb.
|
|
|
|
| moderator
|
Пост N: 950
Зарегистрирован: 06.07.06
|
|
Отправлено: 17.06.15 12:09. Заголовок: nbatocanin пишет: У..
nbatocanin пишет: цитата: | У меня есть проблемы с одной программе |
| А другие программы, использующие LetoDB, работают нормально ? Может, что-то не так в сборке программы ( rddleto, например, собранная другой версией С компилятора ). У меня много разных программ работают с LetoDb, но такого не припомню. Сервер, бывает, слетает иногда, а клиент по internel error - нет.
|
|
|
|
| |
Пост N: 24
Зарегистрирован: 06.05.14
|
|
Отправлено: 17.06.15 17:03. Заголовок: Только что проверил:..
Только что проверил: это происходит в других программах (нет на одном сервере!), но не так часто (раз в десять дней). Я использую HB 3.2 и minGW компилятор. Программа очень большая (12.5MB). Я заметил, что в варианты Share_Tables = 1 есть некоторые проблемы, которые не появляются, если использует Share_Tables = 0. Теперь я использую Share_Tables = 0, программа работает хорошо, но, возможно, потому происходят 6005 ошибки. Рассмотрим это в деталях. Спасибо, Ненад
|
|
|
|
| |
Пост N: 4908
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.06.15 17:12. Заголовок: nbatocanin Это все ..
nbatocanin Это все ГУГЛ Переводчик переводил ?
|
|
|
|
| |
Пост N: 25
Зарегистрирован: 06.05.14
|
|
Отправлено: 19.06.15 04:51. Заголовок: Dima пишет: Это все..
Dima пишет: цитата: | Это все ГУГЛ Переводчик переводил ? |
| Нет :) Я использую Google, но исправляю перевод, когда вижу что он не хорошый. Я надеюсь что вы понимаете меня?
|
|
|
|
| постоянный участник
|
Пост N: 4380
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.07.15 17:11. Заголовок: Всем привет. Не соби..
|
|
|
|
| Администратор
|
Пост N: 3318
Зарегистрирован: 23.05.05
|
|
Отправлено: 13.07.15 18:25. Заголовок: В makefile.linux доб..
В makefile.linux добавлена библиотека hbct. Для сборки сервера она не нужна. Она нужна при использовании функций вроде lton, ну так это уже неформат. Мало ли какие нестандартные библиотеки используются. В стандартный скрипт ее добавлять незачем. Еще зачем-то добавлена библиотека hbpcre. Вообще сервер лучше собирать с помощью hbmk2. makefile.linux это архаизм, сохранился с тех времен, когда letodb.hbp еще не было. Что касается letoudf.linux, то добавлять его, чтобы продемонстрировать опцию -gh, которая для сборки hrb подразумевается сама собой, тоже вроде бы незачем.
|
|
|
|
| постоянный участник
|
Пост N: 4381
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.07.15 22:42. Заголовок: Pasha пишет: В стан..
Pasha пишет: цитата: | В стандартный скрипт ее добавлять незачем |
| Понятно...
|
|
|
|
| Администратор
|
Пост N: 3322
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.07.15 17:37. Заголовок: CVS не пашет ? 2-й д..
CVS не пашет ? 2-й день хочу загрузить кое-какие обновления, и... облом
|
|
|
|
| постоянный участник
|
Пост N: 775
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.07.15 17:52. Заголовок: У меня тоже...
У меня тоже.
|
|
|
|
| Администратор
|
Пост N: 3323
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.07.15 15:20. Заголовок: На сайте sf глухо, п..
На сайте sf глухо, поиск не дает результатов. Может кто знает, кому жаловаться ? Писать в спортлото ?
|
|
|
|
| Администратор
|
Пост N: 3324
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.07.15 17:11. Заголовок: Судя этой по статист..
Судя этой по статистике: http://sourceforge.net/projects/letodb/files/stats/timeline загрузки с CVS есть, и сегодня, и во вторник-среду. А у меня CVS не работает, ни через :ext:myname, ни через :pserver:anonymous. Пробовал с разных компьютеров. Так есть доступ к CVS или нет ? Кто может подтвердить ?
|
|
|
|
| постоянный участник
|
Пост N: 1121
Зарегистрирован: 27.01.07
|
|
Отправлено: 31.07.15 18:30. Заголовок: Pasha пишет: Так ес..
Pasha пишет: цитата: | Так есть доступ к CVS или нет ? Кто может подтвердить ? |
| Если я использовал правильную команду, то нет:
|
|
|
|
| Администратор
|
Пост N: 3326
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.08.15 23:25. Заголовок: https://www.youtube...
|
|
|
|
| |
Пост N: 28
Зарегистрирован: 06.05.14
|
|
Отправлено: 02.10.15 04:44. Заголовок: ошибка
Я нашел серьезную ошибку в версии 2.16.b1: USE Test INDEX test NEW SET ORDER TO GO TOP ? IndexOrd() // 1 !!!!
|
|
|
|
| постоянный участник
|
Пост N: 830
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.10.15 10:48. Заголовок: nbatocanin LetoUdf...
nbatocanin LetoUdf.prg FUNCTION UDF_Init /* * This function called immediately after loading letoudf.hrb, if exist */ SET AUTORDER TO 1 RETURN Nil ...
|
|
|
|
| Администратор
|
Пост N: 3346
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.10.15 13:50. Заголовок: Я нашел серьезную о..
цитата: | Я нашел серьезную ошибку в версии 2.16.b1: USE Test INDEX test NEW SET ORDER TO GO TOP ? IndexOrd() // 1 !!!! |
| Я не могу воспроизвести эту ошибку. В моем тесте выдается результат 0, как и должно быть
|
|
|
|
| |
Пост N: 29
Зарегистрирован: 06.05.14
|
|
Отправлено: 03.10.15 01:49. Заголовок: Это тест программа: ..
Это тест программа: цитата: | REQUEST LETO PROC Main RddSetDefault ("LETO") cPath := "//192.168.99.10:2807/Test/" Leto_Connect (cPath) ? LETO_GETSERVERVERSION() USE (cPath + "ProTip") NEW SET INDEX To (cPath + "ProTip") GO TOP ? "ORDER", IndexOrd() SET ORDER TO GO TOP ? "SET ORDER TO", IndexOrd() RETURN |
| При использовании v2.15: Leto DB Server v.2.15 ORDER 1 SET ORDER TO 0 А при использовании версии 2.16b1 Leto DB Server v.2.16b1 ORDER 1 SET ORDER TO 1
|
|
|
|
| |
Пост N: 30
Зарегистрирован: 06.05.14
|
|
Отправлено: 11.10.15 19:17. Заголовок: Пожалуйста, попробуй..
Пожалуйста, попробуйте этот тест программ. Версия 2.16 не работает правильно. Я использую DBFNTX индексов. https://drive.google.com/file/d/0BwEGIJ1QfjrKN0FOTXJ0MHFpSUE/view?usp=sharing Server: Leto DB Server v.2.15b2 Client: 2.15b2 ORDER: 1 SET ORDER TO 1: 1 SET ORDER TO : 0 SET ORDER TO 0: 0 Server: Leto DB Server v.2.16b1 Client: 2.16b1 ORDER: 1 SET ORDER TO 1: 1 SET ORDER TO : 1 SET ORDER TO 0: 1 Спасибо, Ненад
|
|
|
|
| |
Пост N: 31
Зарегистрирован: 06.05.14
|
|
Отправлено: 11.10.15 19:23. Заголовок: Приложение: при изме..
Приложение: при изменении клиента, все работает правильно. Кажется чтобы быть ошибка в клиенте 2.16: Server: Leto DB Server v.2.16b1 Client: 2.15b2 ORDER: 1 SET ORDER TO 1: 1 SET ORDER TO : 0 SET ORDER TO 0: 0
|
|
|
|
| Администратор
|
Пост N: 3347
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.10.15 09:01. Заголовок: После последнего обн..
После последнего обновления команда set order to работает правильно ? Версия клиента 2.17
|
|
|
|
| |
Пост N: 32
Зарегистрирован: 06.05.14
|
|
Отправлено: 12.10.15 17:47. Заголовок: Работает, спасибо бо..
Работает, спасибо большое!!
|
|
|
|
| |
Пост N: 33
Зарегистрирован: 06.05.14
|
|
Отправлено: 17.10.15 03:42. Заголовок: Leto_Zip
Тестирование Leto_Zip. Файлы находятся в base\data\101. Когда я создаю Arhiva.zip, каждый файл в каталоге base\data\101. Есть ли можно сделать Arhiva.zip только с файлами? Ненад
|
|
|
|
| |
Пост N: 34
Зарегистрирован: 06.05.14
|
|
Отправлено: 17.10.15 16:19. Заголовок: Я не хорошо объясняе..
Я не хорошо объясняется. Я хотел сказать, что каждый файл формата: base/data/101/f001.dbf base/data/101/f002.dbf base/data/101/f003.dbf ... и я хочу, чтобы быть: f001.dbf f002.dbf f003.dbf ...
|
|
|
|
| |
Пост N: 35
Зарегистрирован: 06.05.14
|
|
Отправлено: 23.10.15 04:08. Заголовок: Leto_FileRead
Я думаю, что есть ошибка в Leto_FileRead. При запуске этой программы: nLen := Leto_FileSize (cFile) cBuf := Space(nLen) n := Leto_FileRead (cFile, 0, nLen, @cBuf) получает сообщение об ошибке: Unrecoverable error 6005: Exception error: Это происходит только на некоторых файлов! Например, попробуйте этот файл: https://drive.google.com/file/d/0BwEGIJ1QfjrKYk1aQk9SVXZlYWs/view?usp=sharing Если он читает меньше, чем nLen, все работает как надо: nLen := Leto_FileSize (cFile) cBuf := Space(nLen) n := Leto_FileRead (cFile, 0, nLen-1, @cBuf)
|
|
|
|
| |
Пост N: 36
Зарегистрирован: 06.05.14
|
|
Отправлено: 28.10.15 04:22. Заголовок: Может кто-нибудь про..
Может кто-нибудь проверить это? В настоящее время это не возможно, чтобы скопировать файлы с сервера к клиенту. Я пытался использовать Leto_MemoRead, но это не будет работать, если большой файл. спасибо, Ненад
|
|
|
|
| постоянный участник
|
Пост N: 4554
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.10.15 22:20. Заголовок: nbatocanin пишет: Я..
nbatocanin пишет: цитата: | Я пытался использовать Leto_MemoRead, но это не будет работать, если большой файл. |
| Делай частями. Размер части (буфер обмена) опредили методом проб и ошибок: 32Кб, 64КбБ 1.2Мб и так далее. Как программа начнёт вылетать, так и используй буфер до вылета. Сам еще не пробовал.
|
|
|
|
| |
Пост N: 37
Зарегистрирован: 06.05.14
|
|
Отправлено: 29.10.15 01:35. Заголовок: Если вы думаете о фу..
Если вы думаете о функции Leto_FileRead(), я уже пробовал это. Независимо от параметров Leto_FileRead не работает всегда правильно. В некоторых случаях работает, но, очевидно, есть ошибка.
|
|
|
|
| постоянный участник
|
Пост N: 1174
Зарегистрирован: 27.01.07
|
|
Отправлено: 31.10.15 14:03. Заголовок: nbatocanin пишет: М..
nbatocanin пишет: цитата: | Может кто-нибудь проверить это? |
| Да, у меня так же.
|
|
|
|
| Администратор
|
Пост N: 3350
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.10.15 16:43. Заголовок: Попробуйте после сег..
Попробуйте после сегодняшнего обновления
|
|
|
|
| |
Пост N: 38
Зарегистрирован: 06.05.14
|
|
Отправлено: 02.11.15 03:46. Заголовок: Первоначальные тесты..
Первоначальные тесты - работает.
|
|
|
Ответов - 191
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|