Автор | Сообщение |
alkresin
|
| moderator
|
Пост N: 31
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.01.08 11:36. Заголовок: Leto DB Server (продолжение)
Только что открыл на Sourceforge новый проект - Leto DB Server - https://sourceforge.net/projects/letodb Это мультиплатформенный ( Windows, Unix/Linux ) сервер баз данных, предоставляющий клиентским программам доступ к dbf/cdx файлам, находящимся на удаленном сервере ( можно и на локальном компьютере запускать - в отладочных целях ). В общем, как ADS :). Проект - на стадии разработки, не все даже базовые функции еще реализованы, до оптимизации дело еще не дошло. Но работает :). Крутится у меня на сервере несколько дней, подключал до 15 клиентов, пока не падает. Мои программы работают с ним нормально. Преимущества по сравнению с обычным файл-сервером: 1) Безопасность - базы могут быть в каталоге, недоступном для клиентских компьютеров - никто их случайно не удалит и не повредит. 2) Поскольку базы открываются серверной программой, а не клиентской, ее целостности ничего не грозит при случайном отключении клиентского компьютера. 3) значительное уменьшение сетевого траффика. 4) Должен быть, по идее, выигрыш в скорости. 5) Возможность контроля за пользователями с помощью утилиты manage ( можно придумать и другие формы контроля ). 6) Можно будет сделать транзакции, stored procedures на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.
|
|
|
Ответов - 316
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|
Andrey
|
| постоянный участник
|
Пост N: 1368
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.10 12:07. Заголовок: Случайно нашел: http..
|
|
|
alkresin
|
| moderator
|
Пост N: 328
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.06.10 14:01. Заголовок: Pasha пишет: Алекса..
Pasha пишет: цитата: | Александр, посмотрите пожалуйста такой случай Перед транзакцией запись удалена |
| Сделал такой тест: Function Main Local cPath := "//127.0.0.1:2812/" REQUEST LETO RDDSETDEFAULT( "LETO" ) ? "Start" dbCreate( cPath+"Nakl1", { {"NORD","N",10,0} } ) use ( cPath+"Nakl1" ) New append blank replace nord with 10 append blank replace nord with 20 unlock go top delete ? "Deleted ?", deleted() skip(1) go top ? "Deleted ?", deleted() leto_BeginTransaction() dbRecall() leto_CommitTransaction() ? "Deleted ?", deleted() ? Return Nil Результат: Deleted ? .T. Deleted ? .T. Deleted ? .F. Вроде, все правильно работает ...
|
|
|
Pasha
|
| Администратор
|
Пост N: 1491
Зарегистрирован: 23.05.05
|
|
Отправлено: 09.06.10 14:07. Заголовок: Значит, есть еще как..
Значит, есть еще какой-то фактор, вилияющий на этот флажок У меня этот глюк проявляется в большой транзакции. Я покопаюсь еще и попробую выяснить, в чем дело
|
|
|
alkresin
|
| moderator
|
Пост N: 329
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.06.10 08:28. Заголовок: Pasha, мне кажется, ..
Pasha, мне кажется, вы что-то не так сделали при последних исправлениях в реализации leto_intro - портится формат даты. Теперь, если во время сеанса работы открывались таблицы ( при этом вызывается setuserenv ), во всех последующих записях в журнал, в т.ч. при остановке сервера, вместо даты пишется ;F. Это ведь и на выполнение операций, связанных с датой, может влиять.
|
|
|
alkresin
|
| moderator
|
Пост N: 330
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.06.10 08:50. Заголовок: Я разделил letofunc...
Я разделил letofunc.c на 2 файла - выделил в letocore.c ядро, те функции, которые организуют работу сервера. Предлагаю построить работу по созданию нового ядра следующим образом: 1. Создать новый файл ( cernel2.c, например ), где будет реализована та же схема использования потоков, что и сейчас, только методами Harbour mt. В любом случае у нас будет поток, принимающий соединения и, как минимум один, поток, исполняющий RDD операции, так что это будет нормальная база для дальнейшей работы. 2. Отлаживаем - чтоб работало стабильно и с не меньшей производительностью, чем действующий вариант, без этого дальше идти нет смысла. 3. Прорабатываем и реализуем схему взаимодействия дополнительных потоков.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1492
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.06.10 10:49. Заголовок: alkresin пишет: Pas..
alkresin пишет: цитата: | Pasha, мне кажется, вы что-то не так сделали при последних исправлениях в реализации leto_intro - портится формат даты. Теперь, если во время сеанса работы открывались таблицы ( при этом вызывается setuserenv ), во всех последующих записях в журнал, в т.ч. при остановке сервера, вместо даты пишется ;F. Это ведь и на выполнение операций, связанных с датой, может влиять. |
| Дело оказалось не в последних исправлениях Раньше этот код: if( nParam > 5 ) { if( ( ptr = strchr( pp1, ';' ) ) != NULL ) { *ptr = '\0'; pUStru->cdpage = hb_cdpFind( pp1 ); pp1 = ptr + 1; if( ( ptr = strchr( pp1, ';' ) ) != NULL ) { if( pUStru->szDateFormat ) hb_xfree( pUStru->szDateFormat ); pUStru->szDateFormat = (char*) hb_xgrab( ptr - pp1 + 1 ); memcpy( pUStru->szDateFormat, ptr, ptr - pp1 ); pUStru->szDateFormat[ptr-pp1] = '\0'; if( *(ptr + 1) == ';') pUStru->bCentury = (*(ptr + 2) == 'T' ? TRUE : FALSE); } } } игнорировался, а теперь он отрабатывается. А в нем ошибка: вместо memcpy( pUStru->szDateFormat, ptr, ptr - pp1 ); надо memcpy( pUStru->szDateFormat, pp1, ptr - pp1 ); Действительно серьезная ошибка, приведет к тому, что DTOC() в фильтрах и индексах на сервере не будет работать Я смогу исправить на CVS только вечером, так что есть есть возможность - поправьте
|
|
|
Pasha
|
| Администратор
|
Пост N: 1493
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.06.10 11:01. Заголовок: Кстати, а как закрыв..
Кстати, а как закрывается letodb при выключении сервера (windows) ? Я смотрю, в логе нет записи про останов сервера
|
|
|
alkresin
|
| moderator
|
Пост N: 331
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.06.10 11:19. Заголовок: Я смогу исправить на..
цитата: | Я смогу исправить на CVS только вечером, так что есть есть возможность - поправьте |
| Спасибо за информацию. Поправлю. цитата: | Кстати, а как закрывается letodb при выключении сервера (windows) ? |
| Боюсь, что никак. Я его использую под Линуксом и там у меня прописан стандартный скрипт для запуска/остановки служб. А под Windows надо, наверное, обработку сигнала соответствующего сделать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1494
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.06.10 14:29. Заголовок: Александр, помогите ..
Александр, помогите пожалуйста исправить ошибку, связанную с relations: Сэлф-контайнед такой: Local nId dbCreate("Table1", {{'id', 'N', 8, 0}}) dbCreate("Table2", {{'id', 'N', 8, 0},{'Name','C',20,0}}) USE table1 new shared INDEX ON id TAG table1 USE table2 new shared INDEX ON id TAG table2 for nId := 1 to 100 table1->(dbAppend()) table1->Id := nId table2->(dbAppend()) table2->Id := nId next table1->(dbCommit(), dbUnlock()) table2->(dbCommit(), dbUnlock()) select table1 dbSetRelation( "table2", {|| id}, "id" ) seek 2 //Если снять комментарий со следующего оператора (чтение любого поля table2), ошибка исчезает //? table2->Id if table2->(RLock()) table2->Name := '1' ? table2->(dbRecordInfo(2)) // .T. // запись как будто блокирована, но table2->(dbCommit()) // ошибка endif На клиенте flush выдает команду "upd", и ошибка возникает на сервере в UpdateRec: if( ( !pTA || ulRecNo ) && pAStru->pTStru->bShared && !pAStru->bLocked && leto_IsRecLocked( pAStru, ulRecNo ) != 1 ) { /* The table is opened in shared mode, but the record isn't locked */ if( !pTA ) hb_xvmSeqEnd(); return 4; }
|
|
|
Pasha
|
| Администратор
|
Пост N: 1495
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.06.10 14:49. Заголовок: alkresin пишет: ци..
alkresin пишет: цитата: | цитата: Кстати, а как закрывается letodb при выключении сервера (windows) ? Боюсь, что никак. Я его использую под Линуксом и там у меня прописан стандартный скрипт для запуска/остановки служб. А под Windows надо, наверное, обработку сигнала соответствующего сделать. |
| В xHarbour наверное можно воспользоваться функцией: HB_PushSignalHandler( HB_SIGNAL_QUIT, "Handle" ) ... Function Handle( nSignal, aParams ) IF nSignal == HB_SIGNAL_QUIT ... а какой аналог есть в Harbour ? Эту обработку делать только для windows ?
|
|
|
alkresin
|
| moderator
|
Пост N: 332
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.06.10 16:05. Заголовок: Александр, помогите ..
цитата: | Александр, помогите пожалуйста исправить ошибку, связанную с relations: |
| Исправил. Там при блокировке запись в дочерней area не устанавливалась предварительно в соответствие с родительской. Кстати, такая же ерунда может и при replace для этой записи произойти. цитата: | а какой аналог есть в Harbour ? Эту обработку делать только для windows ? |
| 1)Не знаю, не смотрел 2)По-хорошему, и для Линукс надо - не все ведь правильно letodb установят.
|
|
|
|
Pasha
|
| Администратор
|
Пост N: 1496
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.06.10 16:11. Заголовок: alkresin пишет: Исп..
|
|
|
Pasha
|
| Администратор
|
Пост N: 1497
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.06.10 16:51. Заголовок: Наверное, надо бы пе..
Наверное, надо бы переделать генерацию ошибок на клиенте, и соответственно передачу полной информации об ошибке с сервера А то сейчас вместо lock required получаем data type error. Делаем ?
|
|
|
alkresin
|
| moderator
|
Пост N: 333
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.06.10 18:52. Заголовок: Наверное, надо бы пе..
цитата: | Наверное, надо бы переделать генерацию ошибок на клиенте, и соответственно передачу полной информации об ошибке с сервера |
| Да, конечно, дело нужное.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 1369
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.06.10 23:22. Заголовок: Pasha пишет: Кстати..
Pasha пишет: цитата: | Кстати, а как закрывается letodb при выключении сервера (windows) ? Я смотрю, в логе нет записи про останов сервера |
| alkresin пишет: цитата: | А под Windows надо, наверное, обработку сигнала соответствующего сделать. |
| Вот, вот я об этом в самом начале писал ! Сидит процесс в Windows'e и только ручками можно удалить. Не по правилам сделано. Нужно наверно как у всех в трее сделать, чтоб останавливать можно было ! А для терминала, тоже запрос нужно делать, а не по ESC - чтоб отключался....
|
|
|
alkresin
|
| moderator
|
Пост N: 335
Зарегистрирован: 06.07.06
|
|
Отправлено: 11.06.10 08:04. Заголовок: Вот, вот я об этом в..
цитата: | Вот, вот я об этом в самом начале писал ! Сидит процесс в Windows'e и только ручками можно удалить. Не по правилам сделано. Нужно наверно как у всех в трее сделать, чтоб останавливать можно было ! |
| В трэй его можно посадить только средствами одной из GUI оболочек. Вы хотите, чтобы я всех принудительно посадил на HwGUI ? Если нужна такая штука, напишите маленькую GUI утилиту теми инструментами, которые вы используете ( HwGUI, MiniGui, Fivewin, ... ) - чтобы она запускала и останавливала сервер ( letodb, letodb stop ). Еще одно преимущество такого решения - сам сервер избавлен от необходимости обрабатывать сообщения, идущие на его окно и занимается исключительно своими непосредственными задачами. цитата: | А для терминала, тоже запрос нужно делать, а не по ESC - чтоб отключался.... |
| Вы имеете ввиду сервер, скомпилированный с __CONCOLE__ ? Это ж экспериментальный режим, использовавшийся только на начальной стадии разработки. Забудьте про него.
|
|
|
alx_on
|
| постоянный участник
|
Пост N: 79
Зарегистрирован: 07.07.09
|
|
Отправлено: 11.06.10 12:50. Заголовок: alkresin пишет: Пре..
alkresin пишет: цитата: | Предлагаю построить работу по созданию нового ядра следующим образом |
| Поддерживаю PS я не потерялся, просто офис переезжает (и я вместе с ним :) ) в выходные включусь в обсуждения и доработку
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 1370
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.06.10 12:55. Заголовок: alkresin пишет: Еще..
alkresin пишет: цитата: | Еще одно преимущество такого решения - сам сервер избавлен от необходимости обрабатывать сообщения, идущие на его окно и занимается исключительно своими непосредственными задачами. |
| Спасибо, понял.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1499
Зарегистрирован: 23.05.05
|
|
Отправлено: 11.06.10 14:42. Заголовок: alkresin пишет: Есл..
alkresin пишет: цитата: | Если нужна такая штука, напишите маленькую GUI утилиту теми инструментами, которые вы используете ( HwGUI, MiniGui, Fivewin, ... ) - чтобы она запускала и останавливала сервер ( letodb, letodb stop ). |
| Можно сделать такую утилитку средствами hwgui, и положить ее в letodb\utils В связи с этим обьявляется конкурс на иконку для letodb-tray
|
|
|
Pasha
|
| Администратор
|
Пост N: 1500
Зарегистрирован: 23.05.05
|
|
Отправлено: 11.06.10 16:46. Заголовок: Pasha пишет: Значит..
Pasha пишет: цитата: | Значит, есть еще какой-то фактор, вилияющий на этот флажок У меня этот глюк проявляется в большой транзакции. Я покопаюсь еще и попробую выяснить, в чем дело |
| Докладываю. Вот в таком случае: Local nId dbCreate("Table1", {{'id', 'N', 8, 0}}) use table1 shared for nId := 1 to 10 table1->(dbAppend()) table1->Id := nId next go top if RLock() leto_BeginTransaction() dbDelete() skip skip -1 dbCommit() leto_CommitTransaction() dbUnlock() endif ? RecNo(), Deleted() // .F. skip skip -1 ? RecNo(), Deleted() // .T. флажок deleted() возвращается неправильный
|
|
|
Ответов - 316
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|