Форум » LetoDB, HbNetio. » Leto DB Server » Ответить

Leto DB Server

alkresin: Только что открыл на 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 на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.

Ответов - 325, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 All

alkresin: Да, сегодня сделаю build6. Эту hb_strncpyLower я вообще убрал, заменил вызовами strncpy() и hb_strLower(). Ее, как выяснилось, нет не только в xHarbour, но и в летнем ( последнем официальном ) релизе Harbour.

alkresin: Выложил исправленный build6

gfilatov: alkresin пишет: Выложил исправленный build6 Выложил готовую к использованию полную сборку LetoDB build 0.6 (ровно 1000,00 КБайт) по адресу: http://minigui.mylivepage.ru/file/?fileid=4910 LetoDB Build 6 ( 27.03.2008 ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [-] hb_strncpyLower() has been removed, because, as it appears, it is absent in xHarbour and current official Harbour release [+] Added support for additional field types: HB_FT_INTEGER HB_FT_DOUBLE HB_FT_FLOAT HB_FT_DAYTIME HB_FT_MODTIME Александр, А версия сервера в этой сборке осталась старой - Leto DB Server v.0.5 Также желательно иметь пример использования дополнительных типов полей


alkresin: А версия сервера в этой сборке осталась старой - Leto DB Server v.0.5 Забыл поправить. Ну и ладно, на этой стадии - не страшно. Также желательно иметь пример использования дополнительных типов полей Это к Паше. Я сам дополнительные типы не использую, и другим не советую :)

Pasha: Харбор поддерживает двочные поля следующих типов: (по формату dbCreate/dbStruct - name, type, len, dec) Дата: "D", 3 "D", 4 Дата в формате 3 или 4 байта "I", 2 - 16-ти битное целое со знаком, тип может быть также "2" "I", 4 - 32-ти битное целое со знаком, или тип "4" "I", 8 - 64-ти битное целое со знаком "8", 8, ndec - тип double (8 байт) "B", 8, ndec - аналогично "@", 8 - дата и время, размер 8 байт "T", 8 - аналогично дата и время "T", 4 - время в 4-х байтовом формате Преимущества двоичных типов: 1. Компактная запись данных. Особых причин использовать в 21-м веке архаичный текстовый формат эштон-тейт 80-х годов прошлого века сейчас нет :) 2. Возможность открывать dbf-формат скажем vfp Недостаток: 1. Нет возможности прямо указать размер поля для вывода на экран, поэтому используется мамксимальный размер текстового представления соответствующего типа 2. Прочие (помимо харбора) программные продукты могут не прочитать такой формат В харборе поддержка этих типов данных появилась давно, сейчас их можно использовать в letodb Правда, в билд 6 попали ошибки, которые я пофиксил только сейчас Насчет примера использования - это федь фича не letodb, а харбора, примеры должны быть в tests Если кратко: dbCreate(cPath + 'dtest.dbf', {; {'D3', 'D', 3, 0}, {'S1', 'C', 10, 0},; {'D4', 'D', 4, 0}, {'S2', 'C', 10, 0},; {'D8', 'D', 8, 0}, {'S3', 'C', 10, 0},; {'I4', 'I', 4, 0}, {'I2', '2', 2, 0}, {'F4', '8', 8, 2} }) dbUseArea(.t.,, cPath + 'dtest') dbAppend() ? I4 Field->D3 := Date() Field->S1 := '11' Field->D4 := Date() + 1 Field->S2 := '22' Field->D8 := Date() + 2 Field->S3 := '33' Field->I4 := 2 Field->I2 := -23 Field->F4 := 321.234 ? D3, I4, F4 dbCommit()

Vlad04: К Филатову. Выложил готовую к использованию полную сборку LetoDB build 0.6 (ровно 1000,00 КБайт) Сборка поддерживает xHarbour?

gfilatov: Vlad04 пишет: Сборка поддерживает xHarbour? Не проверял

alkresin: Сервер ( letodb.exe ) может быть собран чем угодно, а вот rdd - rddleto.lib, конечно же, должна быть сделана той же версией компилятора ( Harbour, C ), которой вы собираете свои программы.

gfilatov: Pasha пишет: в билд 6 попали ошибки, которые я пофиксил только сейчас Выложил готовую к использованию исправленную сборку LetoDB build 0.6 по адресу: http://minigui.mylivepage.ru/file/?fileid=4919 От себя добавил портированный в Minigui менеджер активных подключений сервера (вместе с исходниками) в дополенение к уже существующим консольному и оригинальному гуишному на Hwgui.

alkresin: Сделал транзакции - их еще проверять, поправлять и улучшать, но в первом приближении, вроде, работают. Напоминаю, что транзакция - это когда надо сделать одновременно несколько изменений в разных таблицах, так, чтобы прошло или все или ничего, чтобы не было потом несоответствий, а такое время от времени случается из-за сбоев в сети, ошибок и пр. Итак, делаем: leto_BeginTransaction() // Здесь, собственно, операции по изменению таблиц - // Append, Delete, Recall, Replace ... leto_CommitTransaction( [lUnlockAll] ) Чтобы не наделать ошибок, необходимо четко представлять себе, как это работает. Все операции по изменению таблиц ( append, delete, recall. replace ) реально осуществляются только во время leto_CommitTransaction(). Значит, если у вас: leto_BeginTransaction() select a rlock() replace xxx with 1 go top ... leto_CommitTransaction() то сначала исполнится go top, а после ( если блокировка прошла успешно ) - replace. Параметр lUnlockAll у leto_CommitTransaction(), по умолчанию - .T., указывает, надо ( .T. ) автоматически разблокировать все записи после выполнения транзакции, или нет, т.е. unlock'и делать не обязательно.

Pasha: alkresin пишет: Сделал транзакции Впечатляет, особенно скорость разработки. Скажу пару слов от себя. В отличие от традиционных транцакций, в letodb Александр реализует другой принцип, когда транзакциями занимается не сервер, а клиент При этом во время транзакции данные на сервер не передаются совсем, а передаются только при commit transaction Операция rollback на сервере не нужна вообще, так как неудачную транзакцию сервер и не увидит Преимущества такого подхода видны невооруженным глазом Есть и недостатки, куда же без них Если на сервере реализовывать целостность ссылок, foreign key, то на сервере надо тоже предусматривать возможность отката транцакции Александр, а может быть задействовать autoinc-поля ? Харбор их поддерживает, осталось поднять в letodb Но тода при добавлении записей во время транзакции надо получать значения этих полей с сервера

alkresin: Операция rollback на сервере не нужна вообще, так как неудачную транзакцию сервер и не увидит Не совсем так. Сервер увидит неудачную транзакцию, если, например, в клиентской программе не будет проверки блокировок ( значения, возвращаемого rlock() ). Rollback там не делается, потому что принятый пакет с изменениями сначала разбирается, наличие блокировок проверяется и потом, если все в порядке, все данные нормальные и проблем не ожидается, производится непосредственно запись в таблицы. Если на сервере реализовывать целостность ссылок, foreign key, то на сервере надо тоже предусматривать возможность отката транцакции Можно так же, как описано выше, предварительно проверять принятые данные, тогда rollback не понадобится. Но тода при добавлении записей во время транзакции надо получать значения этих полей с сервера Я думал, как можно делать такого рода вещи. Это ведь, чтобы использовать значения этих полей для записи в другие таблицы во время транзакции, верно ? Можно будет реализовать функции типа leto_fieldget( numfield, num_slot ) и leto_fieldput( numfield, num_slot ), которые во время транзакции будут включать в пакет соответствующие команды, и сервер, встретив эти команды, запишет в какой-то слот значение поля numfield в случае leto_fieldget и, соответственно, из слота в указанное поле в случае leto_fieldput.

Andrey: gfilatov пишет: Выложил готовую к использованию исправленную сборку LetoDB build 0.6 по адресу: Вопрос к Григорию: почему при запуске letodb.exe нет иконки в трее и нет вообще никакого окна от него ? Это сделано специально ? И на чем была проведена сборка ? Т.е. если на Харборе, то будет ли нормально работать хХарбор ? Или под свои программы на хХарборе нужно самостоятельно делать сборку letodb.exe ?

gfilatov: Andrey пишет: почему при запуске letodb.exe нет иконки в трее и нет вообще никакого окна от него ? Так задумано разработчиками сервера, для доступа к внутренней информации сервера служит дополнительная утилита manage.exe Andrey пишет: на чем была проведена сборка ? Использован Харбор. Andrey пишет: будет ли нормально работать хХарбор ? alkresin пишет: Сервер ( letodb.exe ) может быть собран чем угодно, а вот rdd - rddleto.lib, конечно же, должна быть сделана той же версией компилятора ( Harbour, C ), которой вы собираете свои программы. Думаю, что ответ Александра является исчерпывающим

Andrey: gfilatov пишет: Так задумано разработчиками сервера, для доступа к внутренней информации сервера служит дополнительная утилита manage.exe А как узнать версию сервера ? Это же нужно периодически для замены. Если бы сервер сидел в трее, то можно было бы вызывать его и менять настройки его. А так нельзя !!!

Pasha: Как настроить на сервере кодовую страницу и другие параметры по умолчанию ? Codepage необходим для вычисления upper(), например, в фильтрах Я вижу в варианта: 1) Добавить codepage в PUSERSTRU (вместе с set exact, set dateformat etc), и отрабатывать перед каждой операцей, в которой вычисляется макрос или блок кода 2) Добавить глобальные настройки в letodb.ini Можно реализовать оба варианта, или один из двух Как лучше ?

alkresin: Оба. Codepage, наверное, стоит передавать на сервер один раз с intro.

Pasha: Александр, у меня появилось такое предложение Что если сделать кеширование dbSkip(-1) аналогично dbSkip(1) ? Это нужно для оптимизации TBrowse и прочих гридов Процедура заполнения экрана следующая: сначала вызовами dbskip(1) определяется количество строк грида, затем следует несколько вызовов dbSkip(-1), по которым уже заполняется экран Если сделать writelog в leto_Skip, то получается такая картина: 2565;1;1;podrp;A; 2565;1;12;podrp;A; 2565;-1;19;podrp;A; 2565;-1;18;podrp;A; 2565;-1;17;podrp;A; 2565;-1;15;podrp;A; 2565;-1;14;podrp;A; 2565;-1;13;podrp;A; 2565;-1;12;podrp;A; 2565;-1;11;podrp;A; 2565;-1;10;podrp;A; 2565;-1;9;podrp;A; 2565;-1;8;podrp;A; 2565;-1;7;podrp;A; 2565;-1;6;podrp;A; 2565;-1;5;podrp;A; 2565;-1;4;podrp;A; 2565;-1;3;podrp;A; 2565;-1;2;podrp;A;

alkresin: Процедура заполнения экрана следующая: сначала вызовами dbskip(1) определяется количество строк грида, затем следует несколько вызовов dbSkip(-1), Значит, надо. Только тогда обязательно и другую штуку надо сделать - запоминать в LETOAREA время получения кэша, и если оно превышает какую-то константу ( 1с, например, ) и таблица открыта в shared режиме, обновлять кэш. Это в любом случае надо было делать, а при кэшировании dbskip(-1) - тем более, иначе можно долго так по кэшу ходить, в то время как данные давно изменились.

Pasha: По поводу SET_EXACT. А в каких случаях клиент должен устанавливать его на сервере, кроме как при выполнении макросов, заданных клиентом (фильтров, индексных выражений, условий индекса) ? Я не подумал, что установка этого флага может быть опасной для сервера, поскольку часть его кода остается на prg-уровне. Может быть, просто восстанавливать его значение после использования для фильтра/индекса ? Я пропустил установку параметров окружения клиента для leto_Goto Надо еще добавить в UpdateRec, поскольку во время этой операции обновляются ключи индекса



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