On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
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 на Харборе, ... и вообще все в наших руках :).

Кто хочет участвовать в разработке, тестировании - пишите.



Спасибо: 0 
Профиль
Ответов - 316 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All [только новые]


Pasha
Администратор




Пост N: 1529
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.06.10 11:32. Заголовок: Pasha пишет: Оптими..


Pasha пишет:

 цитата:
Оптимизация вызовов

dbCommit()
dbUnlock()



Надо все-таки реализовать на клиенте pLocksPos, тем более это все равно нужно. Тогда при вызове flush (если установлен флажок) можно будет делать сразу unlock. А при unlock проверять на клиенте pLocksPos, и, если он пуст, ничего не делать

В результате мы получим один пакет при обновлении данных вместо трех

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1530
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.06.10 12:21. Заголовок: Я смотрю, в leto_Put..


Я смотрю, в leto_PutRec после

if( bTransActive )

нет вызова

free( szData );

наверное, он нужен

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 354
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 23.06.10 15:53. Заголовок: нет вызова free( szD..



 цитата:
нет вызова
free( szData );
наверное, он нужен


Да.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 355
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 23.06.10 16:03. Заголовок: Надо все-таки реализ..



 цитата:
Надо все-таки реализовать на клиенте pLocksPos, тем более это все равно нужно. Тогда при вызове flush (если установлен флажок) можно будет делать сразу unlock. А при unlock проверять на клиенте pLocksPos, и, если он пуст, ничего не делать


Это хорошо, если программист пишет строго "как в книжке рекомендовано". А если он почему-то после commit опять начнет корректировать данные ?

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1531
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 23.06.10 16:19. Заголовок: alkresin пишет: Это..


alkresin пишет:

 цитата:
Это хорошо, если программист пишет строго "как в книжке рекомендовано". А если он почему-то после commit опять начнет корректировать данные ?



Так инструмент дается тому, кто понимает, зачем он нужен и как его использовать. А если не понимает - проблемы индейцев шерифу безразличны. Кто не понимает, тот пусть не устанавливает этот флажок.

Пусть это будет функция вида:

Leto_UnlockOptimize( lOn/lOff )

и использование будет рекомендовано так:

Leto_UnlockOptimize( .t. )
dbCommit()
dbUnlock()
Leto_UnlockOptimize( .f. )


Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 356
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 23.06.10 20:39. Заголовок: и использование буде..



 цитата:
и использование будет рекомендовано так:

Leto_UnlockOptimize( .t. )
dbCommit()
dbUnlock()
Leto_UnlockOptimize( .f. )



Тогда уж лучше какая-нибудь leto_Unlock() вместо этих четырех строк.


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 1378
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.06.10 21:51. Заголовок: А как по коду можно ..


А как по коду можно определить какой драйвер используется ?
Т.е. LetoDB() или стандартный CDX ?

Хочется иметь в одной задаче ОДНОВРЕМЕННО ДВА драйвера !!!
Т.е. иметь локальный вариант и файл-серверный и LetoDB-драйвер.
Соответственно в коде нужно будет тогда делать условия обработки:
1) для CDX
2) для LetoDB


Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1532
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 09:51. Заголовок: Andrey пишет: Хочет..


Andrey пишет:

 цитата:
Хочется иметь в одной задаче ОДНОВРЕМЕННО ДВА драйвера !!!



Да хоть 10 драйверов можно подключать. В dbUseArea 2-й параметр - это используемый rdd. Можно указаль LETO, или DBFCDX, или что угодно. Параметр есть и в dbCreate
А проверка, какой драйвер используется в рабочей области - вызов RddName()

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1533
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 10:00. Заголовок: Есть таблица размеро..


Есть таблица размером 62М, 620 тыс. записей
Создается тэг, в нем 3 индекса.
Если запущен letodbtray, который здесь дал SashaBG, то при создании индекса может возникать ошибка:

Create error (1-1081):

1081 - это argument error +

Если не запущен letodbtray, то ошибка не возникает. letodbtray с интервалом в 1 сек вызывает leto_connect для проверки, жив ли сервер. Время индексации - примерно 10 сек.
Я в лог добавляю аргументы при ошибке и вижу:

24.06.10 09:44:21: Create error (1-1081):
Arguments: ( [ 1] = Type: C Val: 08232078, [ 2] = Type: N Val: 0)carecs.CDX

индексное выражение для 1-го индекса такое:

Stock+Code+DTOS(Date)+NDT

1-й аргумент "08232078" - это как раз Stock+Code. 2-й аргумент - это результат DTOS(), который нулем буть никак не может, но тем не менее...

Т.е., вызов leto_connect() каким-то образом прерывает индексацию
Сервер при этом не падает.
PS Ошибка при LTrim - похоже из этой же серии, когда аргумент не может быть числовым, но тем не менее им оказывается.


Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1534
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 10:24. Заголовок: Т.е., вызов leto_con..


Т.е., вызов leto_connect() с другого клиента портит стек харбора

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1535
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 10:38. Заголовок: Сервер был собран с ..


Сервер был собран с xHarbour
С Harbour ошибка возникает намного реже, но все равно возникает. С Harbour индексация выполняется немного быстрее, так что коллизия возникает реже

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1537
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 11:21. Заголовок: Я использую xHarbour..


Я использую xHarbour с кодовой страницей RU1251
Сейчас она называется RUWIN
Если использовать клиенты xHb с сервером letodb, собранным с Harbour, то где-то надо транслировать имя кодовой страницы
Подскажите красивое решение, где это лучше сделать.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1538
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 11:30. Заголовок: Pasha пишет: Т.е., ..


Pasha пишет:

 цитата:
Т.е., вызов leto_connect() с другого клиента портит стек харбора



Может быть, дело в вызове hb_retni() в функции hb_ipclose() ?
Он там не нужен, его можно перенести в HB_FUNC( HB_IPCLOSE )

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1539
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 24.06.10 11:40. Заголовок: Да, дело именно в эт..


Да, дело именно в этом, лечение помогло, теперь полет нормальный
Надо еще пересмотреть остальные hb_ret* в этом модуле
Может, и проблема alx_on в этом состояла

Спасибо: 1 
Профиль
alkresin
moderator


Пост N: 357
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 24.06.10 16:04. Заголовок: Да, дело именно в эт..



 цитата:
Да, дело именно в этом, лечение помогло, теперь полет нормальный


Здорово! Нашлась ошибка, которая реально могла доставлять проблемы.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 358
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 25.06.10 09:03. Заголовок: Если использовать кл..



 цитата:
Если использовать клиенты xHb с сервером letodb, собранным с Harbour, то где-то надо транслировать имя кодовой страницы


По-видимому, надо в строчку с версией, передаваемой клиенту при соединении, включить информацию о том, чем собран сервер ( Harbour/xHarbour ), тогда клиент при необходимости может, в соответствии с хранящейся у него таблицей, подменить название кодовой страницы.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1540
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 25.06.10 11:22. Заголовок: Хочется добавить в A..


Хочется добавить в AREASTRU на сервере клиентский алиас таблицы
Это понадобится в дальнейшем для выполнения клиентских процедур на сервере. Можно следать на сервере функцию, которая бы возвращала реальный алиас по клиентскому в окружении текущего пользователя, чтобы затем в процедуре по нему обращаться к таблице
Для начала можно сделать хотя бы триггеры, тем более dbfcdx их поддерживает

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 359
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 25.06.10 14:48. Заголовок: Хочется добавить в A..



 цитата:
Хочется добавить в AREASTRU на сервере клиентский алиас таблицы


Да, надо добавить. Мне даже казалось, что он уже где-то хранится, потому что задумка такая была.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1541
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.06.10 10:46. Заголовок: Выявил и устранил ещ..


Выявил и устранил еще один неприятный глючек
Блокируем запись по rlock
Затем перемещаемся назад, что-то делаем, в том числе rlock - unlock на другой записи
По skip возвращаемся на начальную запись
Выдаем RLock. Клиент не перечитывает запись с сервера, поскольку она в есть буфере skip
Затем по RLock клиент на сервер запрос не выдает, так считает что запись блокирована, а блокировка уже снята
В результате при Commit получаем lock required

Надо очищать буфер skip на клиенте при unlock
Вопрос. В каких еще случаях это надо делать ?


Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 1542
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 26.06.10 10:53. Заголовок: Попутно еще такой во..


Попутно еще такой вопрос.
RLock() блокирует только текущею запись. Если ранее была блокирована другая запись, то такая блокировка должна сниматься.
А в leto на сервере в leto_RecLock структура pAStru->pLocksPos не очищается
Это правильно ?

Спасибо: 0 
Профиль
Ответов - 316 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 7
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет