Автор | Сообщение |
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 на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.
|
|
|
Ответов - 325
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
All
[только новые]
|
|
КСС
|
| |
Пост N: 12
Зарегистрирован: 04.12.07
|
|
Отправлено: 31.01.08 11:42. Заголовок: А NTX-ы поддерживает..
А NTX-ы поддерживает ? А программный код дорабатывать нужно и насколько ? А то у меня есть задачка на Clipper-е, которая реально работает 10 лет в сети, и нагрузка приличная. Можно было бы потестировать, да и быстродействие сравнить.
|
|
|
Pasha
|
| Администратор
|
Пост N: 742
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.01.08 12:52. Заголовок: Добавьте меня, пожал..
Добавьте меня, пожалуйста Мой account на sourceforge - ptsarenko Кстати, где собираетесь вести обсуждение проекта ? Будут ведь не только русскоязычные разработчики
|
|
|
alkresin
|
| moderator
|
Пост N: 32
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.01.08 12:54. Заголовок: Прямо сейчас ntx не ..
Прямо сейчас ntx не поддерживает, хотя добавить это дело не сложно - просто сам уже много лет ntx'ами не пользуюсь и не понимаю зачем они нужны, если есть cdx :). Но раз есть спрос - добавлю.
|
|
|
alkresin
|
| moderator
|
Пост N: 33
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.01.08 13:00. Заголовок: Мой account на sourc..
цитата: | Мой account на sourceforge - ptsarenko |
| Добавил. цитата: | Кстати, где собираетесь вести обсуждение проекта ? Будут ведь не только русскоязычные разработчики |
| Да на том же Sourceforge - там 3 форума по умолчанию открыто. И mail list можно там же запустить, если нужда будет.
|
|
|
alkresin
|
| moderator
|
Пост N: 34
Зарегистрирован: 06.07.06
|
|
Отправлено: 31.01.08 13:06. Заголовок: КСС пишет: А програ..
КСС пишет: цитата: | А программный код дорабатывать нужно и насколько ? |
| Нет, просто как обычно вставить строчки для этого RDD: REQUEST LETO RDDSETDEFAULT( "LETO" ) Ну и, конечно, пути указать с учетом пути к серверу, например: //192.168.5.3:2812/data/mydir
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 438
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.01.08 16:52. Заголовок: alkresin пишет: Кто..
alkresin пишет: цитата: | Кто хочет участвовать в разработке, тестировании - пишите. |
| Я хочу, мой е-майл: 30195@mail.ru Если этот сервер сравним с ADS (мне транзакции не нужны) и переделка программ минимально, то я готов потратить деньги предприятия на него (для ADS-денег нет, тогда пускай родного разработчика поддержат). У меня стоит остро вопрос разгрузки файл-сервера. 15-16 рабочих мест (каждый юзер запускает 2-3 мои задачи [~180-файлов в каждой] и еще штук 8-10 докуменов одновременно) и 2-х ядерный P4 начинает тормозить.
|
|
|
Pasha
|
| Администратор
|
Пост N: 743
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.01.08 21:52. Заголовок: Сделал небольшие изм..
Сделал небольшие изменения для сборки под xharbour Александр, подскажите, что это может быть и где копать Соединяюсь локально, WinXP Сначала пытаюсь создать файл: Local cFile := '//127.0.0.1:2812/e/hb/test/_first' dbCreate(cFile, {{'STR', 'C', 20, 0}}) выдается ошибка Error LETO/1021 Data type error: -011:20 при открытии тоже: dbUseArea(.t.,, '//127.0.0.1:2812/e/hb/test/account') Error LETO/1021 Data type error: -003:21
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 444
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.08 00:41. Заголовок: Pasha пишет: Сделал..
Pasha пишет: цитата: | Сделал небольшие изменения для сборки под xharbour |
| А у меня не собирается под хХарбором ! Подскажи пожалуйста где и что править (я не слишком силен в этом)....
|
|
|
Pasha
|
| Администратор
|
Пост N: 745
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 09:23. Заголовок: Что за ошибка при сб..
Что за ошибка при сборке ? Если на HB_FT_IMAGE, это значит, что обновление на CVS еще недоступно. Обновись еще раз, Changelog должен быть 1.2
|
|
|
Pasha
|
| Администратор
|
Пост N: 746
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 09:57. Заголовок: Changelog уже 1.3 Ал..
Changelog уже 1.3 Александр, на use и dbCreate у меня остались ошибки
|
|
|
alkresin
|
| moderator
|
Пост N: 35
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 10:15. Заголовок: Касательно возвращае..
Касательно возвращаемого кода ( 003:21, 011:20 ) - это временная система для обозначения ошибок. Если стоит вот такое, это значит, что после двоеточия - стандартный код ошибки при выполнении операции на сервере, описанный в error.ch В нашем случае - 20 - EG_CREATE, 21 - EG_OPEN, что не очень информативно :). А e/ у вас в пути - это каталог ?
|
|
|
|
alkresin
|
| moderator
|
Пост N: 36
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 10:31. Заголовок: Andrey пишет: А у м..
Andrey пишет: цитата: | А у меня не собирается под хХарбором ! Подскажи пожалуйста где и что править (я не слишком силен в этом).... |
| Изменения, сделанные Pasha, отправил по email. Надо будет новый build сделать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 747
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 10:32. Заголовок: Это диск. Кстати, ка..
Это диск. Кстати, как надо указывать каталог с диском для win-сервера ? А как быть, если нет статического IP-адреса сервера ? если указать dbUseArea(.t.,, '//servername:2812/e/letodb/test') Выдается ошибка 101 Я конечно подсмотрел адрес через ping, поставил: dbUseArea(.t.,, '//192.168.0.216:2812/e/letodb/test') Но все равно Выдается ошибка 101 Т.е. ругается функция leto_getIpFromPath, не может выделить адрес 192.168.0.216
|
|
|
Pasha
|
| Администратор
|
Пост N: 748
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 10:33. Заголовок: alkresin пишет: Над..
alkresin пишет: цитата: | Надо будет новый build сделать. |
| Может быть, выкладывать собранные letodb.exe и letodb.lib прямо на sourceforge, для тех, кто не скачивает с CVS ?
|
|
|
alkresin
|
| moderator
|
Пост N: 37
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:09. Заголовок: Это диск. Кстати, ка..
цитата: | Это диск. Кстати, как надо указывать каталог с диском для win-сервера ? |
| Вот поэтому и ошибка. Весь путь, начиная с '/' после номера порта передается на сервер, сервер добавляет его к содержимому "DataPath", прописанному в ini - файле ( если есть ) и использует для открытия файла. Поэтому, если обязательно нужен диск, попробуйте форму //127.0.0.1:2812/e:/hb/test/_first, а лучше - пропишите в letodb.ini DataPath = e:/hb и тогда при открытии: //127.0.0.1:2812/test/_first По поводу имени вместо ip я проверю
|
|
|
alkresin
|
| moderator
|
Пост N: 38
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:11. Заголовок: Может быть, выкладыв..
цитата: | Может быть, выкладывать собранные letodb.exe и letodb.lib прямо на sourceforge, для тех, кто не скачивает с CVS ? |
| Исходники там выложены в секции Download. Бинарник сервера тоже можно выложить, а вот rddleto.lib - не вижу смысла, потому что тогда придется кучу их выкладывать, для разных С и Харбор компиляторов, их версий
|
|
|
alkresin
|
| moderator
|
Пост N: 39
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:16. Заголовок: С адресами как ваш 1..
С адресами как ваш 192.168.0.216, действительно, глупая ошибка была в leto_getIpFromPath() - уже поправил на CVS
|
|
|
Vlad04
|
| постоянный участник
|
Пост N: 96
Зарегистрирован: 13.10.05
|
|
Отправлено: 01.02.08 11:25. Заголовок: Хочу принять участие..
Хочу принять участие в тестировании . orsv04@mail.ru
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 451
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.08 11:26. Заголовок: Блин, никак не могу ..
Блин, никак не могу найти исправления, вижу только letodb-0.1.src.zip Mirror 56682 0 Platform-Independent Source .zip Или я что-то не догоняю ?
|
|
|
alkresin
|
| moderator
|
Пост N: 40
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:31. Заголовок: На email же отправил..
На email же отправил
|
|
|
Pasha
|
| Администратор
|
Пост N: 750
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 11:34. Заголовок: Ура ! Есть первый ко..
Ура ! Есть первый коннект Для windows-сервера: letodb.ini (должен быть на сервере) DataPath = e:/hb/test Должен быть прямой слеш соединяюсь: dbUseArea(.t.,, '//127.0.0.1:2812/test') Но выплыла еще ошибка: ? FieldPos('First') Выдает 1 А обращение по имени поля: ? First Переменная не существует First Если указать: ? Field->First То все нормально Вроде бы rdd тут ни при чем Или я что-то не понимаю, или это какая-то особенность harbour (я тестирую пока с ним, до xHb дело еще не дошло)
|
|
|
|
alkresin
|
| moderator
|
Пост N: 41
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:34. Заголовок: Хочу принять участие..
цитата: | Хочу принять участие в тестировании . orsv04@mail.ru |
| Ну, email для этого не нужен. Лучше всего, забирай исходники с CVS - это нетрудно или подожди чуть - я исправленный zip выложу на Sourceforge как build2
|
|
|
alkresin
|
| moderator
|
Пост N: 42
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:37. Заголовок: А обращение по имени..
цитата: | А обращение по имени поля: ? First Переменная не существует First Если указать: ? Field->First То все нормально |
| Странно, я всегда именно так и указываю, без field->
|
|
|
alkresin
|
| moderator
|
Пост N: 43
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 11:42. Заголовок: Проверь тот же тест ..
Проверь тот же тест с dbfcdx, без сервера
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 454
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.08 11:44. Заголовок: alkresin пишет: На ..
alkresin пишет: Получил, тоже не собирается.
|
|
|
Pasha
|
| Администратор
|
Пост N: 751
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 11:51. Заголовок: Какая ошибка ? Что в..
Какая ошибка ? Что в make_b32.log ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 456
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.08 11:53. Заголовок: Pasha пишет: Что в ..
Pasha пишет: MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -c -Iinclude;Z:\xHarbour\include -d -D__WIN32__ -oobj\b32\leto1.obj source\client\leto1.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland source\client\leto1.c: Warning W8065 source\client\leto1.c 336: Call to function 'leto_NetName' with no prototype in function leto_ConnectionNew Warning W8069 source\client\leto1.c 336: Nonportable pointer conversion in function leto_ConnectionNew Warning W8004 source\client\leto1.c 1162: 'ptr' is assigned a value that is never used in function letoPutValue Warning W8065 source\client\leto1.c 1383: Call to function 'hb_setGetCPtr' with no prototype in function letoCreate Error E2342 source\client\leto1.c 1383: Type mismatch in parameter 'sSource' (wanted 'signed char *', got 'int') in function letoCreate Warning W8065 source\client\leto1.c 1541: Call to function 'hb_setGetCPtr' with no prototype in function letoOpen Error E2342 source\client\leto1.c 1541: Type mismatch in parameter 'sSource' (wanted 'signed char *', got 'int') in function letoOpen Error E2451 source\client\leto1.c 1639: Undefined symbol 'uiFlags' in function letoOpen Warning W8057 source\client\leto1.c 1812: Parameter 'pOrderInfo' is never used in function letoOrderListAdd Warning W8057 source\client\leto1.c 1834: Parameter 'pOrderInfo' is never used in function letoOrderListDelete Warning W8057 source\client\leto1.c 2009: Parameter 'pOrderInfo' is never used in function letoOrderDestroy *** 3 errors in Compile *** ** error 1 ** deleting obj\b32\leto1.obj
|
|
|
Pasha
|
| Администратор
|
Пост N: 752
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 11:54. Заголовок: alkresin пишет: Про..
alkresin пишет: цитата: | Проверь тот же тест с dbfcdx, без сервера |
| Та же ошибка. Вопрос снят. Наверное, дело в ключах компилятора
|
|
|
Pasha
|
| Администратор
|
Пост N: 753
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 11:55. Заголовок: Andrey пишет: MAKE ..
Andrey пишет: цитата: | MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -c -Iinclude;Z:\xHarbour\include -d -D__WIN32__ -oobj\b32\leto1.obj source\client\leto1.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland source\client\leto1.c: Warning W8065 source\client\leto1.c 336: Call to function 'leto_NetName' with no prototype in function leto_ConnectionNew |
| Это было в первоначальном варианте, исправлено еще вчера
|
|
|
Pasha
|
| Администратор
|
Пост N: 754
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 11:57. Заголовок: А, дошло В makefile...
А, дошло В makefile.bc сними комментарий со строки # XHARBOUR = yes
|
|
|
Vlad04
|
| постоянный участник
|
Пост N: 97
Зарегистрирован: 13.10.05
|
|
Отправлено: 01.02.08 12:00. Заголовок: Может быть, выклады..
цитата: | Может быть, выкладывать собранные letodb.exe и letodb.lib прямо на sourceforge, для тех, кто не скачивает с CVS |
| САМОЕ оптимальное
|
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 458
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.08 12:02. Заголовок: Pasha пишет: В make..
Pasha пишет: цитата: | В makefile.bc сними комментарий со строки # XHARBOUR = yes |
| Нет там такой строчки, вообще !!!
|
|
|
Pasha
|
| Администратор
|
Пост N: 755
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 12:07. Заголовок: Значит, у тебя стары..
Значит, у тебя старые сырцы
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 459
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.08 12:17. Заголовок: Pasha пишет: Значит..
Pasha пишет: цитата: | Значит, у тебя старые сырцы |
| А где взять новые ? Там только: letodb-0.1.src.zip Mirror 56682 0 Platform-Independent Source .zip
|
|
|
alkresin
|
| moderator
|
Пост N: 44
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 12:35. Заголовок: Сделал еще одно испр..
Сделал еще одно исправление, теперь можно и по имени сервер называть: use //MYSERVER:2812/data/test.dbf
|
|
|
alkresin
|
| moderator
|
Пост N: 45
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 12:36. Заголовок: Андрей, опять выслал..
Андрей, опять выслал по email patch.zip
|
|
|
alkresin
|
| moderator
|
Пост N: 46
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 12:40. Заголовок: Vlad04, вопрос в том..
Vlad04, вопрос в том, какую именно rddleto.lib выкладывать, их же может быть много разных - для Harbour, xHarbour, WIndows, Linux, Borland C, MS Visual C и пр. С компиляторы, посчитайте число возможных комбинаций :). Поэтому проще выложить исходники - одни на все случаи жизни.
|
|
|
alkresin
|
| moderator
|
Пост N: 47
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 15:01. Заголовок: Changelog'и пост..
Changelog'и постим в https://sourceforge.net/forum/forum.php?forum_id=779825 - форум "Developers" на Sourceforge.
|
|
|
alkresin
|
| moderator
|
Пост N: 48
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 16:52. Заголовок: Проверил я его сегод..
Проверил я его сегодня на "старых" версиях [x]Harbour - до ноября 2007 и обнаружил, что с ними есть проблемы. Буду разбираться, а пока, если у вас Harbour не с CVS, не торопитесь тестировать.
|
|
|
alkresin
|
| moderator
|
Пост N: 49
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 20:13. Заголовок: Теперь работает и на..
Теперь работает и на "старых" версиях, изменения выложены на CVS
|
|
|
Pasha
|
| Администратор
|
Пост N: 756
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.02.08 21:15. Заголовок: Александр, не могу р..
Александр, не могу разобраться При открытии таблицы под xHb на клиенте в leto1.c leto_ParseRec после строки 401 на pField = pArea->lpFields; происходит gpf при любом обращении к pField->any, такое впечатление, что память не выделена под pArea->lpFields. xHarbour с CVS. Еще одна мелочь. В console.prg замените ExeName() на HB_Argv(0), чтобы не прилинковывать тулз. Я сам не стал, по changelog увидел, что модуль обновлялся сегодня, а у меня еще версии 1.1
|
|
|
|
alkresin
|
| moderator
|
Пост N: 50
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.08 23:21. Заголовок: Память под pArea-..
Память под pArea->lpFields выделяется в верхнем слое RDD - workarea.c, hb_waSetFieldExtent() ( вызов SELF_SETFIELDEXTENT из letoOpen() ). Она может быть не выделена, если в вызове SELF_SETFIELDEXTENT стоит 0 полей - это может произойти, если неправильно интерпретированы данные с сервера. А может случиться, что память была выделена, но потом значение указателя чем-то затерто.
|
|
|
Pasha
|
| Администратор
|
Пост N: 757
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.02.08 10:34. Заголовок: Выяснил, что gpf воз..
Выяснил, что gpf возникает только на xHb CVS, на старой (июльской) весии ок Делаю scope, еще не постил. Передаю команду на сервер, и на сервере отрабатываю DBOI_SCOPETOP, DBOI_SCOPETOPCLEAR итд. Это правильный подход ? Еще не сбрасывал на CVS, проверяю Как лучше делать DBOI_KEYVAL ? Вычислять на клиенте или запрашивать с сервера ? Для DBOI_KEYSIZE думаю добавить еже один элемент в LETOTAGINFO. Правильно ? Увидел такую несовместимость. После OrdListAdd() в dbfdcx автотматически устанавливается 1-й индекс, а в letodb надо еще выдавать dbSetOrder(1)
|
|
|
alkresin
|
| moderator
|
Пост N: 51
Зарегистрирован: 06.07.06
|
|
Отправлено: 02.02.08 15:10. Заголовок: Нашел, в чем проблем..
Нашел, в чем проблема со свежим xHarbour. Вот она: 2008-01-10 11:47 UTC+0100 Miguel Angel Marchuet <miguelangel/at/marchuet.net> Он изменил базовую структуру rdd AREA, зараза! А в каждом RDD ( в т.ч. и у нас - rddleto.h ) эта структура дублируется, и в конце добавляются специфичные для этого RDD поля. Что с этим делать, чтоб с предыдущими версиями xHarbour использовалась старая структура, а с новейшей - новая, я пока не знаю. цитата: | Делаю scope, еще не постил. Передаю команду на сервер, и на сервере отрабатываю DBOI_SCOPETOP, DBOI_SCOPETOPCLEAR итд. Это правильный подход |
| В принципе, да, но этого недостаточно. Учти, что на сервере открывается одна копия таблицы для всех, и если ты установишь там scope, то он и у других пользователей, использующих эту таблицу, появится - представляю себе их удивление :). цитата: | Как лучше делать DBOI_KEYVAL ? Вычислять на клиенте или запрашивать с сервера ? |
| На клиенте. Все, что можно, надо делать на клиенте, чтоб не загружать сервер лишней работой. цитата: | Для DBOI_KEYSIZE думаю добавить еже один элемент в LETOTAGINFO. Правильно ? |
| Угу.
|
|
|
Pasha
|
| Администратор
|
Пост N: 759
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.02.08 15:28. Заголовок: alkresin пишет: Учт..
alkresin пишет: цитата: | Учти, что на сервере открывается одна копия таблицы для всех, и если ты установишь там scope, то он и у других пользователей, использующих эту таблицу, появится - представляю себе их удивление :). |
| Понятно. Я этого не заметил. Значит, буду делать по другому, так, как сделан bFilter Relations тоже прийдется отрабатывать на сервере
|
|
|
Pasha
|
| Администратор
|
Пост N: 760
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.02.08 15:32. Заголовок: alkresin пишет: Наш..
alkresin пишет: цитата: | Нашел, в чем проблема со свежим xHarbour. Вот она: 2008-01-10 11:47 UTC+0100 Miguel Angel Marchuet <miguelangel/at/marchuet.net> Он изменил базовую структуру rdd AREA, зараза! |
| Я из-за этого не спешу использовать свежие сырцы. Появляются несоотсвествия с прежней структуроой заголовкка. Раньше допускались произвольные значения в резервных полях, а сейчас - результат непредсказуемый
|
|
|
alkresin
|
| moderator
|
Пост N: 52
Зарегистрирован: 06.07.06
|
|
Отправлено: 02.02.08 15:42. Заголовок: Не было там резервны..
Не было там резервных полей. Он вставил новое поле до lpfields и 2 - после. Поэтому workarea.c присваивает значение lpfields, а у нас оно попадает в другое место, lpfields остается неинициализированным. И дело не в том, свежие сырцы или нет. Если б он это не сейчас сделал, а 3 месяца назад, какая разница ? Все равно - с одной версией работало б, с другой - нет. Придется, наверное, 2 экземпляра rddleto.h держать и примечание оставить для пользователей xHarbour > 10.01.08, чтоб переименовывали свое xrddleto.h в rddleto.h ...
|
|
|
Pasha
|
| Администратор
|
Пост N: 761
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.02.08 17:44. Заголовок: Добавил scope..
Добавил scope
|
|
|
Pasha
|
| Администратор
|
Пост N: 762
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.02.08 21:53. Заголовок: Добавил OrdKeyVal()..
Добавил OrdKeyVal()
|
|
|
Pasha
|
| Администратор
|
Пост N: 764
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.02.08 13:16. Заголовок: Александр, я столкну..
Александр, я столкнулся с необходимостью проверять существование файла на сервере. Например, если есть файл cdx - открывать его, если нет - индексировать Сделал отдельный модуль на клиенте: letomgmt.c: #include "hbapi.h" #include "rddleto.h" int leto_getIpFromPath( char * sSource, char * szAddr, int * piPort, char * szPath ); LETOCONNECTION * leto_ConnectionFind( char * szAddr, int iPort ); LETOCONNECTION * leto_ConnectionNew( char * szAddr, int iPort ); long int leto_Recv( HB_SOCKET_T hSocket ); char * leto_firstchar( void ); int leto_getCmdItem( char ** pptr, char * szDest ); static int leto_DataSendRecv( LETOCONNECTION * pConnection, char * sData, ULONG ulLen ) { if ( hb_ipSend( pConnection->hSocket, sData, (ulLen)? ulLen:strlen(sData), -1, 1 ) <= 0 ) { return 0; } return leto_Recv( pConnection->hSocket ); } HB_FUNC( LETO_FILE ) { LETOCONNECTION * pConnection; char szFile[_POSIX_PATH_MAX + 1]; char szAddr[96]; int iPort; if( ISCHAR(1) && leto_getIpFromPath( hb_parc(1), szAddr, &iPort, szFile ) && ( ( pConnection = leto_ConnectionFind( szAddr, iPort ) ) || ( pConnection = leto_ConnectionNew( szAddr, iPort) ) ) ) { char szData[_POSIX_PATH_MAX + 16]; sprintf( szData,"file;%s;\r\n", szFile ); if ( !leto_DataSendRecv( pConnection, szData, 0 ) ) { hb_retl( FALSE ); } else { char * ptr = leto_firstchar(); leto_getCmdItem( &ptr, szData ); ptr ++; hb_retl( szData[0] == 'T' ); } } else hb_retl( FALSE ); } снял static с используемых функций в leto1.c. Чтобы не добавлять LETO_FILE к rdd. Ok ? Или организовать клиентскую библиотеку по другому ? Сейчас отлаживаю на сервере написал: ELSEIF cItem == "file" cReply := hs_file( oUser,Substr(cCommand,nPos1+1) ) ... Function hs_file( oUser,cCommand ) Local cFile, nPos := 1 IF Empty( cFile := GetCmdItem( cCommand,nPos,@nPos ) ) Return "-002" ENDIF Return "+" + File(oApp:DataPath+cFile) Вообще, хорошо бы для сервера windows, да и для самбы сделать поиск IP-адреса по сетевому пути, если подключен сетевой диск. Это возможно ? Было бы как в ADS В целом, получается неплохо. И интернет-сервер (аналог AIS), и сервер по ЛВС в одном флаконе
|
|
|
Pasha
|
| Администратор
|
Пост N: 766
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.02.08 19:40. Заголовок: Добавил LETO_FILE() ..
Добавил LETO_FILE() - аналог File(), а также обработку OrdBugExt() и OrdNumber()
|
|
|
alkresin
|
| moderator
|
Пост N: 53
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.02.08 22:27. Заголовок: Отлично! Я сам плани..
Отлично! Я сам планировал эту функцию сделать, а, может, и другие файловые - в ADS мне их сильно не хватало. Вот только static int leto_DataSendRecv() по-моему, не стоило делать, надо использовать ту, что есть из leto1.c - избегаем дублирования кода и, главное, желательно, чтобы все функции, работающие непосредственно с сокетом, были собраны в одном месте - легче потом менять в случае чего. И насчет scope - я считаю, что нет нужды возвращать тип и значение scope с сервера, все это прекрасно клиент сам может определить, зачем же сервер зря утруждать ... цитата: | Вообще, хорошо бы для сервера windows, да и для самбы сделать поиск IP-адреса по сетевому пути, если подключен сетевой диск. Это возможно ? |
| Сделать то можно, раз ADS смогли :), но не знаю как. И, вообще-то, считаю это ненужным и даже вредным с точки зрения безопасности данных. Все известные мне DBMS используют имя сервера/ip, порт, имя базы и таблиц, для доступа к данным, а где именно хранится база, пользователь не знает и знать не должен - это важное преимущество подобных систем. У тебя никогда не случалось, что пользователь случайно удалял данные с сервера, просто щелкая мышкой по окну файлового менеджера ? У меня было ... Поэтому важно, чтобы каталог с данными не был расшарен - и то, что наш сервер позволяет скрыть данные, я считаю существенным преимуществом. А ADS позволяет это в силу исторических причин, он ведь начинался с версии для Novell 3.12 и IPX протокола.
|
|
|
Pasha
|
| Администратор
|
Пост N: 767
Зарегистрирован: 23.05.05
|
|
Отправлено: 03.02.08 22:53. Заголовок: alkresin пишет: Вот..
alkresin пишет: цитата: | Вот только static int leto_DataSendRecv() по-моему, не стоило делать, надо использовать ту, что есть из leto1.c - избегаем дублирования кода и, главное, желательно, чтобы все функции, работающие непосредственно с сокетом, были собраны в одном месте - легче потом менять в случае чего. И насчет scope - я считаю, что нет нужды возвращать тип и значение scope с сервера, все это прекрасно клиент сам может определить, зачем же сервер зря утруждать ... |
| ok, переделаю
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 464
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.02.08 11:14. Заголовок: alkresin пишет: Поэ..
alkresin пишет: цитата: | Поэтому важно, чтобы каталог с данными не был расшарен - и то, что наш сервер позволяет скрыть данные, я считаю существенным преимуществом. |
| Поддерживаю обеими руками !!! Сколько я намучился с SHARED папками, это можно целые рассказы писать....
|
|
|
alkresin
|
| moderator
|
Пост N: 54
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.02.08 11:20. Заголовок: Да, Pasha, поставь н..
Да, Pasha, поставь на letomgmn.c свой копирайт - ты же его original author.
|
|
|
Pasha
|
| Администратор
|
Пост N: 771
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.08 11:43. Заголовок: Есть вопрос, не отно..
Есть вопрос, не относящийся к Leto DB Можно ли сделать локализацию самого компилятора ? Я пытался найти процедуру, проверяющую допустимость идентификатора, но безуспешно. Вернее, нашел, но не везде. Может быть, используются средства bison ? Для чего это надо. Например, при использовании Ole многие классы поддерживают поля и методы с русскими идентификаторами. Аналогично в dbf-файлах могут быть русские имена полей. Напрашивается добавить эти средства в сам компилятор, то есть добавить возможность сборки с определенной кодовой страницей Во многих языках уже есть поддержка национальных идентификаторов. Старые бастионы падают. Длинные идентификаторы, локализация... Почему не сделать такое и для харбора ?
|
|
|
alkresin
|
| moderator
|
Пост N: 55
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.02.08 13:05. Заголовок: В смысле, названия п..
В смысле, названия переменных и полей db - на русском, или что-то еще ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 773
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.08 13:17. Заголовок: alkresin пишет: В с..
alkresin пишет: цитата: | В смысле, названия переменных и полей db - на русском, или что-то еще ? |
| Да, и не более того. Сейчас на такие идентификаторы компилятор выдаст ошибку Leto. По поводу StoredProc: мысль такая. Подготовить модуль в виде hrb-файла на сервере По команде с клиента загружать-выгружать его. Отдельная команда на вызов функции из этого модуля с передачей параметров и возвратом результата На сервере перед вызовом функции из hrb устанавливать все окружение каждой открытой РО для этого пользователя: номер записи, фильтр итд. Запоминать это состояние. После отработки функции передавать на клиент кроме результата еще и новое состояние изменившихся РО. На клиенте его отрабатываеть Какие будут идеи ? Кстати, Pritpal Bedi не говорил, чем он собирается заниматься ? Чтобы мы не делали одно и тоже. Я, к примеру, думаю начать делать relations
|
|
|
Pasha
|
| Администратор
|
Пост N: 774
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.08 13:52. Заголовок: Только алиасы РО на ..
Только алиасы РО на сервере и на клиенте будут отличаться. Нужна будет функция для получения истинного алиаса
|
|
|
alkresin
|
| moderator
|
Пост N: 56
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.02.08 15:16. Заголовок: Да, и не более того...
цитата: | Да, и не более того. Сейчас на такие идентификаторы компилятор выдаст ошибку |
| Ну что тут сказать ... Если кто-то заинтересован в таком локализованном компиляторе, пусть делает. Подними этот вопрос в developer'ском листе - может, кто заинтересуется. Лично я как-то привык уже, что имена переменных, команд, функций - на английском, мне это кажется удобным - легко отличать их от текстовых строк на русском. А программа с русскими идентификаторами показалась бы, пожалуй, неудобочитаемой... С полями в база вопрос еще интереснее - тогда ведь программы на других xBase диалектах не смогут открыть такой файл. Я бы такими средствами локализации не пользовался. По stored procedures надо еще подумать. Может, стоит восстанавливать состояние РО после выполнения ? Сначала, мне кажется, надо реализовать схему запуска процессов и межпроцессного взаимодействия - мы же не будем выполнять их основным процессом, они могут быть достаточно длительными. Значит, загружать/выгружать hrb будет как раз тот дополнительный процесс. О намерениях Pritpal Bedi ничего не знаю, он со мной после запроса write access не контактировал. Сегодня, кстати, обратился Miguel Angel Marchuet ( он сейчас один из основных контрибуторов в xHarbour ? ) - я его сразу озадачил той проблемой с изменением workarea :). По алиасам - это предусмотрено: имя алиаса, как его знает клиент, передается из letoOpen() сразу после имени файла - т.е., должно передаваться, сейчас там пустая строка. И на сервере оно читается, но никак не используется. Надо будет создать HSArea:cAlias и присвоить ему это значение.
|
|
|
Pasha
|
| Администратор
|
Пост N: 776
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.08 21:42. Заголовок: Переделал scope, отп..
Переделал scope, отправил на CVS Одну свою большую программу с letodb так и не смог запустить, не открывается 5-й по порядку открытия файл. Непонятно почему, имя задано правильно. 4 файла БД с индексом открылись успешно Ошибка в лог: 02/04/08 19:14:46: Open error (12-1001): e:/db/test/com/people_ Если вместо people_.dbf путаюсь открыть другой файл, выдается ошибка с таким же кодом Непонятно. Пока отставил, запустил другую программу. БД открылась успешно ! Большинство режимов работают, но не все Иногда программа зависает, иногда выдает ошибку на различных операциях Пока не локализовал, разбираюсь. Результат считаю хорошим, я на это так быстро и не расчитывал Пока тестовые примеры c ошибками не даю, попытаюсь разобраться сам
|
|
|
alkresin
|
| moderator
|
Пост N: 57
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.02.08 22:43. Заголовок: 02/04/08 19:14:46: O..
цитата: | 02/04/08 19:14:46: Open error (12-1001): e:/db/test/com/people_ |
| А точно 12-1001 ? Может, 21-1001 ? Ведь 12 == EG_NOFUNC, вроде ни при чем ? А вообще странно. У меня никаких проблем нет, все программы, что скомпилил - работают, файлов по 10 открывают ( у меня больше не бывает обычно ).
|
|
|
Pasha
|
| Администратор
|
Пост N: 777
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.08 23:28. Заголовок: Я скопировл из лога...
Я скопировл из лога. Покопаюсь сам, странная ситуация У меня тоже другая программа всю БД без проблем открыла Одну ошибку локализовал dbSeek(space(n)) попадает в server.prg на IF Empty( xKey := GetCmdItem( cCommand,nPos+1,@nPos ) ) Return "-002" ENDIF Надо вычислять длину ключа и передавать ее вместе с ключем. И учитывать, что сам ключ может содержать нулевой байт. Т.е в leto_SendRecv надо передавать размер пакета напрямую, а не вычислять по strlen()
|
|
|
Pasha
|
| Администратор
|
Пост N: 778
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.02.08 23:54. Заголовок: Как правильно создав..
Как правильно создавать индекс в OrdCreate, если его надо создать в том же каталоге, что и dbf ? Передавать имя файла индекса без //ip-adr:port/... ? Должна ли учитываться настройка DataPath в letodb.ini ? Наверное, надо добавить oApp:DataPath в hs_createindex ordCreate( oApp:DataPath+cBagName,cTagName,cKey,&("{||"+cKey+"}"),lUnique )
|
|
|
alkresin
|
| moderator
|
Пост N: 59
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 09:37. Заголовок: Надо вычислять длину..
цитата: | Надо вычислять длину ключа и передавать ее вместе с ключем. И учитывать, что сам ключ может содержать нулевой байт. Т.е в leto_SendRecv надо передавать размер пакета напрямую, а не вычислять по strlen() |
| Сделаю. Насчет OrdCreate: //ip-adr:port/ и так на сервер не передается. Если имя индекса передано с путем, то надо добавлять oApp:DataPath, если без, то нужна дополнительная проверка: если имя индекса совпадает с именем dbf, то не добавляем oApp:DataPath ( он автоматически размещается там же, где и dbf ), если другое имя - то добавляем.
|
|
|
Pasha
|
| Администратор
|
Пост N: 780
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 10:20. Заголовок: Ясно Александр, а ка..
Ясно Александр, а как насчет создания вычисляемых readonly полей ? CalcFields дали бы существенное сокращение траффика для случая, когда в основной таблице содержится код (например) справочника, и надо выбрать его наименование Такое есть в sql-запросах, но до них еще далеко. Такие выборки эффективнее, чем relations, так как будет использоваться данные одной, а не 2-х РО, без лишних seek и выборки данных записи Это были бы ф-ии вида: AddCalcField(cFieldName, cFieldType, nLen, nDec, cAlias, cKeyExpr, cRelField) динамически добавляет поле DelCalcField(cFieldName) удаляет
|
|
|
alkresin
|
| moderator
|
Пост N: 60
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 10:42. Заголовок: Хм... Виртуальное по..
Хм... Виртуальное поле, вычисляемое на сервере из логически связанных таблиц ? Очень интересная идея. Мне нравится.
|
|
|
Pasha
|
| Администратор
|
Пост N: 781
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 11:19. Заголовок: Ну да Примерно такое..
Ну да Примерно такое есть в Delphi-TDataset, правда там оно не вычисляется на сервере
|
|
|
Pasha
|
| Администратор
|
Пост N: 782
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 11:36. Заголовок: Я смогу заниматься l..
Я смогу заниматься letodb до конца этой недели. Думаую повылавливать мелкие несовместимости. Затем примерно 2 недели меня не будет, и потом подключусь опять, где-то с конца февраля
|
|
|
alkresin
|
| moderator
|
Пост N: 61
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 12:13. Заголовок: http://www.letodb.or..
|
|
|
alkresin
|
| moderator
|
Пост N: 62
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 12:28. Заголовок: Предполагаемые напра..
Предполагаемые направления работы: 1) Тестирование, тестирование, тестирование ... 2) Проверить, что еще осталось не сделанным из базовых функций - и сделать. Первые претенденты - ordListAdd, ordListClear, ordListDelete - после них можно будет сделать поддержку ntx. Ну и relations, конечно. 3) Насколько это возможно и целесообразно, код сервера должен быть переписан на C, особенно вот это : IF cItem == "skip" ... ELSEIF cItem == "seek" ... 4) Процессы и, возможно, потоки. Я подумал, что можно было бы реализовать потоки на уровне С - это должно быть не сложным, и тогда можно будет разгрузить основной поток, передав туда, например, посылку ответов. 5) С использованием процессов и потоков - реализация транзакций, stored procedures, ... 6) Ну и расширения разные, типа вот этих виртуальных полей
|
|
|
Петр
|
| постоянный участник
|
Пост N: 388
Зарегистрирован: 09.10.06
|
|
Отправлено: 05.02.08 13:08. Заголовок: Судя по всему автори..
Судя по всему авторизация, и все с ней связанное, в LetoDB не предполагается ?
|
|
|
alkresin
|
| moderator
|
Пост N: 63
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 13:33. Заголовок: Предполагается. В in..
Предполагается. В ini файл на сервере будет включена опция, в зависимости от значения которой сервер будет требовать авторизации или нет. Я упустил это в своем списке, а, может, и не только это, потому что сейчас этим не озабочен - штука-то довольно простая в реализации
|
|
|
Петр
|
| постоянный участник
|
Пост N: 389
Зарегистрирован: 09.10.06
|
|
Отправлено: 05.02.08 13:45. Заголовок: alkresin пишет: шту..
alkresin пишет: цитата: | штука-то довольно простая в реализации |
| Привилегии пользователей будут, т.е. вот это - администратор, ему можно все, это - простой юзер, ему даже редактировать данные нельзя, только просмотр ? Если да, то мне кажется об этом заботиться нужно уже сейчас..
|
|
|
alkresin
|
| moderator
|
Пост N: 64
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 15:07. Заголовок: Честно говоря, я не ..
Честно говоря, я не думал о конкретной реализации, просто была в голове мысль, что надо такое сделать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 783
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 15:08. Заголовок: alkresin пишет: 4) ..
alkresin пишет: цитата: | 4) Процессы и, возможно, потоки. Я подумал, что можно было бы реализовать потоки на уровне С - это должно быть не сложным, и тогда можно будет разгрузить основной поток, передав туда, например, посылку ответов. |
| А какими средствами, если не использовать mt xHb ? Тем более, надо расчитывать и на unix, и на windows - сервер
|
|
|
alkresin
|
| moderator
|
Пост N: 65
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 15:10. Заголовок: Pasha, я скинул на C..
Pasha, я скинул на CVS изменения, чтоб работало со свежим xHarbour, не мог бы проверить ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 784
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 15:12. Заголовок: alkresin пишет: пос..
alkresin пишет: цитата: | после них можно будет сделать поддержку ntx. |
| Отдельные rdd выделять не будем ? Сделать что-то вроде LetoConnection(...), и в качестве параметра - используемый rdd ? Еще необходимы Request на используемые кодовые страницы, но это еще на этапе сборки сервера
|
|
|
alkresin
|
| moderator
|
Пост N: 66
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 15:16. Заголовок: А какими средствами,..
цитата: | А какими средствами, если не использовать mt xHb ? Тем более, надо расчитывать и на unix, и на windows - сервер |
| Написать. В xHarbour эти средства большие и сложные, потому что надо было обеспечить корректную работу vm, стека и пр. в условиях mt. Здесь же можно сделать запуск потока только на С уровне, чтобы функция, работающая в этом потоке, не трогала Харборовский стек. Мне кажется, что это не особенно трудоемкое дело.
|
|
|
Pasha
|
| Администратор
|
Пост N: 785
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 15:17. Заголовок: alkresin пишет: Pas..
alkresin пишет: цитата: | Pasha, я скинул на CVS изменения, чтоб работало со свежим xHarbour, не мог бы проверить ? |
| Я с работы на CVS не достучусь. Разве что через browse cvs скачивать Вечером получу только. Это для текущих сырцов, как я понимаю ?
|
|
|
alkresin
|
| moderator
|
Пост N: 67
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 15:20. Заголовок: Отдельные rdd выделя..
цитата: | Отдельные rdd выделять не будем ? Сделать что-то вроде LetoConnection(...), и в качестве параметра - используемый rdd ? |
| Название rdd, думаю, должно передаваться при открытии файла. Может ведь программа работать и с ntx и с cdx, находящимися на одном сервере ( одном соединении ).
|
|
|
alkresin
|
| moderator
|
Пост N: 68
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 15:21. Заголовок: Это для текущих сырц..
цитата: | Это для текущих сырцов, как я понимаю ? |
| Да.
|
|
|
alkresin
|
| moderator
|
Пост N: 69
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 15:34. Заголовок: К разговору о перспе..
К разговору о перспективах: очень заманчиво выглядит возможность использовать это дело для доступа к данным на сервере с мобильного устройства ( КПК, смартфона ). У ADS нет ведь клиентских библиотек для доступа с их серверу, а у нас теперь есть. Лежишь на пляже и проверяешь, сколько тебе зарплаты начислили :), или добавляшь запись в специальную таблицу, а stored proc ее обрабатывает и предпринимает соответствующие действия, например, сообщения рассылает.
|
|
|
Pasha
|
| Администратор
|
Пост N: 786
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 15:43. Заголовок: Сделать харбор для s..
Сделать харбор для symbian, что ли ? :)
|
|
|
Петр
|
| постоянный участник
|
Пост N: 390
Зарегистрирован: 09.10.06
|
|
Отправлено: 05.02.08 15:53. Заголовок: Выглядит очень заман..
Выглядит очень заманчиво, но, наверное, путь не близкий. Поскольку, к примеру, stored proc - фактически полноценное приложение, я себе смутно представляю, как обеспечить безопасность данных на сервере. Поэтому и о авторизации с привилегиями спрашивал..
|
|
|
alkresin
|
| moderator
|
Пост N: 70
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 16:04. Заголовок: Сделать харбор для s..
цитата: | Сделать харбор для symbian, что ли ? |
| Харбор уже работает на мобильных устройствах под Windows Mobile. Просто прилинковать Leto RDD и - вперед. Хотя, конечно, надо еще проверить, как оно будет работать с Интернет - соединением.
|
|
|
alkresin
|
| moderator
|
Пост N: 71
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 16:06. Заголовок: Поскольку, к примеру..
цитата: | Поскольку, к примеру, stored proc - фактически полноценное приложение, я себе смутно представляю, как обеспечить безопасность данных на сервере. |
| Вопрос, конечно, серьезный. Но, с другой стороны, stored proc ведь не любой пользователь помещает, а администратор, он должен знать, что делает.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 391
Зарегистрирован: 09.10.06
|
|
Отправлено: 05.02.08 16:59. Заголовок: alkresin пишет: о, ..
alkresin пишет: цитата: | о, с другой стороны, stored proc ведь не любой пользователь помещает, а администратор, он должен знать, что делает |
| Да, но сервер должен знать, что он именно с администратором общается
|
|
|
alkresin
|
| moderator
|
Пост N: 72
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 18:23. Заголовок: Это если помещать че..
Это если помещать через клиентскую программу и RDD. А если их может разместить только администратор руками на сервере, а клиент может только запустить на исполнение по имени - это уже другая ситуация.
|
|
|
Pasha
|
| Администратор
|
Пост N: 792
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 19:30. Заголовок: alkresin пишет: Pas..
alkresin пишет: цитата: | Pasha, я скинул на CVS изменения, чтоб работало со свежим xHarbour, не мог бы проверить ? |
| Все заработало
|
|
|
alkresin
|
| moderator
|
Пост N: 73
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 20:30. Заголовок: Отлично! Значит, мож..
Отлично! Значит, можно build2 делать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 793
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 20:37. Заголовок: Какая-то проблема с ..
Какая-то проблема с блокировками select order dbAppend() Field->Type:='01' dbcommit() dbunlock() rlock() Field->Stock:='01' dbcommit() dbunlock() вываливается на 2-м коммите Ошибка LETO/1021 Data type error: -015 Алиас ORDER Вызов из DBCOMMIT(0)
|
|
|
Pasha
|
| Администратор
|
Пост N: 794
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 21:08. Заголовок: Разобрался я с мисти..
Разобрался я с мистическим 5-м файлом :) В индексном выражении было обращение к StrZero. А к серверу эта функция не подлинкована. Добавил Request С этим надо что-то делать. Нужен какой-то джентльменский набор функций. Можно хотя бы взять из описания Ads список поддерживаемых функций, да и еще добавить своих, харборовских :)
|
|
|
Pasha
|
| Администратор
|
Пост N: 795
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 21:48. Заголовок: Такой набор функций ..
Такой набор функций Request ; ABS,; ALLTRIM,; AT,; CHR,; CTOD,; DATE,; DAY,; DELETED,; DESCEND,; DTOC,; DTOS,; EMPTY,; I2BIN,; L2BIN,; LEFT,; LEN,; LOWER,; LTRIM,; MAX,; MIN,; MONTH,; PAD,; PADC,; PADL,; PADR,; RAT,; RECNO,; RIGHT,; ROUND,; RTRIM,; SPACE,; STOD,; STR,; STRZERO,; SUBSTR,; TIME,; TRANSFORM,; TRIM,; UPPER,; VAL,; YEAR И специфика Ads /* Ads-specific functions Request ; CONTAINS,; COLLATE,; CTOT,; CTOTS,; LOWERW,; NOW,; REVERSE,; STOTS,; TODAY,; TSTOD,; UPPERW */ Добавляем ?
|
|
|
alkresin
|
| moderator
|
Пост N: 74
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.02.08 22:14. Заголовок: Какая-то проблема с ..
цитата: | Какая-то проблема с блокировками |
| Исправил. Добавляем.
|
|
|
Pasha
|
| Администратор
|
Пост N: 796
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 22:40. Заголовок: Seek ведет себя по-д..
Seek ведет себя по-другому Если тип ключа не совпадает с типом индекса, то dbfcdx просто возвращает .f., а letodb поднимает ошибку
|
|
|
Pasha
|
| Администратор
|
Пост N: 797
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 22:53. Заголовок: теперь с блокировкам..
теперь с блокировками порядок
|
|
|
Pasha
|
| Администратор
|
Пост N: 798
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.02.08 23:20. Заголовок: На сегодня я иссяк :..
На сегодня я иссяк :) Список багов исчерпан
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 468
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.02.08 00:30. Заголовок: alkresin пишет: что..
alkresin пишет: цитата: | чтоб работало со свежим xHarbour, не мог бы проверить ? |
| Я хочу проверить, но так и не собрал ничего на хХарборе ! Сам ехе-ник letodb.exe собрался, а из папки "manager" не собирается, требует библиотеку 'HBCT.LIB' и сборка сама для HARBOUR'a ...
|
|
|
alkresin
|
| moderator
|
Пост N: 75
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.02.08 10:22. Заголовок: Небольшая инструкция..
Небольшая инструкция по использованию ( по просьбе Андрея ). 1) Сервер предназначен для работы c dbf/cdx файлами ( ntx тоже добавим ), расположенными на севере в локальной сети или Интернете. На своем локальном компьютере его имеет смысл использовать только для проверки и отладки. 2) Чтобы запустить сервер, просто запустите letodb.exe ( letodb - в Linux ) из того каталога, который вы для него выберите. После запуска сервер не создает окна, а просто размещается в памяти, при этом создается запись в letodb.log, расположенном по умолчанию в каталоге, откуда сервер запущен. В этот же лог пишутся сообщения об остановке сервера, о проблемах при открытии/создании dbf, и аварийные сообщения, если сервер вдруг слетит ( не должен :) ). Останавливается сервер командой letodb.exe stop. 3) При необходимости можно создать файл letodb.ini в каталоге запуска сервера ( под Linux - можно еще в /etc ). В настоящее время поддерживаются следующие опции (указаны значения по умолчанию): Port = 2812 - номер порта DataPath = - каталог с базами Log = letodb.ini - путь и имя журнала Lower_Path = 0 - для Linux, 1 - если надо переводить пути и имена файлов в нижний регистр. Если указан DataPath, то он будет добавляться к пути при открытии файла. Например, DataPath = d:\data a открываете файл вы командой USE "192.168.3.5:2812/dbsklad/test" В этом случае сервер будет открывать файл d:\data\dbsklad\test.dbf 4) Чтобы скомпилировать вашу программу для работы с Leto db, надо: a) добавить в список библиотек rddleto.lib b) добавить в программу 2 строчки: REQUEST LETO RDDSETDEFAULT( "LETO" ) в) откорректировать пути к базам с учетом имени/ip сервера и порта. Если у вас в программах пути задаются где-то в одном месте, лучше - в ini файле или в параметрах, передаваемых программе, это сделать легко и просто. В идеальном случае после этого ваша программа должна заработать с Leto db сервером ( у меня почти сразу так и получилось ), в реальном - возможны проблемы, т.к. не все функции еще реализованы. 5) Если вы запустили сервер на локальном компьютере, то путь должен быть: //127.0.0.1:2812/... 6) По утилитам в каталоге utils/manage: bld.bat предназначен для компиляции manage.prg - GUI утилита, для сборки нужен HwGUI. Консольная утилита console.prg собирается вашими стандартными средствами, которыми вы собираете свои одно-файловые программы, надо только добавить rddleto.lib в список библиотек.
|
|
|
alkresin
|
| moderator
|
Пост N: 76
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.02.08 10:34. Заголовок: Выложил на Sourcefor..
Выложил на Sourceforge build2 - поправлены все несовместимости с разными версиями Harbour/xHarbour, поисправлены некоторые ошибки, добавлены некоторые базовые функции.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 394
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.02.08 10:42. Заголовок: Andrey пишет: и сбо..
Andrey пишет: цитата: | и сборка сама для HARBOUR'a |
| Здесь можно поспорить По крайней мере названия библиотек не согласуются с Harbour SVN. Но это же не проблема - поменять название библиотеки, добавить или удалить что-то..
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 469
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.02.08 15:20. Заголовок: Andrey пишет: Сам е..
Andrey пишет: цитата: | Сам ехе-ник letodb.exe собрался, а из папки "manager" не собирается, требует библиотеку 'HBCT.LIB' и сборка сама для HARBOUR'a ... |
| Так где ж ее взять ???
|
|
|
alkresin
|
| moderator
|
Пост N: 77
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.02.08 15:26. Заголовок: В xHarbour она назыв..
В xHarbour она называется ct.lib - надо исправить в bld.bat
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 470
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.02.08 16:05. Заголовок: Понял, спасибо ! Тол..
Понял, спасибо ! Только я в Harbour'e не нашел HBCT. Хотя он у меня свежий.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 395
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.02.08 16:09. Заголовок: Andrey, я так думаю,..
Andrey, я так думаю, что тестировать нужно сервер, не manager. Тем более у тебя такие планы были..
|
|
|
Петр
|
| постоянный участник
|
Пост N: 396
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.02.08 16:11. Заголовок: Harbour библиотека H..
Harbour библиотека HBCT находится в contrib.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 471
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.02.08 16:15. Заголовок: alkresin пишет: Log..
alkresin пишет: цитата: | Log = letodb.ini - путь и имя журнала |
| Поправочка ! Строка должна иметь вид: Log = letodb.log
|
|
|
alkresin
|
| moderator
|
Пост N: 78
Зарегистрирован: 06.07.06
|
|
Отправлено: 06.02.08 16:30. Заголовок: Понял, спасибо ! Тол..
цитата: | Понял, спасибо ! Только я в Harbour'e не нашел HBCT. Хотя он у меня свежий. |
| Свежий - это откуда ? C SVN ? Строил из исходников ? Тогда чтоб построить hbct.lib, надо зайти в contrib/hbct и там запустить make_32.bat
|
|
|
gfilatov
|
| модератор
|
Пост N: 704
Зарегистрирован: 25.05.05
|
|
Отправлено: 06.02.08 17:41. Заголовок: Andrey пишет: Так г..
Andrey пишет: Выложил готовую к использованию сборку LetoDB по адресу: http://minigui.mylivepage.ru/file/?fileid=4563 Тестировал в локальном варианте на простом консольном примере: //----------------------------------------------------------------------------// Function Main() REQUEST LETO RDDSETDEFAULT( "LETO" ) USE "//192.168.0.63:2812/data/test" Browse() USE Return nil //----------------------------------------------------------------------------// Программа работает, хотя и тормозит в Browse на Win98 Консольный manager также нормально работает при нажатии 1-2-3
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 472
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.02.08 21:02. Заголовок: Скачал билд2. Собра..
Скачал билд2. Собрал хХарбором letodb.exe и библиотеку. Сделал тестовый пример на Ххарборе, тот что Филатов выше выложил. только пути другие: USE "//127.0.0.1:2812/@/data/test" Запускаю сервер, далее тест получаю: Error LETO/1021 Data type error: -003:21-1001 | Останавливаю все. Беру сборку Филатова, запускаю свой пример на хХарборе, база открывается, броуз показывает. Что делать ??? И по ходу, а где хранится история открытия баз, когда и кем (с какой машины) она была открыта ? И еще у Филатова, сервер нигде не отображается, ни в трее, ни в окне, ни где. Это не есть ХОРОШО !
|
|
|
Pasha
|
| Администратор
|
Пост N: 800
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.02.08 22:39. Заголовок: Еще бы сделать, чтоб..
Еще бы сделать, чтобы для seek передавался произвольный ключ. А сейчас, к примеру, ключ, содержащий символ ';', будет обрезан что-то вроде в letoSeek: if( ( bType = leto_ItemType( pKey ) ) != pArea->pTagCurrent->KeyType ) { sprintf( szData,"goto;%d;-3;%s;\r\n", pArea->hTable, (pArea->pTagCurrent)? pArea->pTagCurrent->TagName:"" ); if ( !leto_SendRecv( pArea, szData, 0, 1021 ) ) return FAILURE; } else { USHORT uiTemp; uiKeyLen = letoKeyToStr( pArea, szKey, bType, pKey ); sprintf( szData,"seek;%d;%s;%c%c;", pArea->hTable, (pArea->pTagCurrent)? pArea->pTagCurrent->TagName:"", (bSoftSeek)? 'T':'F', (bFindLast)? 'T':'F' ); uiTemp = strlen(szData); *(USHORT *) (szData + uiTemp) = uiKeyLen; memcpy(szData + uiTemp + 2, szKey, uiKeyLen); memcpy(szData + uiTemp + 2 + uiKeyLen, "\r\n", 2); szData[uiTemp + 4 + uiKeyLen] = '\0'; if ( !leto_SendRecv( pArea, szData, uiTemp + 4 + uiKeyLen, 1021 ) ) return FAILURE; } и в hs_seek IF Empty( nId := Val( GetCmdItem( cCommand,1,@nPos ) ) ) Return "-002" ENDIF IF Empty( cOrder := GetCmdItem( cCommand,nPos+1,@nPos ) ) Return "-002" ENDIF IF Empty( cFlags := GetCmdItem( cCommand,nPos+1,@nPos ) ) Return "-002" ENDIF nKeyLen := Bin2I(Substr( cCommand, nPos+1, 2)) xKey := Substr( cCommand, nPos+3, nKeyLen ) только в этом коде вываливается gpf на *(USHORT *) (szData + uiTemp) = uiKeyLen; не пойму почему
|
|
|
alkresin
|
| moderator
|
Пост N: 79
Зарегистрирован: 06.07.06
|
|
Отправлено: 07.02.08 09:45. Заголовок: Andrey пишет: тольк..
Andrey пишет: цитата: | только пути другие: USE "//127.0.0.1:2812/@/data/test" |
| А что такое /@ ?
|
|
|
alkresin
|
| moderator
|
Пост N: 80
Зарегистрирован: 06.07.06
|
|
Отправлено: 07.02.08 10:02. Заголовок: Pasha пишет: Еще бы..
Pasha пишет: цитата: | Еще бы сделать, чтобы для seek передавался произвольный ключ. А сейчас, к примеру, ключ, содержащий символ ';', будет обрезан |
| Надо. Ключ ведь теоретически и несимвольный может быть, и с 0 - как ты сам писал раньше. Поэтому тут для передачи надо использовать ту же схему, которая используется для передачи записи. Ты, наверное, уже заметил, что посылка ( в обоих направлениях ) сделана в двух форматах: 1) Простая символьная , признак конца - \r\n 2) Та, что может содержать несимвольную информацию - это когда запись передается с сервера или поля для записи в базу на сервер ( в char полях ведь что угодно может быть ) - в этом случае каждое символьное поле предваряется байтами с его длиной и в начале всей посылки стоит информация о ее длине ( \r\n могут ведь и char поле случайно встретиться ) в таком формате: 1 байт - N количество байтов с информацией о длине посылки (до 10) N байт - длина посылки в специальном формате - функция leto_n2b() ( и leto_b2n() - для обратного преобразования ). Я не использую здесь стандартные функции, потому что формат хранения числа на клиенте и на сервере может быть разным, в зависимости от железа/ОС.
|
|
|
Pasha
|
| Администратор
|
Пост N: 801
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.02.08 11:01. Заголовок: Понятно Может, сдела..
Понятно Может, сделать для seek двоичную структуру пакета, когда на сервере процедура обработки seek будет переписана на C ?
|
|
|
alkresin
|
| moderator
|
Пост N: 81
Зарегистрирован: 06.07.06
|
|
Отправлено: 07.02.08 12:15. Заголовок: Да нет, я сегодня сд..
Да нет, я сегодня сделаю, наверное.
|
|
|
Pasha
|
| Администратор
|
Пост N: 803
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.02.08 22:45. Заголовок: Немного поправил исп..
Немного поправил использование каталогов при открытии и создании файлов
|
|
|
Pasha
|
| Администратор
|
Пост N: 804
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.02.08 11:08. Заголовок: У меня есть такая фу..
У меня есть такая функция - реструктуризация таблицы (выполняется, естественно, монопольно) Для ее работы необходимы файловые операции rename/delete Добавляем ? И как быть с безопасность данных ?
|
|
|
Петр
|
| постоянный участник
|
Пост N: 402
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.02.08 12:27. Заголовок: Pasha пишет: Добавл..
Pasha пишет: цитата: | Добавляем ? И как быть с безопасность данных ? |
| Мое мнение, так же как и в случае со stored proc, сначала нужно разобраться с управлением пользователей. Т.е. перед выполнением любого запроса/действия нужно убедиться, уполномочен ли обьект установивший подключение на выполнение таких действий.
|
|
|
Pasha
|
| Администратор
|
Пост N: 806
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.02.08 13:10. Заголовок: Петр пишет: Мое мне..
Петр пишет: цитата: | Мое мнение, так же как и в случае со stored proc, сначала нужно разобраться с управлением пользователей. |
| Есть предложения, как это реализовать ?
|
|
|
alkresin
|
| moderator
|
Пост N: 83
Зарегистрирован: 06.07.06
|
|
Отправлено: 08.02.08 14:16. Заголовок: Добавляем. По безопа..
Добавляем. По безопасности - важно то, что эти операции можно сделать только с помощью Leto, т.е.: 1) если это предусмотрел автор программы ( а не рядовой user, не знающий куда деть руки ), а он должен знать, что делает 2) эти операции не опаснее, чем zap, например 3) авторизацию на сервере мы, так или иначе, сделаем - и там в опциях можно будет указать, например, что на удаление/переименование имеет право только админ.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 403
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.02.08 15:18. Заголовок: alkresin пишет: Доб..
alkresin пишет: цитата: | Добавляем. По безопасности - важно то, что эти операции можно сделать только с помощью Leto, т.е.: 1) если это предусмотрел автор программы ( а не рядовой user, не знающий куда деть руки ), а он должен знать, что делает 2) эти операции не опаснее, чем zap, например 3) авторизацию на сервере мы, так или иначе, сделаем - и там в опциях можно будет указать, например, что на удаление/переименование имеет право только админ. |
| То что все операции делаются с помощью серверов - это понятно. По первому пункту - знать то он должен, а на практике.. Если мы считаем операцию ZAP небезопасной - мы можем на сервере ее и не выполнять. Закрыть таблицу, переименовать в какой-то dbf.bak и создать новую с именем и структурой прежней - быстрый бэкап, или более медленный - сохранить каким либо образом все данные и сделать ZAP. Только я вот не понял - в существующем варианте letodb допускает конкурирующих юзерей или нет? По третьему пункту - если этим никто еще не занимается, то я могу внести на рассмотрение свои предложения, правда только после того как решу проблему гриппа..
|
|
|
Pasha
|
| Администратор
|
Пост N: 807
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.02.08 17:40. Заголовок: Петр пишет: По трет..
Петр пишет: цитата: | По третьему пункту - если этим никто еще не занимается |
| Я не занимаюсь
|
|
|
alkresin
|
| moderator
|
Пост N: 84
Зарегистрирован: 06.07.06
|
|
Отправлено: 08.02.08 19:36. Заголовок: Только я вот не поня..
цитата: | Только я вот не понял - в существующем варианте letodb допускает конкурирующих юзерей или нет? |
| Да. цитата: | По третьему пункту - если этим никто еще не занимается, то я могу внести на рассмотрение свои предложения, |
| Ждем.
|
|
|
Pasha
|
| Администратор
|
Пост N: 808
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.02.08 21:01. Заголовок: Мне кажется, надо пе..
Мне кажется, надо переделать delete/recall. Сейчас эта команда сразу передается на сервер и немедленно выполняется Надо это делать только при putRec, т.е добавить к этой команде еще один параметр. При нынешней схеме может произойти такая ситуация: dbAppend() // команда на сервер еще не передана dbDelete() // команда на сервер сразу передана и фактически не отработана, поскольку запись еще не добавлена ... dbCommit() // добавлена запись, у которой не установлен флаг deleted()
|
|
|
Pasha
|
| Администратор
|
Пост N: 809
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.02.08 22:14. Заголовок: Надо вводить что-то ..
Надо вводить что-то вроде Connection Id. Каждый раз передавать ip-адрес и порт неудобно
|
|
|
Петр
|
| постоянный участник
|
Пост N: 406
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.02.08 22:45. Заголовок: Pasha пишет: Надо в..
Pasha пишет: цитата: | Надо вводить что-то вроде Connection Id. Каждый раз передавать ip-адрес и порт неудобно |
| Не знаю, что Вы конкретно имели ввиду, но в принципе согласен что-то вроде CREATE CONNECTION mycon USER "user" PASSWORD "password" IF mycon:ErrorCode() != 0 ? "Извините, сервер недоступен" Return 1 ENDIF USE table1 NEW CONNECTION mycon USE table2 NEW CONNECTION mycon тогда и с авторизацией меньше хлопот буде и обработку ошибок легче будет делать, и проверку "живо" ли соеденение перед операциями с таблицей после длительного простоя или во время длительной операции можно будет организовать..
|
|
|
Pasha
|
| Администратор
|
Пост N: 810
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.02.08 23:43. Заголовок: Да, так было бы лучш..
Да, так было бы лучше всего. Тем более параметр nConnection предусмотрен в dbUse/dbCreate Только он должен быть числовой
|
|
|
Петр
|
| постоянный участник
|
Пост N: 407
Зарегистрирован: 09.10.06
|
|
Отправлено: 08.02.08 23:57. Заголовок: Некоторые несущественные замечания
Увидя в коде сл.конструкцию и зная об отличии в реализации Adel Harbour и xHarbour сначала заменил цитата: | j := Ascan( HSTable():aTables,{|o|o==oTable} ) Adel( HSTable():aTables,j ) Asize( HSTable():aTables,Len(HSTable():aTables)-1 ) |
| на цитата: | j := Ascan( HSTable():aTables,{|o|o==oTable} ) #ifdef __XHARBOUR__ Adel( HSTable():aTables,j, .t. ) #else #include "hbver.h" #if HB_VER_MAJOR >= 1 Hb_Adel( HSTable():aTables,j, .t. ) #else Adel( HSTable():aTables,j ) Asize( HSTable():aTables,Len(HSTable():aTables)-1 ) #endif #endif |
| Потом решил, что это громоздко и по принципу leto_at написал leto_adel, потом опять подумал и решил, что лучше будет использовать leto_ScanAndDel цитата: | HB_FUNC( LETO_SCANANDDEL ) { PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY ); PHB_ITEM pValue = hb_param( 2, HB_IT_ANY ); if( pArray && pValue ) { ULONG ulStart = hb_parnl( 3 ); ULONG ulCount = hb_parnl( 4 ); long lPos; lPos = hb_arrayScan( pArray, pValue, ISNUM( 3 ) ? &ulStart : NULL, ISNUM( 4 ) ? &ulCount : NULL, FALSE ); if (lPos > 0 && hb_arrayDel(pArray, lPos) ) { hb_arraySize( pArray, hb_arrayLen( pArray ) - 1 ); } } hb_itemReturn( pArray ); } |
|
|
|
|
alkresin
|
| moderator
|
Пост N: 85
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 10:33. Заголовок: Мне кажется, надо пе..
цитата: | Мне кажется, надо переделать delete/recall. Сейчас эта команда сразу передается на сервер и немедленно выполняется Надо это делать только при putRec, т.е добавить к этой команде еще один параметр. |
| Да, пожалуй.
|
|
|
alkresin
|
| moderator
|
Пост N: 86
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 10:49. Заголовок: Что-то вроде CREATE ..
Что-то вроде CREATE CONNECTION так или иначе надо вводить, чтобы указать логин/пароль, если это требует сервер. А use/create с использованием ID можно ввести опционально, оставив и существующую схему, поскольку она ( существующая ) позволяет оставить код программы без изменений. Я, честно говоря, не вижу проблем с ее использованием. Если пути к файлам хранятся в переменных, инициализируемых в начале программы, как оно по хорошему и должно быть, а не указываются непосредственно в команде USE, то для программиста это изменение пути будет практически незаметно.
|
|
|
alkresin
|
| moderator
|
Пост N: 87
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 10:49. Заголовок: Петр пишет: Увидя в..
Петр пишет: цитата: | Увидя в коде сл.конструкцию и зная об отличии в реализации Adel Harbour и xHarbour |
| А в чем эта разница ? Я не в курсе.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 408
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 11:21. Заголовок: Дело в том, что xHar..
Дело в том, что xHarbour за счет введения третьего параметра позволяет заменить конструкцию Adel( array, pos ) Asize( array, Len(array)-1 ) на Adel( array, pos, .t. ) третий параметр т.н. <lShrink> Optionally, a logical value can be specified. If .T. (true) is passed, the length of the array is reduced by one element. The default value is .F. (false) leaving the number of elements in <aArray> unchanged Это удобно и выполняется быстрее. В Harbour c недавного времени тоже есть подобная функция - она называется Hb_Adel. Сначала она появилась в xhb.lib, а потом ввиду очевидных преимуществ попала и в core.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 409
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 12:03. Заголовок: alkresin пишет: Что..
alkresin пишет: цитата: | Что-то вроде CREATE CONNECTION так или иначе надо вводить, чтобы указать логин/пароль, если это требует сервер. А use/create с использованием ID можно ввести опционально, оставив и существующую схему, поскольку она ( существующая ) позволяет оставить код программы без изменений. Я, честно говоря, не вижу проблем с ее использованием. |
| hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() != 0 ?LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") ENDIF hSocket := NIL Выполнение этого кода меня не порадовало. Сервер обязательно должен требовать авторизацию, другое дело можно позволить анонимный вход с учетной записью по умолчанию и с соответствующими ей правами. Я понимаю, что Вы стремитесь к минимизации переделок существующего кода и это очень хорошо. Но код все равно придется переделывать, добавлять же нужно REQUEST LETO RDDSETDEFAULT( "LETO" ) почему не добавить еще и CREATE CONNECTION cn USER "user" PASSWORD "password" IF cn:ErrorCode() != 0 ? "Извините, сервер недоступен" Return 1 ENDIF OPEN DATABASE base CONNECTION cn IF base:ErrorCode() != 0 ? "Извините, не удалось открыть базу " Return 1 ENDIF USE table1 NEW USE table2 NEW [DATABASE base] .. К тому же, на мой взгяд DataPath в letodb.ini не может быть опциональным, как и IndexPath. И leto_file() должна быть привязана к DataPath/IndexPath Да и сам letodb.ini не может не существовать..
|
|
|
Петр
|
| постоянный участник
|
Пост N: 410
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 12:42. Заголовок: + added LETO_FER..
цитата: | + added LETO_FERASE(), LETO_FRENAME(), LETO_FERROR() functions |
| Тест успешно пройден hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() != 0 ?LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") ?LETO_FERASE("//127.0.0.1:2812/c:/windows/system.ini") ENDIF hSocket := NIL
|
|
|
Pasha
|
| Администратор
|
Пост N: 811
Зарегистрирован: 23.05.05
|
|
Отправлено: 09.02.08 13:26. Заголовок: Петр пишет: почему ..
Петр пишет: цитата: | почему не добавить еще и CREATE CONNECTION cn USER "user" PASSWORD "password" |
| Этой функции можно было бы передавать еще используемый rdd на сервере: dbfcdx/dbfntx/etc
|
|
|
Pasha
|
| Администратор
|
Пост N: 812
Зарегистрирован: 23.05.05
|
|
Отправлено: 09.02.08 13:27. Заголовок: Петр пишет: Тест ус..
Петр пишет: цитата: | Тест успешно пройден hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() != 0 ?LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") ?LETO_FERASE("//127.0.0.1:2812/c:/windows/system.ini") ENDIF hSocket := NIL |
| :) что тут еще сказать :)
|
|
|
Pasha
|
| Администратор
|
Пост N: 813
Зарегистрирован: 23.05.05
|
|
Отправлено: 09.02.08 13:28. Заголовок: добавил ordCondSet()..
добавил ordCondSet()
|
|
|
Pasha
|
| Администратор
|
Пост N: 814
Зарегистрирован: 23.05.05
|
|
Отправлено: 09.02.08 13:31. Заголовок: Какие будут предложе..
Какие будут предложения по безопасности ? Давать права на опасные операции на ккаталоги БД или отдельно на таблицы/индексы ?
|
|
|
alkresin
|
| moderator
|
Пост N: 88
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 13:49. Заголовок: Потом решил, что это..
цитата: | Потом решил, что это громоздко и по принципу leto_at написал leto_adel, потом опять подумал и решил, что лучше будет использовать leto_ScanAndDel |
| Дело хорошее, но надо еще подумать :). Наученный горьким опытом, я заглянул в сырцы xHarbour и обнаружил, что там в hb_arrayScan() уже 6 параметров: ULONG HB_EXPORT hb_arrayScan( PHB_ITEM pArray, PHB_ITEM pValue, ULONG * pulStart, ULONG * pulCount, BOOL bExact, BOOL bAllowChar )
|
|
|
Петр
|
| постоянный участник
|
Пост N: 411
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 14:14. Заголовок: Pasha пишет: Этой ф..
Pasha пишет: цитата: | Этой функции можно было бы передавать еще используемый rdd на сервере: dbfcdx/dbfntx/etc |
| Возможно лучше OPEN DATABASE base CONNECTION cn VIA "RDDCDX" Pasha пишет: цитата: | Какие будут предложения по безопасности ? Давать права на опасные операции на каталоги БД или отдельно на таблицы/индексы ? |
| Давайте определимся, что в нашем случае есть БД - это конкретная таблица или каталог с логически связанными таблицами (+каталог с индексами конечно). Мне кажется, что каталог. Свойства БД мы можем хранить в letodb.ini [SERVER] AllowIP=127.0.0.1;169.128.0.9 AllowAnonymus=TRUE [DATABASE] DBName=base DBPatch=c:\mybase\data DBPatchIndex=c:\mybase\indexes DBCPAGE=RU866 AllowIP=127.0.0.1;169.128.0.9 AllowAnonymus=FALSE При установлении соеденения мы проверяем есть ли у данного пользователя право на подключение к серверу. Сначала проверим на допустимость IP, потом анонимно ли соединение, если анонимно - то позволены ли такие подключения, если именное подключение то проверим допустимость имени и пароля, не подключен ли уже такой пользователь pwd.ini [USER] UserName=master UserPWD=mypwd UserGROUP=ADMINISTRATORS [USER] UserName=user1 UserPWD=myusrpwd UserGROUP=USERS Если все хорошо регистрируем на сервере connection и возвращаем его хендл Потом при выполнении любой операции по хендлу connection определяем пользователя и его права ( в зависимости от того в какую группу мы его включили ) и выполняем или нет - выставляем NO_ACCESS или SERVER_BUSY Это так схема, все технические детали можно будет согласовать после принятия такой схемы, или искать новую
|
|
|
Петр
|
| постоянный участник
|
Пост N: 412
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 14:25. Заголовок: alkresin пишет: Дел..
alkresin пишет: цитата: | Дело хорошее, но надо еще подумать :) |
| Извините, это я просто забыл об этом, нужно кое-что просто подправить. Схема в xHb уже устоявшаяся. 6-й параметр там уже давно, и связан с тем как xHarbour обрабатывает строку с одного символа. Я сталкивался с этим когда писал wrapper для unrar.dll. Вот этот код if( pArray != NULL ) { if( (PFCode = RARProcessFile(hArcData, (hb_arrayScan(pArray, pValue, NULL, NULL, #ifdef __XHARBOUR__ FALSE, #endif FALSE) > 0) ? Operation : RAR_SKIP, pszDst, NULL)) != 0 ) { OutProcessFileError( PFCode, HeaderData.FileName ); fResult = FALSE; break; } } одинаково хорошо работает и со старой версией xHb (конкретно тестировалось на 0.99.5, 0.99.7 ) и с 1.0. и CVS. Ну и соответственно с Harbour.
|
|
|
alkresin
|
| moderator
|
Пост N: 89
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 14:34. Заголовок: Петр пишет: К тому ..
Петр пишет: цитата: | К тому же, на мой взгяд DataPath в letodb.ini не может быть опциональным, как и IndexPath. И leto_file() должна быть привязана к DataPath/IndexPath |
| Вопрос о DataPath и о наличии letodb.ini я бы все же предпочел оставить на усмотрение администратора. А вот все файловые функции, включая File(), действительно, надо разрешать только при непустом DataPath, а erase/rename - только для файлов с раширениями .dbf,.fpt,... Вносить какие-то уязвимости на сервер мы не имеем права. цитата: | Но код все равно придется переделывать, добавлять же нужно REQUEST LETO RDDSETDEFAULT( "LETO" ) |
| Это стандартная вставка для каждого RDD. цитата: | почему не добавить еще и CREATE CONNECTION cn USER "user" PASSWORD "password" ... |
| Чтобы не вынуждать человека делать то, что ему, может, и не нужно. В значительной части случаев люди переделывают уже существующие программные комплексы под новую платформу, сервер, RDD и в их программах, скорее всего, уже есть какие-то средства авторизации, зачем же заставлять их использовать другие вместо/или дополнительно к своим ? Я представляю себе весь процесс перехода на новый RDD так: сначала человек просто ставит сервер, перекомпилирует свои программы, добавив туда 2 строчки - и все работает так, как оно работало и раньше, но на новой платформе, с использованием преимуществ клиент-серверной схемы. А дальше, при наличии времени и желания он меняет свои программы, добавляя новые возможности.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 413
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 15:06. Заголовок: alkresin пишет: Вно..
alkresin пишет: цитата: | Вносить какие-то уязвимости на сервер мы не имеем права. |
| Согласен IF LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") dbCreate( "//127.0.0.1:2812/c:/windows/system.ini", aStruct ) ENDIF Кстати, первую уязвимость вашего сервера, показали Вы, Александр: Log=letodb.ini
|
|
|
alkresin
|
| moderator
|
Пост N: 90
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 16:51. Заголовок: IF LETO_FILE("//..
цитата: | IF LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") dbCreate( "//127.0.0.1:2812/c:/windows/system.ini", aStruct ) ENDIF |
| Так мы же, вроде, договорились, что файловые функции будут работать только при непустом DataPath - а при этом c:\ не прокатит. цитата: | Кстати, первую уязвимость вашего сервера, показали Вы, Александр: Log=letodb.ini |
| :) ini - файл, при этом, кстати, не пострадает. Впрочем, здесь есть о чем подумать.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 414
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 17:31. Заголовок: alkresin пишет: Так..
alkresin пишет: цитата: | Так мы же, вроде, договорились, что файловые функции будут работать только при непустом DataPath - а при этом c:\ не прокатит. |
| Хорошо, вот это тоже не должно работать DataPath=c:/test IF LETO_FILE("//127.0.0.1:2812/../windows/*.*") По сути файловые функции это и dbCreat, INDEX TO, COPY TO и т.п. - еще немного и Вы согласитесь со мной в вопросе о DataPath и наличии letodb.ini
|
|
|
alkresin
|
| moderator
|
Пост N: 91
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 18:45. Заголовок: DataPath=c:/test IF ..
цитата: | DataPath=c:/test IF LETO_FILE("//127.0.0.1:2812/../windows/*.*") |
| Надо будет вставить что-то вроде if At( "..",cPath) != 0 return ERROR endif Но это, кстати, не относится к вопросу об обязательности DataPath :)
|
|
|
alkresin
|
| moderator
|
Пост N: 92
Зарегистрирован: 06.07.06
|
|
Отправлено: 09.02.08 19:00. Заголовок: Давайте определимся,..
цитата: | Давайте определимся, что в нашем случае есть БД - это конкретная таблица или каталог с логически связанными таблицами (+каталог с индексами конечно). |
| А зачем нам вообще вводить такую дополнительную сущность ? Что она дает разработчику, что она для него означает ? Даже если вводить это дело опционально, надо объяснить, что получит программист от его использования. Если это нужно для удобства разграничения прав ( чтоб на каждый файл не писать ), то это можно сделать на уровне серверного модуля ...
|
|
|
Петр
|
| постоянный участник
|
Пост N: 415
Зарегистрирован: 09.10.06
|
|
Отправлено: 09.02.08 20:23. Заголовок: Разработчику БД може..
Разработчику БД может и ничего, кроме безопасности, а разработчика сервера (администратора) может от головной боли спасти Ну это почти шутка. Попробую, как смогу, обьяснить идею (по сути позаимствованную у больших РБД). Вот если я знаю, что у меня БД - каталог, я могу создать в этом (?) каталоге таблицу которая содержит всю служебную информацию о содержимом каталога (БД). И мне не надо (серверу) проверять каждый раз есть ли, допустим, в базе данных таблица "разработчики" используя функцию File - достаточно произвести поиск в таблице "мастер" ( да тот самый SELECT name FROM master WHERE obj_name == "разработчики" AND obj_type == TABLE, который в той или иной форме допускают все РБД). Тоже самое относится к блокировкам (Р.Спенс "Кто владеет моей блокировкой" ) К тому же, не знаю как-кто, а я привык обычно размещать таблицы в одной папке, а даже если не так, то кто мешает нам в той же таблице мастер создать запись obj_name obj_type obj_shared obj_attached obj_location ------------------------------------------------------------------------------------------------- продажи table no no %DATAPATH% клиенты table no yes d:\clients\clients.dbf или даже со временем клиенты table no yes //192.168.0.25:2042/clients.dbf Можна организовывать словари таблиц и много чего другого, что на ум придет. Восстанавливать структуру такой таблицы автоматически тоже можно будет, достаточно лищь сохранять информацию о структуре таблиц и индексных файлов, типе RDD. Если позже захочется поиграться с SQL, то тоже будет намного легче, имея такую служебную информацию. Кроме того, раз речь выше шла о stored proc и triggers, то хочу напомнить, что используя Harbour (библиотеку compiler) эти самые процедуры можно будет организовывать без hrb и следовательно обращения к дисковой системе. Менять их удаленно и перекомпилировать на лету (естественно после того как решить все вопросы связанные с авторизацией). Или даже используя hrb (или задекларированные когда-то разработчиками Harbour библиотеки hrb - если их создадут, или создать самим - я думаю это не самое трудное задание) - информацию о них тоже нужно где-то хранить (размещение, контрольную сумму, желательно версию P_CODE) В краткосрочной перспективе. действительно, это может и не дать ничего существенного, но если этим заняться "всерьез и надолго" (хотя бы на год) .. Все - аргументы иссякли, красноречие тоже
|
|
|
alkresin
|
| moderator
|
Пост N: 93
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.02.08 13:50. Заголовок: Все это хорошо, я бы..
Все это хорошо, я бы добавил еще в master table возможность сослаться на курсор из какой-нибудь доступной SQL DBMS. Но: 1) Такую master table, также, как и stored proc разных видов, можно организовать, и не пользуясь концепцией database - и тут прилагаем бритву Оккама :). 2) Я все еще не вижу, зачем клиентской программе знать о существовании такого внутреннего разделения данных на сервере на databases и открывать эти databases. Сервер, если databases определены и master tables, управление правами и т.д сделаны на их уровне, может сам определить, к какой database относится открываемая таблица и выполнить соответствующие действия. Я - противник того, чтобы заставлять людей делать то, что им не нужно. Сначала пусть просто запустит letodb.exe, посмотрит, как это работает в деле, не заморачиваясь содержимым ini-файла. Чуть позже, если сочтет это нужным, добавит letodb.ini с DataPath. Потом, может, решит ( а может и нет ), что лучше использовать средства авторизации и определения прав, предлагаемые сервером, и активизирует там эти средства. Может, ему понравится идея master-table, и он активизирует и эту возможность. И так же - с databases, и со всем, что мы здесь придумаем. Но говорить разработчику: вот тебе letodb, чтобы использовать ее, ты должен разбить свои данные на databases, описать все это в ini-файле, создать и заполнить для каждой database master-table и дополнительные файлы системы управления правами, ... Да еще открывать эти databases, без которых ты прекрасно жил до того, в своей программе. Я - против. Кстати, для полной защиты от файловых функций предлагаю добавить в ini-файл опции, разрешающие их - по умолчанию - запрет.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 416
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.02.08 16:46. Заголовок: Отвечать буду не по ..
Отвечать буду не по порядку: alkresin пишет: цитата: | Я все еще не вижу, зачем клиентской программе знать о существовании такого внутреннего разделения данных на сервере на databases и открывать эти databases. |
| Незачем - если эта клиентская программа не изощренный Manager, позволяющий нам с комфортом админить БД удаленно - добавлять пользователей, менять их роли, менять структуру таблиц, создавать индексы, править stored proc и триггеры или прото смотреть, кто из пользователей сейчас работает, что делает, отключать кто не понравился или всех сразу (в случае плохого настоения или производственной необходимости). цитата: | Такую master table, также, как и stored proc разных видов, можно организовать.. |
| Можно. цитата: | Сначала пусть просто запустит letodb.exe, посмотрит, как это работает в деле |
| Согласен. Кстати, здесь несколько возможных пользователей уже заявляли о своей готовности тестировать/использовать такой продукт. Я думаю, что было бы неплохо услышать их мнение, первые впечатления так сказать и, что особенно важно, что они ожидают увидеть в бл.будущем. цитата: | Но говорить разработчику: |
| Пока никто ничего не говорил. Ini файл придется все равно включать в поставку, пускай и с закомментированными строками, утилиту для проверки это ini файла придется писать (не скармливать же неизвестно, что работающему серверу) - это как в apache (учиться на чужом опыте не должно быть зазорно никому). Создание и заполнение master и прочих служебных таблиц - это дело сервера и (или) admin tools. Про их открытие я уже писал - они сугубо для внутреннего пользования и их использование должно быть по возможности максимально скрыто от конечного пользователя. Тоже относится к управлению правами - по умолчанию для сервера - все пользователи могут быть определены как anonymus. alkresin пишет: цитата: | Кстати, для полной защиты от файловых функций |
| Не мне Вам говорить, но любая более менее серьезная клипперная программа использует файловые функции - и что каждый раз ходить к серверу - ini править (удаленное да и просто управление правами не реализовано ).
|
|
|
alkresin
|
| moderator
|
Пост N: 94
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.02.08 17:53. Заголовок: Не мне Вам говорить,..
цитата: | Не мне Вам говорить, но любая более менее серьезная клипперная программа использует файловые функции - и что каждый раз ходить к серверу - ini править (удаленное да и просто управление правами не реализовано |
| Зачем каждый раз ? Один раз решить этот вопрос и поставить. Кстати, наверное, надо будет и leto_FOpen(), leto_FRead(), ... сделать. Я не против того, чтобы сделать управление правами, его так или иначе надо будет делать ( опционально! :) ), просто в мои личные рабочие планы это пока не входит. Я только что запостил кое-какие изменения, выработанные на основании нашей дискуссии. Итак: 1) Файловые операции разрешены только при непустом значении DataPath и при EnableFileFunc = 1 в letodb.ini 2) Использование ../ в пути запрещено 3) Создание файлов данных и индексов с нестандартными расширениями разрешено только при наличии EnableAnyExt = 1 в letodb.ini 4) Logfile может быть только с расширением .log :) Да, Петр, как мне вас назвать в Changelog'e ( я там вашу leto_scananddel() добавил ) ?
|
|
|
Петр
|
| постоянный участник
|
Пост N: 417
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.02.08 18:51. Заголовок: Обычно пишу P.Chorny..
Обычно пишу P.Chornyj <myorg63@mail.ru> sourceforge - petr_ch Александр, у меня есть еще несколько мелких замечаний по реализации aSock := hb_ipAccept( Socket ) nOperations ++ IF hb_ipErrorCode() == 0 oSock := HSUser():New( aSock/*[1]*/ ) //oSock:cAddr := aSock[2] //oSock:nPort := aSock[3] Как Вы видите я перенес у себя инициализацию полей cAddr, nPort в метод New - мне кажется так оно быстрее вертеться будет, исходя из мого понимания реализации ООП в Harbour, возможно я и ошибаюсь. Сл., возможно Request ; ABS,; ALLTRIM,; надо вынести в отдельный ch по типу hbexternal.ch также я заменил IF cItem == "skip" cReply := hs_skip( oUser,Substr(cCommand,nPos1+1) ) ELSEIF cItem == "seek" cReply := hs_seek( oUser,Substr(cCommand,nPos1+1) ) на nItem := AScan( aCommand, cItem ) SWITCH nItem CASE 1 cReply := hs_skip( oUser,Substr(cCommand,nPos1+1) ) EXIT никакого существенного выиграша это не дает, наверное из-за AScan, но xHarbour не позволяет использовать CASE "skip" , Я понимаю, что возможно все это когда нибудь будет переписано на C (или не будет ), но все же хочу завтра переписать GetCmdItem и потестировать. Сл. очень часто используется Ltrim(Str( Для таких случаев xHb в Str имеет четвертый параметр <lTrim> - This parameter defaults to .F. (false). When .T. (true) is passed, the returned string has no leading spaces. И может еще что-то менял у себя, вспомню напишу.
|
|
|
alkresin
|
| moderator
|
Пост N: 95
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.02.08 19:33. Заголовок: sourceforge - petr_c..
Это запрос на добавление в список developer'ов :) ? Если да, то добавлю, конечно. цитата: | Я понимаю, что возможно все это когда нибудь будет переписано на C (или не будет |
| Обязательно будет, и не только это.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 418
Зарегистрирован: 09.10.06
|
|
Отправлено: 10.02.08 19:42. Заголовок: alkresin пишет: Это..
alkresin пишет: цитата: | Это запрос на добавление в список developer'ов :) |
| Да, пока управление правами никто не застолбил (опционально, конечно)
|
|
|
alkresin
|
| moderator
|
Пост N: 96
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.02.08 21:23. Заголовок: Добавил...
Добавил.
|
|
|
alkresin
|
| moderator
|
Пост N: 97
Зарегистрирован: 06.07.06
|
|
Отправлено: 12.02.08 09:52. Заголовок: Петр, вы забыли в Ch..
Петр, вы забыли в Changelog запись занести и, желательно, на https://sourceforge.net/forum/forum.php?forum_id=779825
|
|
|
Петр
|
| постоянный участник
|
Пост N: 421
Зарегистрирован: 09.10.06
|
|
Отправлено: 12.02.08 10:44. Заголовок: Спасибо, внес. err..
Спасибо, внес. errorsys на С переводить будем?
|
|
|
alkresin
|
| moderator
|
Пост N: 98
Зарегистрирован: 06.07.06
|
|
Отправлено: 12.02.08 11:18. Заголовок: errorsys на С перево..
цитата: | errorsys на С переводить будем? |
| А зачем ? Выигрыша в скорости это не даст.
|
|
|
Петр
|
| постоянный участник
|
Пост N: 422
Зарегистрирован: 09.10.06
|
|
Отправлено: 12.02.08 11:44. Заголовок: Я собственно о WrLog..
Я собственно о WrLog - бы иметь общую функцию и для PRG и для C
|
|
|
alkresin
|
| moderator
|
Пост N: 99
Зарегистрирован: 06.07.06
|
|
Отправлено: 12.02.08 13:30. Заголовок: Может, и стоит. Пока..
Может, и стоит. Пока необходимости не возникало, поэтому и не думал на эту тему.
|
|
|
alkresin
|
| moderator
|
Пост N: 101
Зарегистрирован: 06.07.06
|
|
Отправлено: 13.02.08 15:34. Заголовок: Перевел значительные..
Перевел значительные куски сервера, включая ParseCommand, на С. Теперь можно смотреть в сторону дополнительных процессов и потоков.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 489
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.02.08 13:46. Заголовок: Полез пробовать утил..
Полез пробовать утилиту и получил ошибку: Error BASE/1004 No exported method: SEND Called from SEND(0) Called from USERSINFO(212) Called from (b)MAIN(88) Called from ONCOMMAND(286) Called from (b)(_INITSTATICS00003)(0) Called from HCONTROL:ONEVENT(148) Called from HPANEL:ONEVENT(93) Called from HWG_ACTIVATEMAINWINDOW(0) Called from HMAINWINDOW:ACTIVATE(231) Called from MAIN(100) HwGUI 2.16 Harbour devel build 1.1-1 Intl. Date:02/18/08 Time:13:26:03 Потом догадался, что не ввел IP-adres & Port. Надо бы сделать для "чайников" обработку и надпись для ввода.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 490
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.02.08 16:35. Заголовок: Что-то не получается..
Что-то не получается у меня открыть FOX базу на сервере. Добавил VIA "RDDCDX" - ругается USE "//192.168.220.3:2812/FOND/DAT/spiski" SHARED NEW VIA "RDDCDX" что: Subsystem Call ....: DBCMD System Code .......: 1015 Default Status ....: .F. Description .......: Неверный аргумент Operation .........: DBUSEAREA Arguments .........: Involved File .....: Dos Error Code ....: 0 Если убрать VIA то пишет: Open error (21-1001): E:\WORK_UCHET/FOND/DAT/spiski Другой dbf файл без МЕМО открывает нормально.
|
|
|
lista
|
| |
Пост N: 44
Зарегистрирован: 15.11.05
|
|
Отправлено: 18.02.08 16:57. Заголовок: >А NTX-ы поддерж..
>А NTX-ы поддерживает ? А программный код дорабатывать нужно и насколько ? >А то у меня есть задачка на Clipper-е, которая реально работает 10 лет в сети, и нагрузка приличная. Можно было >бы потестировать, да и быстродействие сравнить. А на Линух перетащить под Clip. У меня работает на Ура!
|
|
|
alkresin
|
| moderator
|
Пост N: 102
Зарегистрирован: 06.07.06
|
|
Отправлено: 18.02.08 22:55. Заголовок: Что-то не получается..
цитата: | Что-то не получается у меня открыть FOX базу на сервере. |
| А просто Харбором c DBFCDX она открывается ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 492
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.02.08 09:20. Заголовок: alkresin пишет: А п..
alkresin пишет: цитата: | А просто Харбором c DBFCDX она открывается ? |
| Конечно открывается, я просто подключил рабочую базу на сервере и решил с ней параллельно проэксперементировать. И затык.....
|
|
|
alkresin
|
| moderator
|
Пост N: 103
Зарегистрирован: 06.07.06
|
|
Отправлено: 19.02.08 10:19. Заголовок: Ну пришлите мне ее н..
Ну пришлите мне ее на email, только очистите сначала zap'ом
|
|
|
alkresin
|
| moderator
|
Пост N: 104
Зарегистрирован: 06.07.06
|
|
Отправлено: 19.02.08 10:25. Заголовок: lista пишет: А на Л..
lista пишет: цитата: | А на Линух перетащить под Clip. |
| Можно и так, в терминале с stelnet. Кстати, таким же образом можно и под Харбор.
|
|
|
abakkav
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 19.02.08 11:52. Заголовок: А что делать с собст..
А что делать с собственными функциями в индексном выражении? Эта проблема уже всплывала?
|
|
|
alkresin
|
| moderator
|
Пост N: 105
Зарегистрирован: 06.07.06
|
|
Отправлено: 19.02.08 12:31. Заголовок: А что делать с собст..
цитата: | А что делать с собственными функциями в индексном выражении? Эта проблема уже всплывала? |
| Я вижу здесь 2 варианта: 1) Избавляться от них - как при использовании ADS 2) Собрать сервер вместе с этими функциями
|
|
|
abakkav
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 19.02.08 14:48. Заголовок: Мысль понятна. Интер..
Мысль понятна. Интересно, а как с этим борется Польский медиатор? Он вообще не индексирует на сервере или передает клиенту, если ключ нестандартный?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 494
Зарегистрирован: 12.09.06
|
|
Отправлено: 19.02.08 23:13. Заголовок: А можно привести при..
А можно привести пример открытия БД с мемо полем FPT ? Может быть я синтакис неправильно делаю ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 495
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.08 00:54. Заголовок: Петр пишет: Кстати,..
Петр пишет: цитата: | Кстати, здесь несколько возможных пользователей уже заявляли о своей готовности тестировать/использовать такой продукт. Я думаю, что было бы неплохо услышать их мнение, первые впечатления так сказать и, что особенно важно, что они ожидают увидеть в бл.будущем. |
| Какие нафиг впечатления ..... Вы сами по себе о чем-то обсуждаете, а простой пример как правильно работать с базой, даже и не подумали выложить. Не все такие продвинутые в разработке. Я например просто использую БД для своих задач. А как это работает подглядывая на исходный код реализованный вами .... догадываться сложно. Давайте коротко: 1) какой RDD доступен сейчас. (у меня не открывается база с мемо FPT) 2) пример доступности сервера и открытия, создания БД (простой и продвинутый) 3) пример индексов к этим базам 4) отдельные файлы для сборки сервера leto db со своими функциями 5) файловые операции на сервере Для начала пока хватит . Да еще: выход из сервера при незакрытой задачи не должен быть !!! Руки даже у админа бывают кривые (смотря какой попадется), а отвечать за утерянные данные придется программисту (даже в лог ничего не пишется ) !
|
|
|
alkresin
|
| moderator
|
Пост N: 106
Зарегистрирован: 06.07.06
|
|
Отправлено: 20.02.08 09:09. Заголовок: А можно привести при..
цитата: | А можно привести пример открытия БД с мемо полем FPT ? Может быть я синтакис неправильно делаю ? |
| Да обычный синтаксис, ничем не отличается от других: USE "//..../path/test.dbf"
|
|
|
alkresin
|
| moderator
|
Пост N: 107
Зарегистрирован: 06.07.06
|
|
Отправлено: 20.02.08 12:17. Заголовок: Вы сами по себе о че..
цитата: | Вы сами по себе о чем-то обсуждаете, а простой пример как правильно работать с базой, даже и не подумали выложить. |
| Вот такой пример устроит ? Function Main Local cTable, arr Local i, n1, n2, nSec, s REQUEST LETO RDDSETDEFAULT( "LETO" ) cTable := "//199.10.11.5:2812/test1.dbf" arr := { { "FirstName", "C", 20, 0 }, ; { "LastName", "C", 20, 0 }, ; { "Age", "N", 3, 0 }, ; { "Date", "D", 8, 0 }, ; { "Rate", "N", 6, 2 }, ; { "Student", "L", 1, 0 } } dbCreate( cTable, arr ) use (cTable) new ? "Test 1 " nSec := Seconds() for i := 1 to 200000 append blank n1 := hb_RandomInt( 80 ) n2 := hb_RandomInt( 50 ) replace Age with n1, ; Date with Date() - 365*n2 + n1, ; Rate with 56.5 - n1/2 replace FirstName with "A"+Chr(64+n2)+Padl(i,10,'0'), ; LastName with "B"+Chr(70+n2)+Padl(i,12,'0'), ; Student with ( (field->Age % 2) == 1 ) unlock next ?? "Finished in "+Ltrim(Str(Seconds()-nSec))+" seconds" ? "Test 2 " nSec := Seconds() index on Age tag Age ?? "Finished in "+Ltrim(Str(Seconds()-nSec))+" seconds" use use (cTable) new go top ? "Test 3 " nSec := Seconds() do while !Eof() s := FirstName skip enddo ?? "Finished in "+Ltrim(Str(Seconds()-nSec))+" seconds" use use (cTable) new set order to 1 go top ? "Test 4 " nSec := Seconds() do while !Eof() s := FirstName skip enddo ?? "Finished in "+Ltrim(Str(Seconds()-nSec))+" seconds" use ? Return Nil цитата: | 1) какой RDD доступен сейчас. (у меня не открывается база с мемо FPT) |
| RDD один - LETO, на сервере поднят DBFCDX. У меня файлы с мемо fpt открываются, поэтому я и просил вас прислать свой, может в нем что необычное - только не весь, конечно, оставьте в нем пару записей. цитата: | 2) пример доступности сервера и открытия, создания БД (простой и продвинутый) 3) пример индексов к этим базам |
| См. пример выше. цитата: | 4) отдельные файлы для сборки сервера leto db со своими функциями |
| Не понял, что имеете ввиду. цитата: | 5) файловые операции на сервере |
| Это к Pasha, я их сам еще не пробовал.
|
|
|
alkresin
|
| moderator
|
Пост N: 108
Зарегистрирован: 06.07.06
|
|
Отправлено: 20.02.08 12:20. Заголовок: abakkav пишет: Инте..
abakkav пишет: цитата: | Интересно, а как с этим борется Польский медиатор? Он вообще не индексирует на сервере или передает клиенту, если ключ нестандартный? |
| Понятия не имею, я его не пробовал. А что, он это умеет ? В принципе, здесь можно это, наверное, реализовать - через custom индекс, вычисляя ключи на стороне клиента.
|
|
|
abakkav
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 20.02.08 15:00. Заголовок: Не знаю как, но меди..
Не знаю как, но медиатор допускает собственные ф-ции в индексе и не требует пересобирать серверную часть. А реализовать "через custom индекс" или формируя запрос на клиента в случае нестандартного индекса было бы здорово.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 496
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.08 22:03. Заголовок: alkresin пишет: 4) ..
alkresin пишет: цитата: | 4) отдельные файлы для сборки сервера leto db со своими функциями Не понял, что имеете ввиду. |
| Про то, что задавал вопрос: abakkav пишет: цитата: | собственные ф-ции в индексе |
|
|
|
|
Pasha
|
| Администратор
|
Пост N: 815
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.08 10:54. Заголовок: Опять мистика какая-..
Опять мистика какая-то Собрал letodb под xHarbour При попытке открытия 22-й по порядку (в разных программах!) таблицы сервер вываливается по gpf на строке IF ( oTable := HSTable():Find( cName ) ) == Nil в hs_opentable, причем до вызова метода Find дело не доходит, управление в HSTable():Find не передается 2 недели назад этого не было
|
|
|
alkresin
|
| moderator
|
Пост N: 110
Зарегистрирован: 06.07.06
|
|
Отправлено: 24.02.08 21:46. Заголовок: Догадываюсь, в чем т..
Догадываюсь, в чем там дело. Попробуйте поменять в line 665: pUStru->uiAreasAlloc = 20; 20 на что-нибудь побольше - 40, например.
|
|
|
Pasha
|
| Администратор
|
Пост N: 821
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.08 22:36. Заголовок: сейчас попробую Про..
сейчас попробую Простой тест: Local cPath := '//127.0.0.1:2812/' use (cPath+'table1') new use (cPath+'table2') new ... use (cPath+'table25') new стабильно приводит к gpf на сервере на 25-м use при сборке под xHarbour При сборке под Harbour gpf нет Но при попытке открытия (use) несуществующей таблицы gpf на сервере происходит как для xHarbour, так и для Harbour По поводу udf-функций. Пересборка сервера с нужными функциями для некоторых может вызвать затруднения. Да и добавление новых функций приведет к необходимости пересобрать сервер, что нежелательно Может быть, сделать dll для udf-функций, которую бы сервер загружал, и предоставить программисту добавлять свои функции в эту dll и пересобирать ее ? Хотя, как-то надо указывать codepages, которые должен использовать сервер, то есть без пересборки не обойтись
|
|
|
Pasha
|
| Администратор
|
Пост N: 822
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.02.08 22:41. Заголовок: Да, теперь все работ..
Да, теперь все работает
|
|
|
Pasha
|
| Администратор
|
Пост N: 824
Зарегистрирован: 23.05.05
|
|
Отправлено: 25.02.08 22:51. Заголовок: Смотрю вопросы в Ope..
Смотрю вопросы в Open discussion Наверное, надо заменить: IF !oApp:lAnyExt .AND. !Empty( cBagName ) .AND. Len( cTemp := GetExten( cBagName ) < 3 ) .AND. !( cTemp $ "cdx;idx;ntx" ) на IF !oApp:lAnyExt .AND. !Empty( cBagName ) .AND. Len( cTemp := GetExten( cBagName ) ) < 3 .AND. !( cTemp $ "cdx;idx;ntx" ) ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 501
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.02.08 23:19. Заголовок: Когда можно будет пр..
Когда можно будет приступить к тестированию СЕРВЕРА БД под свои рабочие базы ? Я писал об БОЛЬШОЙ проблеме открытия баз с большим количеством полей !!! Если надо образцы баз на которых не работает сервер leto DB , могу выслать.
|
|
|
alkresin
|
| moderator
|
Пост N: 111
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.02.08 11:10. Заголовок: Pasha пишет: Наверн..
Pasha пишет: цитата: | Наверное, надо заменить: IF !oApp:lAnyExt .AND. !Empty( cBagName ) .AND. Len( cTemp := GetExten( cBagName ) < 3 ) .AND. !( cTemp $ "cdx;idx;ntx" ) |
| Точно. Сейчас заменю.
|
|
|
alkresin
|
| moderator
|
Пост N: 112
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.02.08 11:13. Заголовок: Andrey пишет: Я пис..
Andrey пишет: цитата: | Я писал об БОЛЬШОЙ проблеме открытия баз с большим количеством полей !!! |
| Я все исправил, теперь должно работать нормально. Думаю выложить build3 сегодня-завтра.
|
|
|
spair2k
|
| |
Пост N: 15
Зарегистрирован: 31.05.07
|
|
Отправлено: 26.02.08 13:28. Заголовок: создание индексов
в посте говорилось о том, что главная идея этого проекта в легкости переноса существующего кода на другую платформу "добавив 3 строчки кода". попробовал, начал с создания индексов, получилось, но заметил одну вещь - не создаются индексы в которых есть FOR, т.е. в самом индексе TAG прописан, но он пустой. это только у меня проблема?
|
|
|
Pasha
|
| Администратор
|
Пост N: 828
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.02.08 14:05. Заголовок: spair2k пишет: но з..
spair2k пишет: цитата: | но заметил одну вещь - не создаются индексы в которых есть FOR, т.е. в самом индексе TAG прописан, но он пустой. |
| Это на build2 или на свежих сырцах ? Пару недель назад я добавлял OrdCondSet(), должно работать Команду, которой создается индекс, в студию
|
|
|
alkresin
|
| moderator
|
Пост N: 113
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.02.08 17:09. Заголовок: Выложил build3..
Выложил build3
|
|
|
gfilatov
|
| модератор
|
Пост N: 724
Зарегистрирован: 25.05.05
|
|
Отправлено: 26.02.08 17:52. Заголовок: alkresin пишет: Выл..
|
|
|
Pasha
|
| Администратор
|
Пост N: 829
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.02.08 23:19. Заголовок: Александр, все-таки ..
Александр, все-таки более 20-ти таблиц не открываются, на сервере происходит gpf Надо увеличить в letofunc.c параметр pUStru->uiAreasAlloc ? И еще возник глючек. После dbAppend() Field->F1 := value ... dbCommit() dbUnlock() на последней команде клиент зависает, по-видимому безуспешно ждет ответ от сервера
|
|
|
alkresin
|
| moderator
|
Пост N: 114
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.02.08 08:49. Заголовок: Александр, все-таки ..
цитата: | Александр, все-таки более 20-ти таблиц не открываются, на сервере происходит gpf Надо увеличить в letofunc.c параметр pUStru->uiAreasAlloc ? |
| Это просто отодвинет барьер после которого происходит gpf. Надо разобраться, в чем дело.
|
|
|
Pasha
|
| Администратор
|
Пост N: 832
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.02.08 19:58. Заголовок: Смотрю, как бы получ..
Смотрю, как бы получше сделать relations Надо и на клиенте, и на сервере хранить установленные relations в каждой РО Затем, на сервере в leto_rec их отрабатывать, и передавать на клиент данные не только текущей РО, но и всех РО, указанных в relations На клиенте их принимать, и соответственно отрабатывать в leto_ParseRec Только при этом надо учесть отложенные commit в связанных РО: проверять не только pArea->uiUpdated, но и изменения в связанных РО Такая схема подойдет ?
|
|
|
alkresin
|
| moderator
|
Пост N: 115
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.02.08 22:38. Заголовок: Александр, все-таки ..
цитата: | Александр, все-таки более 20-ти таблиц не открываются, на сервере происходит gpf |
| Теперь окончательно исправил.
|
|
|
Pasha
|
| Администратор
|
Пост N: 833
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.02.08 23:10. Заголовок: Теперь БД открываетс..
Теперь БД открывается без проблем
|
|
|
alkresin
|
| moderator
|
Пост N: 116
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.02.08 10:36. Заголовок: Смотрю, как бы получ..
цитата: | Смотрю, как бы получше сделать relations Надо и на клиенте, и на сервере хранить установленные relations в каждой РО Затем, на сервере в leto_rec их отрабатывать, и передавать на клиент данные не только текущей РО, но и всех РО, указанных в relations... |
| Чем больше думаю об этом, тем труднее представляю, как это можно сделать корректным путем. RDD методы имеют дело с одной текущей workarea, которая передается им в качестве параметра, а при таком подходе каждый метод, связанный с перемещением по базе, будет получать и должен обрабатывать данные для разных workareas - сделать-то можно, но это нарушает всю логику работы RDD. Не думаю, что это хорошо.
|
|
|
alkresin
|
| moderator
|
Пост N: 117
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.02.08 13:43. Заголовок: Создал developers ma..
Создал developers mail list, подписка на https://lists.sourceforge.net/lists/listinfo/letodb-developers
|
|
|
Pasha
|
| Администратор
|
Пост N: 834
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.02.08 14:57. Заголовок: Буду делать аккуратн..
Буду делать аккуратно Постараюсь, чтобы методы workarea не выходили за пределы своих полномочий Все равно, эффективнее было бы получать посылку от сервера о состоянии всех связанных РО одним пакетом. Да по-другому, наверное, нельзя
|
|
|
alkresin
|
| moderator
|
Пост N: 118
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.02.08 15:36. Заголовок: Выложил build4, т.к...
Выложил build4, т.к. были важные исправления
|
|
|
gfilatov
|
| модератор
|
Пост N: 725
Зарегистрирован: 25.05.05
|
|
Отправлено: 28.02.08 16:57. Заголовок: alkresin пишет: Выл..
|
|
|
Pasha
|
| Администратор
|
Пост N: 835
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.02.08 21:13. Заголовок: После перемещения за..
После перемещения записи в основной РО можно сохранять новое состояние дочерних РО в области данных LETOAREA основной РО Затем, когда letoSyncChildren вызовет letoChildSync дочерних РО, этот метод должен будет отработать изменившеся состояние своей РО, взяв его из области данных master-РО Правда, будет проблема, если у дочерних РО тоже есть свои relations. Но обработку таких каскадных relations можно тоже возложить на сервер при первоначальной операции перемещения. Возникает вопрос: а как сбросить на сервер текущие записи дочерних РО перед перемещением записи в основной РО ? Делать это в letoChildSync уже поздно, поскольку сервер уже выполнил операцию перемещения записи
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 504
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.02.08 00:28. Заголовок: Тестирую сервер, сто..
Тестирую сервер, столкнулся с неудобствами, как писал ранее : 2) пример доступности сервера ??? Как проверить "запущен" ли leto db на сервере ??? alkresin пишет: цитата: | цитата: 5) файловые операции на сервере Это к Pasha, я их сам еще не пробовал. |
| Паша ! Дай пожалуйста эти функции !!! Самый НЕПРИЯТНЫЙ МОМЕНТ, если на сервере сняли letoDb, то "труба" - у пользователей база летит. Нужно наверно повесить сообщение типа ALERT("Есть открытые базы ! Не все клиентские места закрыты!") Это хоть как то защитит от "кривых рук" админов (не у всех есть нормальные) и воплей начальства, ему сложно доказать, что ты не верблюд и не по твоей вине это произошло !!! И еще до кучи: Как править letodb.ini ? Может у меня доступа нет к серверу, а его нужно исправить !!! И как потом перезапустить сервер letodb ? У меня есть на работе Дельфовая задача по Субсидиям. Там решается такая вещь просто. Если все пользователи вышли из клиентских мест, то СЕРВЕРНАЯ ЗАДАЧА завершается. Как кто-нибудь запускает клиенское место, так СЕРВЕРНАЯ ЗАДАЧА сама стартует и в трей !
|
|
|
Pasha
|
| Администратор
|
Пост N: 836
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.02.08 09:10. Заголовок: Andrey пишет: Паша ..
Andrey пишет: цитата: | Паша ! Дай пожалуйста эти функции !!! |
| Leto_File(<cFile>) Leto_FErase(<cFile>) Leto_FRename(<cFile>, <cNewName>) cFile имеет такую же структуру, какая используется для use: //ip_address:port/data_path/file_name Чтобы разрешить их использование, надо в letidb.ini на сервере указать EnableFileFunc = 1
|
|
|
alkresin
|
| moderator
|
Пост N: 119
Зарегистрирован: 06.07.06
|
|
Отправлено: 29.02.08 09:55. Заголовок: Возникает вопрос: а ..
цитата: | Возникает вопрос: а как сбросить на сервер текущие записи дочерних РО перед перемещением записи в основной РО ? Делать это в letoChildSync уже поздно, поскольку сервер уже выполнил операцию перемещения записи |
| Вопросов немало, потому что нарушается стандартная схема. Обычно перемещение в дочерних областях происходит не сразу при перемещении в родительской, а только при попытке чтения/записи в эту конкретную дочернюю область.
|
|
|
alkresin
|
| moderator
|
Пост N: 120
Зарегистрирован: 06.07.06
|
|
Отправлено: 29.02.08 10:13. Заголовок: 2) пример доступност..
цитата: | 2) пример доступности сервера ??? Как проверить "запущен" ли leto db на сервере ??? |
| С помощью manager'а. цитата: | Самый НЕПРИЯТНЫЙ МОМЕНТ, если на сервере сняли letoDb, то "труба" - у пользователей база летит. |
| База от этого не полетит, т.к. при завершении работы сервер все базы аккуратно закрывает. А вот предупреждение выдать стоит. Подумаем, как это лучше сделать. цитата: | И еще до кучи: Как править letodb.ini ? Может у меня доступа нет к серверу, а его нужно исправить !!! |
| Так в том-то и фишка, что без ведома администратора сервера его нельзя править ( если только он не поместит его в расшаренной папке - но я бы не советовал :) ). Иначе к чему все разговоры о безопасности ??? цитата: | И как потом перезапустить сервер letodb ? |
| letodb stop letodb Опять-таки, администратор или доверенный человек должен делать. цитата: | У меня есть на работе Дельфовая задача по Субсидиям. Там решается такая вещь просто. Если все пользователи вышли из клиентских мест, то СЕРВЕРНАЯ ЗАДАЧА завершается. Как кто-нибудь запускает клиенское место, так СЕРВЕРНАЯ ЗАДАЧА сама стартует и в трей ! |
| Так, наверное, там на сервере еще один процесс невидимый ( daemon, как наш сервер, запущен ), он это и делает, управляет "СЕРВЕРНОЙ ЗАДАЧЕЙ", которая общается с клиентами. В чем преимущество-то ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 838
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.02.08 11:30. Заголовок: По-видимому, на серв..
По-видимому, на сервере надо предусмотреть возможность работы с несколькими БД. Наверное, перечислять их в DataPath через точку с запятой Или делать по другому. Ввести алиасы БД и для них указывать каталоги Как лучше ?
|
|
|
alkresin
|
| moderator
|
Пост N: 121
Зарегистрирован: 06.07.06
|
|
Отправлено: 29.02.08 12:53. Заголовок: По-видимому, на серв..
цитата: | По-видимому, на сервере надо предусмотреть возможность работы с несколькими БД. |
| По-моему, понятие БД ( мы тут долго говорили об этом с Петром ) надо вводить, когда в этом действительно возникнет необходимость, тогда и будет ясно, для чего это нам нужно, какие свойства должна иметь БД и как это лучше описать в ini - файле. Сейчас мне представлянтся, что эту лучше будет сделать как, кажется, Петр предлагал - для каждой БД создать секцию в ini-файле и в этой секции - все ее свойства, там же не только путь будет.
|
|
|
spair2k
|
| |
Пост N: 16
Зарегистрирован: 31.05.07
|
|
Отправлено: 29.02.08 14:25. Заголовок: Pasha пишет: Это на..
Pasha пишет: цитата: | Это на build2 или на свежих сырцах ? Пару недель назад я добавлял OrdCondSet(), должно работать |
| Уже успел проверит на build4 - результат тот же цитата: | Команду, которой создается индекс, в студию |
| Задача: Есть табличка с ценами услуг,цены с историей, нужны свежие Код: цитата: | USE (server+'price') NEW INDEX ON date TAG tmp UNIQUE DESCENDING //сортируем в обратном порядке GO TOP // нахожу самую свежую дату изменения cDT := chr(39)+dtos(price->date)+chr(39) // создаю подстановку для FOR INDEX ON usluga TAG usluga FOR dtos(date)='20080201' //&cDT //(два варианта - работают одинаково) |
| создаются индексы, TAG с условием прописан, но в индексе все записи... кстати, сейчас проверил - tmp создан тоже без обратного порядка, без сортировки
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 506
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.02.08 15:37. Заголовок: alkresin пишет: ци..
alkresin пишет: цитата: | цитата: 2) пример доступности сервера ??? Как проверить "запущен" ли leto db на сервере ??? С помощью manager'а. |
| И что, каждого юзера научить пользоваться этим manager'ом ? Нужно до открытия БД в программе сделать проверку. Здесь был кусок кода, но он у меня не работает ! Петр пишет: цитата: | CREATE CONNECTION cn USER "user" PASSWORD "password" IF cn:ErrorCode() != 0 ? "Извините, сервер недоступен" Return 1 ENDIF |
| Или типа такого: hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() = 0 ? "Извините, сервер недоступен" ENDIF hSocket := NIL
|
|
|
Pasha
|
| Администратор
|
Пост N: 839
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.02.08 15:39. Заголовок: По поводу FOR - в мо..
По поводу FOR - в моих программах индекс создается с этим условием. Проверял как только сделал Возможно, причина в том, что у тебя создаются 2 разных индексных файла для одной таблицы. Вообще-то при использовании dbfcdx принято использовать один индексный файл, я даже не знаю, как rdd на такое отреагирует. Изначально код был для dbfntx ? Descending. Во всяком случае команда создания индекса на сервер послупает с опцией Descending Попробуй указать отдельно OrdDescend(,, .t.) // включить обратную сортировку OrdDescend(,, .f.) // выключить
|
|
|
Pasha
|
| Администратор
|
Пост N: 840
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.02.08 15:41. Заголовок: Andrey пишет: Здесь..
Andrey пишет: цитата: | Здесь был кусок кода, но он у меня не работает ! |
| Это не рабочий код, а только предложение Петра по организации БД
|
|
|
alkresin
|
| moderator
|
Пост N: 122
Зарегистрирован: 06.07.06
|
|
Отправлено: 29.02.08 21:55. Заголовок: Или типа такого: hSo..
цитата: | Или типа такого: hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() = 0 ? "Извините, сервер недоступен" ENDIF |
| А... Ну это дело пары минут. Сделаем. Просто, на мой взгляд, пока нет системы идентификации ( логин/пароль ), это - излишество. Сервер ДОЛЖЕН работать всегда. Если не работает, клиентская программа просто вылетает с ошибкой открытия файла и пользователь идет высказывать законное возмущение соответствующим службам.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 507
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.08 02:07. Заголовок: alkresin пишет: это..
alkresin пишет: цитата: | это - излишество. Сервер ДОЛЖЕН работать всегда. Если не работает, клиентская программа просто вылетает с ошибкой открытия файла и пользователь идет высказывать законное возмущение соответствующим службам. |
| А если программы крутяться в других городах (у меня так) и там программист приходящее лицо по вызову, СЕРВЕР не выделенный, а обычный комп для работы... Ну и что они делать будут ??? Да они по телефону задолбают меня ! И сколько будет высказано "всего хорошего" в адрес программиста, написавшего программу.... Знаете, не хочется терять клиентов из-за мелочей !!! Нужна проверка и внятное сообщение для пользователя, чтоб не дергали меня по пустякам из-за своего раздол....................
|
|
|
Pasha
|
| Администратор
|
Пост N: 842
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.03.08 11:36. Заголовок: Начал делать VarFiel..
Начал делать VarField aka "V", HB_FT_ANY, и столкнулся с необходимостью в ParseRec уже формировать готовый ITEM, поскольку нет необходимости повторять на клиенте разбор этого поля Может быть, где-то записывать этот Item и затем в GetValue его брать ? Клиенту лучше абстрагироваться от низкоуровневого формата данных сервера Написал такой код в leto_rec, и вижу, что корректно обработать такие данные в ParseRec не получается, поскольку полученные данные могут вылезти за пределы отведенной области pRecord для такого поля case HB_FT_ANY: SELF_GETVALUE( (AREAP)pArea, ui+1, pItem ); if( pField->uiLen == 3 || HB_IS_DATE( pItem ) ) { *pData++ = 'D'; hb_itemGetDS( pItem, (char *) pData); pData += 8; } else if( pField->uiLen == 4 || HB_IS_NUMERIC( pItem ) ) { char * szString = hb_itemStr( pItem, NULL, NULL ); char * szTemp; *pData++ = 'N'; if( szString ) { szTemp = szString; while( HB_ISSPACE( *szTemp ) ) szTemp ++; uiLen = strlen( szTemp ); memcpy( pData, szTemp, uiLen ); pData += uiLen; hb_xfree( szString ); } *pData++ = '\0'; } else if( HB_IS_STRING( pItem ) ) { uiLen = hb_itemGetCLen( pItem ); if( uiLen <= pField->uiLen ) { char * szString = hb_itemGetC( pItem ); *pData++ = 'C'; *pData++ = (BYTE) uiLen & 0xFF; *pData++ = (BYTE) (uiLen >> 8) & 0xFF; memcpy( pData, szString, uiLen ); } else { *pData++ = '!'; } } else { *pData++ = 'U'; } break; Еще предложение: передавать HB_FT_DATE в 3-х или 4-х байтовом формате, а HB_IT_DATETIME (дата и время) в 8-ми байтовом Есть еще двоичные Numeric-поля размером 2 и 4 байта
|
|
|
alkresin
|
| moderator
|
Пост N: 123
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.03.08 14:01. Заголовок: spair2k пишет: созд..
spair2k пишет: цитата: | создаются индексы, TAG с условием прописан, но в индексе все записи... кстати, сейчас проверил - tmp создан тоже без обратного порядка, без сортировки |
| Да, были там ошибки, только что исправил - и с for и с descending.
|
|
|
alkresin
|
| moderator
|
Пост N: 124
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.03.08 14:30. Заголовок: Начал делать VarFiel..
цитата: | Начал делать VarField aka "V", HB_FT_ANY |
| А что такое HB_FT_ANY ? Это есть в DBFCDX ? цитата: | Еще предложение: передавать HB_FT_DATE в 3-х или 4-х байтовом формате |
| Я сначала так и сделал, а потом из-за того, что функции, которые я использовал при этом, оказались не во всех версиях Harbour/xHarbour, стал передавать Date без перекодировки. Не было времени копаться в посках совместимого решения, тем более, что еще неизвестно, восполнит ли экономия на 4-х байтах потери времени на кодировку/раскодировку ... цитата: | HB_IT_DATETIME (дата и время) в 8-ми байтовом Есть еще двоичные Numeric-поля размером 2 и 4 байта |
| И это все в DBFCDX есть ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 843
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.03.08 12:55. Заголовок: alkresin пишет: А ч..
alkresin пишет: цитата: | А что такое HB_FT_ANY ? Это есть в DBFCDX ? |
| Это поля из SIX. Если размер поля 3 байта, тогда значение - дата в Julian формате, если 4 - значение LONG, если больше - любой тип данных Если длина строки превышает длину поля, то хвост строки записывается как memo-поле цитата: | тем более, что еще неизвестно, восполнит ли экономия на 4-х байтах потери времени на кодировку/раскодировку ... |
| Думаю, что нет. Эта перекодировка все равно выполняется Я уже сделал поддержку полей D, 3 и D, 4 (дата в Julian-формате), сейчас проверяю В dbfcdx есть числовые поля с сигнатурой '2' и '4' - соответственно 2-х и 4-х байтовое целое Типов полей там сейчас довольно много
|
|
|
Pasha
|
| Администратор
|
Пост N: 844
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.03.08 12:56. Заголовок: Кстати, в server.prg..
Кстати, в server.prg пропало изменение Miguel: cIndex += OrdBagName(i) + ";" + OrdName(i) + ";" + cName + ";" + OrdFor(i) + ";" + dbOrderInfo(DBOI_KEYTYPE,, i) + ";" + LTrim(Str(dbOrderInfo(DBOI_KEYSIZE,, i))) + ";" Это случайно ? Надо восстановить ?
|
|
|
alkresin
|
| moderator
|
Пост N: 125
Зарегистрирован: 06.07.06
|
|
Отправлено: 03.03.08 11:16. Заголовок: Кстати, в server.prg..
цитата: | Кстати, в server.prg пропало изменение Miguel: Это случайно ? |
| Да, случайно.
|
|
|
Pasha
|
| Администратор
|
Пост N: 845
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.03.08 17:52. Заголовок: По поводу memo-полей..
По поводу memo-полей возникла такая мысль Значание memo-поля передается на сервер во время PutValue, а остальных полей - во время выполнения Commit, что не очень хорошо Может быть передавать значения memo-полей отдельными пакетами вместе с командой update ? А по putvaluе сохранять где-нибудь это значение на клиенте, без передачи на сервер ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 510
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.03.08 22:05. Заголовок: Портирую свою легкую..
Портирую свою легкую задачу на LetoDB и столкнулся с такой проблемой: Шаблоны печати храню на сервере в папке FORM, это могут быть просто мои текстовые файлы *.ini *.frm, вордовские файлы *.doc и *.xls и отчеты FastReporta. Вопрос такой - нужна функция копирования выбранного файла с сервера на клиентское место (и обратно, если юзер поменял или изменил шаблон !!!). Хотелось бы иметь средства запрета изменения шаблонов, если пользователю нет доступа к такой операции.
|
|
|
alkresin
|
| moderator
|
Пост N: 126
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.03.08 22:48. Заголовок: Может быть передават..
цитата: | Может быть передавать значения memo-полей отдельными пакетами вместе с командой update ? А по putvaluе сохранять где-нибудь это значение на клиенте, без передачи на сервер ? |
| Пожалуй, да. Можно добавить в LETOAREA массив BYTE * для хранения memo-полей. Количество элементов массива - по количеству полей, признак update - ненулевое значение элемента.
|
|
|
alkresin
|
| moderator
|
Пост N: 127
Зарегистрирован: 06.07.06
|
|
Отправлено: 04.03.08 22:57. Заголовок: Шаблоны печати храню..
цитата: | Шаблоны печати храню на сервере в папке FORM, это могут быть просто мои текстовые файлы *.ini *.frm, вордовские файлы *.doc и *.xls и отчеты FastReporta. |
| Вообще говоря, манипуляция текстовыми, а тем более must_die файлами :) не входит в компетенцию dbfcdx сервера. Файлы эти можно, как и сейчас, хранить в расшаренной папке и копировать их средствами ОС. "Средства запрета изменения шаблонов" - просто установка прав на эти файлы. Кстати, добавил функцию leto_Connect( cPath ), возвращает -1 в случае неудачи.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 511
Зарегистрирован: 12.09.06
|
|
Отправлено: 04.03.08 23:48. Заголовок: alkresin пишет: Фай..
alkresin пишет: цитата: | Файлы эти можно, как и сейчас, хранить в расшаренной папке и копировать их средствами ОС. |
| Неэффективно тогда получается. Разговор шел о сервере который возьмет на себя защиту данных и чтоб для разработчика это было удобно. Попробуйте распространять сетевую программу по многим городам и чтоб была простая установка и обновление. Очень несовместимые вещи. Посмотрите на БЭСТ4+, БЭСТ5 - там тоже до ума не доведено. А 1С обновлять - целая религия, в БЭСТ5 даже лучше. Так как распространяю свою сетевую программу по многим городам, набрался опыта и столкнулся с трудностями: по установке сети, а затем обновления этих программ. Админы в городах как хотят так и ставят мою программу. Заставит их "расшарить" папки - это просто ..... уму не постижимо, нет слов. Юзера продвинутые (руки им поотрывать) додумываются ставить с дистрибутивов предназначенных для других городов. Базы за 2-3 года стирают за момент и еще удивленно говорят: я же думала там программа новее и решила обновить. И руководителю фиг объяснишь что таких людей нельзя допускать к компьютеру, он к тебе с претензией - а что разве нельзя было предусмотреть защиту. ЗНАЧИТ ЗАЩИТУ от ДУРАКА (админа, пользователя) нужно ставить СРАЗУ !!! И даже бэкап не поможет. Ваш сервер очень прост в сетевой настройке !!! Это большой плюс ! Если бы еще он поддерживал эти 2 функции, то для программиста было бы проще работать с формами. Это же просто считать файл на сервере в память и передать клиенту. Туда и обрато ..... Не будем же эти формы запихивать в МЕМО-поля ? alkresin пишет: цитата: | Кстати, добавил функцию leto_Connect( cPath ), возвращает -1 в случае неудачи. |
| Спасибо !
|
|
|
VivaVO
|
| |
Пост N: 31
Зарегистрирован: 03.04.07
|
|
Отправлено: 05.03.08 00:42. Заголовок: Andrey пишет: Неэфф..
Andrey пишет: цитата: | Неэффективно тогда получается. Разговор шел о сервере который возьмет на себя защиту данных и чтоб для разработчика это было удобно. Попробуйте распространять сетевую программу по многим городам и чтоб была простая установка и обновление. Очень несовместимые вещи. Посмотрите на БЭСТ4+, БЭСТ5 - там тоже до ума не доведено. А 1С обновлять - целая религия, в БЭСТ5 даже лучше. Так как распространяю свою сетевую программу по многим городам, набрался опыта и столкнулся с трудностями: по установке сети, а затем обновления этих программ. Админы в городах как хотят так и ставят мою программу. Заставит их "расшарить" папки - это просто ..... уму не постижимо, нет слов. Юзера продвинутые (руки им поотрывать) додумываются ставить с дистрибутивов предназначенных для других городов. Базы за 2-3 года стирают за момент и еще удивленно говорят: я же думала там программа новее и решила обновить. И руководителю фиг объяснишь что таких людей нельзя допускать к компьютеру, он к тебе с претензией - а что разве нельзя было предусмотреть защиту. |
| Что-то типа «Золотая рыбка». А конец знаешь?
|
|
|
alkresin
|
| moderator
|
Пост N: 128
Зарегистрирован: 06.07.06
|
|
Отправлено: 05.03.08 09:50. Заголовок: Это же просто считат..
цитата: | Это же просто считать файл на сервере в память и передать клиенту. Туда и обрато ..... Не будем же эти формы запихивать в МЕМО-поля ? |
| А почему бы и нет ? С точки зрения безопасности и независимости от окружения очень даже неплохо. Но две такие файловые функции, чтоб считывала файл целиком и целиком записывала я планирую добавить.
|
|
|
Pasha
|
| Администратор
|
Пост N: 846
Зарегистрирован: 23.05.05
|
|
Отправлено: 06.03.08 21:53. Заголовок: Взял на заметку, пос..
Взял на заметку, поскольку сейчас занимаюсь relations. Лучше всего пусть это будет массив PHB_ITEM, поскольку там могут быть не только null-terminated strings, да и этим я решу оставшуюся проблемку с VarField. Еще одно рацпредложение. А что, если pArea->pTagCurrent->TagName передавать не с каждой командой навигации по таблице, а по OrdSetFocus, хранить cOrder на сервере в oArea и использовать при необходимости ?
|
|
|
alkresin
|
| moderator
|
Пост N: 129
Зарегистрирован: 06.07.06
|
|
Отправлено: 07.03.08 13:16. Заголовок: А что, если pArea-..
цитата: | А что, если pArea->pTagCurrent->TagName передавать не с каждой командой навигации по таблице, а по OrdSetFocus, хранить cOrder на сервере в oArea и использовать при необходимости ? |
| Черт его знает ... Не уверен, что это даст выигрыш в производительности. С одной стороны, уменьшение длины пакета на несколько байт, с другой - лишний пакет время от времени. Надо тестировать.
|
|
|
alkresin
|
| moderator
|
Пост N: 131
Зарегистрирован: 06.07.06
|
|
Отправлено: 13.03.08 11:21. Заголовок: Добавил поддержку MT..
Добавил поддержку MT. Теперь на сервере крутятся 2 потока. Один принимает соединения, опрашивает сокеты и читает с них данные, а также отвечает на те запросы, которые не требуют обращения к RDD, он работает только на С уровне, не трогает Харборовский стек и VM. Второй обрабатывает запросы, требующие обращения к RDD, т.е. основную массу запросов. Это позволяет серверу, вне зависимости от загруженности работой с dbf, своевременно подключать и отключать пользователей, отвечать на management запросы ( надо будет этому первому потоку еще и файловые функции отдать ).
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 516
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.03.08 16:50. Заголовок: Классно !!! А когда..
Классно !!! А когда можно будет попробывать ?
|
|
|
alkresin
|
| moderator
|
Пост N: 132
Зарегистрирован: 06.07.06
|
|
Отправлено: 16.03.08 10:07. Заголовок: А когда можно будет ..
цитата: | А когда можно будет попробывать ? |
| Пора CVS осваивать :). Это очень просто - скачать клиент, настроить - и у вас всегда, когда надо, свежайшие исходники.
|
|
|
alkresin
|
| moderator
|
Пост N: 133
Зарегистрирован: 06.07.06
|
|
Отправлено: 17.03.08 13:01. Заголовок: Вот такой батник для..
Вот такой батник для консольного 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 -P letodb
|
|
|
alkresin
|
| moderator
|
Пост N: 134
Зарегистрирован: 06.07.06
|
|
Отправлено: 17.03.08 13:05. Заголовок: Паша, я сделал relat..
Паша, я сделал relations - в самом простом варианте: движение по дочерней базе инициируется при чтении поля из нее, если было движение в родительской - чтобы работало. Будут желание и возможности оптимизировать это дело - делайте.
|
|
|
Pasha
|
| Администратор
|
Пост N: 853
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.03.08 17:11. Заголовок: Замечательно А я еще..
Замечательно А я еще неделю назад код написал, да все отладить не мог :(
|
|
|
alkresin
|
| moderator
|
Пост N: 135
Зарегистрирован: 06.07.06
|
|
Отправлено: 20.03.08 13:16. Заголовок: Паша, я тут подумал ..
Паша, я тут подумал - стоит, наверное, передавать на сервер не имя тэга, а порядковый номер, ведь в структурах на клиенте и в LETOTAG на сервере порядок следования тот же. Дело в том, что делать так, как в leto_Scope() - определять номер тэга и по нему брать элемент в LETOTAG - неправильно. В общем случае ( особенно это будет часто для ntx ) количество и порядок следования тэгов для общей таблицы ( определяемые по orderinfo ) и для конкретной workarea могут отличаться. Я, наверное, это сделаю ближе к вечеру, если нет возражений.
|
|
|
Pasha
|
| Администратор
|
Пост N: 855
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.03.08 14:08. Заголовок: Лучше конечно делать..
Лучше конечно делать все для общего случая, расчитывая сразу и на ntx Может в LETOTAG добавить имя тэга и по нему выполнять поиск ?
|
|
|
alkresin
|
| moderator
|
Пост N: 136
Зарегистрирован: 06.07.06
|
|
Отправлено: 20.03.08 14:44. Заголовок: Сначала я так и хоте..
Сначала я так и хотел сделать, но потом подумал: сколько дублирования будет - по числу пользователей одного индекса, ну и затраты на сравнение строк/поиск. А тут сразу номер готовый придет.
|
|
|
Pasha
|
| Администратор
|
Пост N: 856
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.03.08 14:58. Заголовок: Хорошо, пусть будет ..
Хорошо, пусть будет номер
|
|
|
alkresin
|
| moderator
|
Пост N: 137
Зарегистрирован: 06.07.06
|
|
Отправлено: 21.03.08 09:54. Заголовок: Не все так просто :)..
Не все так просто :) ... Сервер-то получит от клиента номер ордера в текущей workarea, который может не совпадать с реальным, так что все-равно нужно или имена тэгов в LETOTAG хранить, или что-то другое
|
|
|
Pasha
|
| Администратор
|
Пост N: 857
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 12:14. Заголовок: Лучше действительно ..
Лучше действительно имена тегов хранить в LETOTAG А для исключения излишней передачи сохранять текущий индекс в AREASTRU, и не передавать его в других командах. а только в dbSetOrder() Пересматриваю код Во 1-х, я немного ошибся в hs_goto: Надо написать для go top hs_setscope( nUserStru, nId, .t.) dbGoTop() IF oArea:bFilter != Nil hs_setscope( nUserStru, nId, .f.) DO WHILE !Eof() .AND. !Eval(oArea:bFilter) dbSkip(1) ENDDO hs_clearscope(nUserStru, nId, .f.) ENDIF hs_clearscope(nUserStru, nId, .t.) и для bottom тоже, поправлю И у меня сомнения по поводу кода в hs_skip: dbSkip( nSkip ) IF oArea:bFilter != Nil IF nSkip > 0 DO WHILE !Eof() .AND. !Eval(oArea:bFilter) dbSkip(1) ENDDO ELSE DO WHILE !Bof() .AND. !Eval(oArea:bFilter) dbSkip(-1) ENDDO ENDIF ENDIF Если nSkip > 1 и установлен bFilter, то этот код отработает неправильно
|
|
|
Pasha
|
| Администратор
|
Пост N: 858
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 12:20. Заголовок: Уже почти весь код п..
Уже почти весь код перенесен на С, осталось совсем немного Открытие/создание, и навигация Я перепишу hs_goto, ok ? Там можно немного оптимизировать go top/ go bottom с установленным filter, используя dbOrderInfo(SKIPEVAL,,, bFilter)/dbOrderInfo(SKIPEVALBACK,,, bFilter) Когда я у себя в программах стал использовать эту функцию, выигрыш в производительности был существенным, в разы в некоторых случаях
|
|
|
Pasha
|
| Администратор
|
Пост N: 859
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 12:24. Заголовок: Кстати, SKIPEVAL мож..
Кстати, SKIPEVAL можно использовать и в hs_skip if bFilter # nil for i := 1 to nSkip dbOrderInfo(SKIPEVAL,,, bFilter) next endif
|
|
|
alkresin
|
| moderator
|
Пост N: 138
Зарегистрирован: 06.07.06
|
|
Отправлено: 21.03.08 14:15. Заголовок: Уже почти весь код п..
цитата: | Уже почти весь код перенесен на С, осталось совсем немного Открытие/создание, и навигация |
| Некоторые вещи, в т.ч. открытие/создание, скорее всего, придется оставить на prg - т.к. на C уровне обработки ошибок ( аналога BEGIN SEQUENCE ... END SEQUENCE ) нет. Ok.
|
|
|
Pasha
|
| Администратор
|
Пост N: 860
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 15:14. Заголовок: alkresin пишет: на ..
alkresin пишет: цитата: | на C уровне обработки ошибок ( аналога BEGIN SEQUENCE ... END SEQUENCE ) нет |
| Не получится обрушение сервера при разных нестандартных ситуациях типа "data corruption" ? В этом случае надо как-то перехватывать такие ошибки
|
|
|
alkresin
|
| moderator
|
Пост N: 139
Зарегистрирован: 06.07.06
|
|
Отправлено: 21.03.08 15:24. Заголовок: Такие нестандартные ..
Такие нестандартные ситуации случаются при реальном повреждении файлов, которые, по идее, использование сервера как раз и должно исключить. А то ведь есть и такие ошибки, которые не обрабатываются и на prg уровне - всякие internal error - особенно с индексами.
|
|
|
Pasha
|
| Администратор
|
Пост N: 861
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 16:01. Заголовок: Может стоит сделать ..
Может стоит сделать вызов ParseCommand() на prg-уровне внутри BEGIN SEQUENCE/END ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 862
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 16:11. Заголовок: Надо обязательно пер..
Надо обязательно перехватывать data width error в leto_UpdateRec
|
|
|
Pasha
|
| Администратор
|
Пост N: 863
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 17:01. Заголовок: Извиняюсь, так и дел..
Извиняюсь, так и делается. То есть, такая ситуация блокируется уже на клиенте
|
|
|
Pasha
|
| Администратор
|
Пост N: 864
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 23:21. Заголовок: Переписал на C hs_go..
Переписал на C hs_goto DBOI_SKIPEVAL не стал использовать: во 1-х, он реализован не на уровне dbfRdd, а выше - для dbfcdx/dbfntx Во 2-х: выигрыш в производительности в своих программах я получил фактически за счет перевода кода в цикле по workarea на С-уровень, что и так уже сделано В hs_skip все в порядке, это меня бес попутал :) Как поступим с TagName ? Сейчас имя тега передается при каждой операции навигации по таблице Может действительно передавать его на сервер только в letoOrderListFocus ? И на сервере проблема с поиском тега будет решена
|
|
|
alkresin
|
| moderator
|
Пост N: 140
Зарегистрирован: 06.07.06
|
|
Отправлено: 22.03.08 10:09. Заголовок: Как поступим с TagNa..
цитата: | Как поступим с TagName ? Сейчас имя тега передается при каждой операции навигации по таблице Может действительно передавать его на сервер только в letoOrderListFocus ? |
| Вопрос неоднозначный. Сам акт приема-передачи ip-пакета отнимает сравнительно немалое время, поэтому, скажем, один пакет длиной 100 байт передается существенно быстрее, чем 2 по 50. Обычно ordSetFocus() вызывается не так часто, но это происходит, например, почти при каждом открытии файла - так что если передавать пакет при ordSetFocus(), то файлы будут открываться медленнее. цитата: | И на сервере проблема с поиском тега будет решена |
| Она будет просто перенесена из одной функции в другую. При обработке ordSetFocus() все равно придется это делать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 865
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 11:00. Заголовок: alkresin пишет: Воп..
alkresin пишет: цитата: | Вопрос неоднозначный. Сам акт приема-передачи ip-пакета отнимает сравнительно немалое время, поэтому, скажем, один пакет длиной 100 байт передается существенно быстрее, чем 2 по 50. |
| Кстати, о птичках :) Я заметил, что закрытие БД выполняется довольно медленно, поскольку при dbCloseAll() передается отдельный пакет close для каждой workarea. Можно ли сделать закрытие всех областей letodb одним пакетом ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 866
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 11:13. Заголовок: Тогда добавляем имя ..
Тогда добавляем имя тега в LETOTAG ? Поскольку в пакетах goto/skip/seek имя текушего тега уже передается, для поиска данных тега на сервере этой информации будет достаточно
|
|
|
alkresin
|
| moderator
|
Пост N: 141
Зарегистрирован: 06.07.06
|
|
Отправлено: 22.03.08 17:47. Заголовок: Можно ли сделать зак..
цитата: | Можно ли сделать закрытие всех областей letodb одним пакетом ? |
| Если написать leto_dbCloseAll() и предложить использовать ее вместо dbcloseall() цитата: | Тогда добавляем имя тега в LETOTAG ? |
| Да
|
|
|
Pasha
|
| Администратор
|
Пост N: 867
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 21:59. Заголовок: Переписал на C hs_sk..
Переписал на C hs_skip, переделал поиск тега на сервере по имени По поводу dbCloseAll: Сделать в leto_dbCloseAll() закрытие только "своих" областей, а затем вызовом dbCloseAll() закрывать остальные ? Правда, может быть случай, когда клиент подключен боее чем к одному серверу
|
|
|
alkresin
|
| moderator
|
Пост N: 142
Зарегистрирован: 06.07.06
|
|
Отправлено: 22.03.08 22:45. Заголовок: Переписал на C hs_sk..
цитата: | Переписал на C hs_skip, переделал поиск тега на сервере по имени |
| Отлично! А почему в mail list не шлете changelog ? цитата: | Сделать в leto_dbCloseAll() закрытие только "своих" областей, а затем вызовом dbCloseAll() закрывать остальные ? |
| Не понял. Каких "своих" ? А какие еще закрывает клиентская программа при помощи dbCloseAll() ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 868
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 23:33. Заголовок: Я все свои изменения..
Я все свои изменения отправляю в mail list. Возврата нет. Они не проходят ? Проверил - у меня в адресной книге стотит letodb-developers-bounces@lists.sourceforge.net Наверное надо Letodb-developers@lists.sourceforge.net Эх, Семен Семеныч Отправил тест. Насчет своих, я имел в виду, что могут быть открыты workarea и с другими rdd
|
|
|
Pasha
|
| Администратор
|
Пост N: 869
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 23:34. Заголовок: Теперь получил свое ..
Теперь получил свое же письмо
|
|
|
Pasha
|
| Администратор
|
Пост N: 870
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.03.08 00:30. Заголовок: Что-то я смотрю, уст..
Что-то я смотрю, установка set deleted не срабатывает Ставлю set deleted on, и удаленные записи видны. Не пойму, в чем дело
|
|
|
Pasha
|
| Администратор
|
Пост N: 871
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.03.08 10:12. Заголовок: Увидел Может добавит..
Увидел Может добавить еще один байт установок к командам seek/skip/goto для флага deleted и убрать bDeletedOn из USERSTRU ?
|
|
|
alkresin
|
| moderator
|
Пост N: 143
Зарегистрирован: 06.07.06
|
|
Отправлено: 23.03.08 11:15. Заголовок: Ставлю set deleted o..
цитата: | Ставлю set deleted on, и удаленные записи видны. Не пойму, в чем дело |
| Если устанавливаете после присоединения, то надо leto_Setdeleted() использовать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 872
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.03.08 13:02. Заголовок: А Ads как делает ? Т..
А Ads как делает ? Там дополнительной команды нет, используется текущая установка клиента Может все-таки добавим 1 байт к пакету передачи ? Из тех же соображений, что незначительное увеличение размера пакета лучше, чем дополнительный пакет. Да и совместимость с существующим кодом сохранится У меня к примеру сплошь и рядом встречаются такие конструкции: Function SeekPers(nTab) Local lSD := Set(_SET_DELETED, .f.), lR, no := persons->(IndexOrd()) persons->(dbSetOrder(2)) lR := persons->(dbSeek(nTab)) persons->(dbSetOrder(no)) Set(_SET_DELETED, lSD) Return lR Это приведет к 2-м дополнительным пакетам для 1-й операции поиска
|
|
|
alkresin
|
| moderator
|
Пост N: 144
Зарегистрирован: 06.07.06
|
|
Отправлено: 23.03.08 14:48. Заголовок: А Ads как делает ? ..
В ADS RDD специальная технология используется, добавленная David G.Holm именно для таких целей в set-модуль. В нашем случае, согласен, стоит передать лишний байт, в нем можно, используя битовые функции, передавать и set exact ( сейчас оно вообще не передается ), а для seek поместить и bsoftseek,bfindlast ( сейчас это 2 отдельных байта ).
|
|
|
Pasha
|
| Администратор
|
Пост N: 873
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.03.08 14:17. Заголовок: alkresin пишет: пер..
alkresin пишет: set exact нужен для вычисления выражений, а они вычисляются не только для фильтра (3 операции навиации), но и при создании индекса. Значит, надо передавать и для createindex Смотрим, какие еще установки могут понадобиться на сервере. _SET_PATH, _SET_DEFAULT - наверное, не нужны HB_SET_DECIMALS - тоже на сервере нафик не нужен SET_DATEFORMAT SET_EPOCH нужен для вычисления DTOC. Поскольку в битовой струкруре эти установки не помещаются, да и это глобальные установки, которые вряд-ли динамически будут изменяться, можно передать их на сервер отдельной командой Поскольку в основном то, что было запланировано в начале февраля, уже сделано, предлагаю обсудить дальнейшие направления работ Мне кажется, можно сделать вот что (перечисляю и малозначительные, и важные пункты) - загрузка сервером некой dll, в которую пользователь мог бы добавлять свои udf для индексных выражений. Для пользователя будет проще пересобрать специально предназначенную для таких целей dll, чем пересобрать сервер - укаазание в скрипте сборки сервера кодовых страниц, для которых надо выдать Request - поддержка дополнительных числовых полей: '2', '4', а также полей VFP - надо переделать PutValue для мемо-полей - оптимизация relations: передача состояния дочерних областей прямо в leto_rec, запись их на клиенте в некую область данных, и затем использование в SELF_RELEVAL вместо передачи на сервер запроса на seek/goto - сделать leto_CloseAll() - как делать транзакции ? Для каждого юзера заводить временный dbf/fpt файл для журнала транзакций, и в каждую таблицу добавлять служебное поле, поскольку флаг deleted использовать не удастся Какой уровень транзакций ? Только read commited ? - вычисляемые поля. Здесь возникает вопрос, как вычислять на сервере выражения, которые содержат имена алиасов клиента Ведь на сервере имена алиасов свои. Можно это разрешать имена алиасов поиском "->" и заменой - может быть стоит сделать возможность открытия таблицы с ограниченным количеством полей Для каких-то выборок понадобятся не все поля, которые присутствуют в таблице, а какой-то их набор. Это был бы такой суррогат sql-запросов
|
|
|
alkresin
|
| moderator
|
Пост N: 145
Зарегистрирован: 06.07.06
|
|
Отправлено: 24.03.08 15:59. Заголовок: Из базовой функциона..
Из базовой функциональности осталась ( если я не упустил еще что-то ) реализация orderListClear. Несмотря на кажущуюся простоту, там есть неприятные моменты. После этого можно делать поддержку ntx. Думаю, для этого надо прописывать в серверном ini [DATABASE] ( вот к ним и подобрались :) ) и там помечать ее как ntx. Из перечисленных вами пунктов интересными и приоритетными лично для меня являются транзакции и, в какой-то степени, вычисляемые поля. leto_closeAll() сделать просто: { sendrecv( "close;all';" ); // что-то вроде bNotSendClose = TRUE; // Глобальная переменная в leto1.c, чтоб метод close не слал запрос на сервер hb_rddCloseAll(); bNotSendClose = FALSE; } Кодовые страницы, наверное, надо указать в .h все - пусть если кто хочет уменьшить вес сервера, убирает ненужные ( а они не много-то и весят ). А важными для меня целями, кроме транзакций, являются дополнительные процессы, чтоб передавать им на исполнение некоторые задачи ( индексирование, ... ) и server side процедуры.
|
|
|
alkresin
|
| moderator
|
Пост N: 146
Зарегистрирован: 06.07.06
|
|
Отправлено: 24.03.08 18:35. Заголовок: Реализация транзакци..
Реализация транзакций мне видится следующим образом: leto_BeginTransaction() просто устанавливает в TRUE какой-нибудь bTransActive. leto_PutRec(), если bTransActive == TRUE, не посылает изменения на сервер, а добавляет в специальный буфер. leto_CommitTransaction() отправляет содержимое буфера на сервер и устанавливает bTransActive в FALSE. Сервер обрабатывает буфер, пишет изменения в таблицы, попутно сохраняя где-то содержимое измененных полей, чтобы в случае чего откатить изменения.
|
|
|
Pasha
|
| Администратор
|
Пост N: 874
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.03.08 20:22. Заголовок: Т.е. read commited Т..
Т.е. read commited Такая реализация транзакций будет работать очень быстро, надежно, но есть и недостатки 1. Внутри транзакции на клиенте операция seek не сможет учитывать измененные записи, которые еще не переданы на сервер Ограничение не такое уже и сильное, можно пойти на него Для операций skip/goto можно сделать просмотр буфера перед посылкой запроса на сервер 2. Как внутри транзакции в этом случае формировать значения ключевых полей, если с одна таблица будет учавствовать в 2-х транзакциях с разных клиентов ? Это уже более существенно
|
|
|
alkresin
|
| moderator
|
Пост N: 147
Зарегистрирован: 06.07.06
|
|
Отправлено: 24.03.08 20:39. Заголовок: Внутри транзакции на..
цитата: | Внутри транзакции на клиенте операция seek не сможет учитывать измененные записи, которые еще не переданы на сервер |
| Я бы даже не назвал это ограничением. Надо просто корректно подготавливать выполнение транзакций: сначала найти все записи, которые будут изменены, заблокировать их, а потом выполнять транзакцию, иначе серверу относительно часто придется выполнять rollback ( если нужную запись не удалось заблокировать ). ADS, например, так и советует делать, они даже ограничивают выполнение блокировок во время транзакций и запрещают разблокировки. цитата: | Как внутри транзакции в этом случае формировать значения ключевых полей, если с одна таблица будет учавствовать в 2-х транзакциях с разных клиентов ? |
| Поясните на примере. Я пока не понял, в чем проблема.
|
|
|
alkresin
|
| moderator
|
Пост N: 148
Зарегистрирован: 06.07.06
|
|
Отправлено: 24.03.08 22:00. Заголовок: Кстати, учитывая то,..
Кстати, учитывая то, что все команды доступа к данным выполняются в настоящий момент последовательно в одном потоке, правильнее определить уровень изоляции как serializable, т.е. самый высокий :).
|
|
|
Pasha
|
| Администратор
|
Пост N: 875
Зарегистрирован: 23.05.05
|
|
Отправлено: 24.03.08 23:50. Заголовок: Я имел в виду одновр..
Я имел в виду одновременное получение значения ключа: dbGoBottom() nKey := Key + 1 begin transaction dbAppend() Field->Key := nKey ... Может случиться коллизия, когда 2-й клиент получит такое же значение ключа, пока 1-й не закончил транзакцию
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 524
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.03.08 01:17. Заголовок: Не забудьте сделать ..
Не забудьте сделать еще запуск letodb.exe как службу !!! А то замучишься потом его запускать самостоятельно. А вообщето неплохо бы сделать прогу, которая занимая мало место в памяти на сервере, слушала бы Port = 2812 указанный в letodb.ini и при обращении к этому порту с любого клиента, поднимала бы сам letodb.exe А в самом letodb.exe предусмотреть выгрузку из памяти если все клиенты прекратили работу с БД. И тогда удаленно можно было бы редактировать letodb.ini
|
|
|
alkresin
|
| moderator
|
Пост N: 149
Зарегистрирован: 06.07.06
|
|
Отправлено: 25.03.08 09:06. Заголовок: Я имел в виду одновр..
цитата: | Я имел в виду одновременное получение значения ключа: ... |
| Надо будет что-нибудь придумать... А вообще я храню такие номера в отдельном файле. Программа открывает его в монопольном режиме, считывает и модифицирует - и в это время ни одна собака не вмешается.
|
|
|
alkresin
|
| moderator
|
Пост N: 150
Зарегистрирован: 06.07.06
|
|
Отправлено: 25.03.08 20:46. Заголовок: Добавил поддержку DB..
Добавил поддержку DBFNTX. Чтобы сервер работал с этим драйвером, надо написать в letodb.ini: DEFAULT_DRIVER = NTX В самом ближайшем будущем добавлю в ini [DATABASE], чтобы устанавливать ntx не для всех данных, а для определенных каталогов.
|
|
|
alkresin
|
| moderator
|
Пост N: 151
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.03.08 10:44. Заголовок: Теперь можно писать ..
Теперь можно писать в ini: [DATABASE] DataPath = /some_db Driver = NTX чтобы определить каталог с данными /some_db, файлы в котором надо открывать через DBFNTX Сегодня, если не обнаружатся вдруг ошибки, выложу новый build.
|
|
|
gfilatov
|
| модератор
|
Пост N: 745
Зарегистрирован: 25.05.05
|
|
Отправлено: 26.03.08 14:12. Заголовок: alkresin пишет: выл..
alkresin пишет: Выложил готовую к использованию полную сборку LetoDB build 0.5 по адресу: http://minigui.mylivepage.ru/file/?fileid=4909 Результаты тестов для этой сборки: Test 1 Finished in 83.43 seconds Test 2 Finished in 0.55 seconds Test 3 Finished in 8.08 seconds Test 4 Finished in 7.96 seconds Расшифровка тестов: 1) добавление 200 000 записей и их заполнение произвольными данными 2) индексирование по числовому полю 3) позаписное перемещение через всю базу без использования индексов 4) позаписное перемещение через всю базу с использованием индекса Итоговый размер базы: 11,2 МБ Все тесты проводились на виртуальном (RAM) диске
|
|
|
alkresin
|
| moderator
|
Пост N: 152
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.03.08 14:17. Заголовок: Фантастика! У вас та..
Фантастика! У вас там робот автоматом отслеживает релизы и делает сборки ? Я только несколько минут назад файлы выложил ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 526
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.03.08 16:08. Заголовок: gfilatov пишет: Вс..
gfilatov пишет: цитата: | Все тесты проводились на виртуальном (RAM) диске |
| Не совсем понятно ! Что на сервере был создан виртуальный диск и на нем тестировалось ? Тогда это не есть хорошо ... Это не реальная ситуация ! Нужно тестировать на реально-работающем сервере, когда 10-15 клиентов сидят не только в этой задачи, но и в других.
|
|
|
gfilatov
|
| модератор
|
Пост N: 746
Зарегистрирован: 25.05.05
|
|
Отправлено: 26.03.08 16:21. Заголовок: Andrey пишет: Что н..
Andrey пишет: цитата: | Что на сервере был создан виртуальный диск и на нем тестировалось ? |
| Все тесты проводились на виртуальном (RAM) диске на локальной машине Andrey пишет: цитата: | Тогда это не есть хорошо ... Это не реальная ситуация ! |
| Согласен. Но никто и не будет на сервере добавлять 200 тысяч записей за один раз, как в 1-м тесте
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 528
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.03.08 21:03. Заголовок: Я попробую, чуть поп..
Я попробую, чуть попозже !
|
|
|
Pasha
|
| Администратор
|
Пост N: 876
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.03.08 23:21. Заголовок: Для xHarbour-пользов..
Для xHarbour-пользователей прийдется пересобрать билд, так как надо добавить функцию hb_strncpyLower
|
|
|
alkresin
|
| moderator
|
Пост N: 153
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.03.08 10:24. Заголовок: Да, сегодня сделаю b..
Да, сегодня сделаю build6. Эту hb_strncpyLower я вообще убрал, заменил вызовами strncpy() и hb_strLower(). Ее, как выяснилось, нет не только в xHarbour, но и в летнем ( последнем официальном ) релизе Harbour.
|
|
|
alkresin
|
| moderator
|
Пост N: 154
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.03.08 10:52. Заголовок: Выложил исправленный..
Выложил исправленный build6
|
|
|
gfilatov
|
| модератор
|
Пост N: 747
Зарегистрирован: 25.05.05
|
|
Отправлено: 27.03.08 12:13. Заголовок: alkresin пишет: Выл..
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
|
| moderator
|
Пост N: 155
Зарегистрирован: 06.07.06
|
|
Отправлено: 27.03.08 14:55. Заголовок: А версия сервера в э..
цитата: | А версия сервера в этой сборке осталась старой - Leto DB Server v.0.5 |
| Забыл поправить. Ну и ладно, на этой стадии - не страшно. цитата: | Также желательно иметь пример использования дополнительных типов полей |
| Это к Паше. Я сам дополнительные типы не использую, и другим не советую :)
|
|
|
Pasha
|
| Администратор
|
Пост N: 877
Зарегистрирован: 23.05.05
|
|
Отправлено: 27.03.08 22:49. Заголовок: Харбор поддерживает ..
Харбор поддерживает двочные поля следующих типов: (по формату 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
|
| постоянный участник
|
Пост N: 110
Зарегистрирован: 13.10.05
|
|
Отправлено: 28.03.08 07:06. Заголовок: К Филатову. Выложил ..
К Филатову. цитата: | Выложил готовую к использованию полную сборку LetoDB build 0.6 (ровно 1000,00 КБайт) |
| Сборка поддерживает xHarbour?
|
|
|
gfilatov
|
| модератор
|
Пост N: 750
Зарегистрирован: 25.05.05
|
|
Отправлено: 28.03.08 11:27. Заголовок: Vlad04 пишет: Сборк..
Vlad04 пишет: цитата: | Сборка поддерживает xHarbour? |
| Не проверял
|
|
|
alkresin
|
| moderator
|
Пост N: 156
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.08 12:42. Заголовок: Сервер ( letodb.exe ..
Сервер ( letodb.exe ) может быть собран чем угодно, а вот rdd - rddleto.lib, конечно же, должна быть сделана той же версией компилятора ( Harbour, C ), которой вы собираете свои программы.
|
|
|
gfilatov
|
| модератор
|
Пост N: 751
Зарегистрирован: 25.05.05
|
|
Отправлено: 28.03.08 13:44. Заголовок: Pasha пишет: в билд..
Pasha пишет: цитата: | в билд 6 попали ошибки, которые я пофиксил только сейчас |
| Выложил готовую к использованию исправленную сборку LetoDB build 0.6 по адресу: http://minigui.mylivepage.ru/file/?fileid=4919 От себя добавил портированный в Minigui менеджер активных подключений сервера (вместе с исходниками) в дополенение к уже существующим консольному и оригинальному гуишному на Hwgui.
|
|
|
alkresin
|
| moderator
|
Пост N: 157
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.08 14:37. Заголовок: Сделал транзакции - ..
Сделал транзакции - их еще проверять, поправлять и улучшать, но в первом приближении, вроде, работают. Напоминаю, что транзакция - это когда надо сделать одновременно несколько изменений в разных таблицах, так, чтобы прошло или все или ничего, чтобы не было потом несоответствий, а такое время от времени случается из-за сбоев в сети, ошибок и пр. Итак, делаем: 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
|
| Администратор
|
Пост N: 878
Зарегистрирован: 23.05.05
|
|
Отправлено: 28.03.08 16:22. Заголовок: alkresin пишет: Сде..
alkresin пишет: Впечатляет, особенно скорость разработки. Скажу пару слов от себя. В отличие от традиционных транцакций, в letodb Александр реализует другой принцип, когда транзакциями занимается не сервер, а клиент При этом во время транзакции данные на сервер не передаются совсем, а передаются только при commit transaction Операция rollback на сервере не нужна вообще, так как неудачную транзакцию сервер и не увидит Преимущества такого подхода видны невооруженным глазом Есть и недостатки, куда же без них Если на сервере реализовывать целостность ссылок, foreign key, то на сервере надо тоже предусматривать возможность отката транцакции Александр, а может быть задействовать autoinc-поля ? Харбор их поддерживает, осталось поднять в letodb Но тода при добавлении записей во время транзакции надо получать значения этих полей с сервера
|
|
|
alkresin
|
| moderator
|
Пост N: 158
Зарегистрирован: 06.07.06
|
|
Отправлено: 28.03.08 17:57. Заголовок: Операция rollback на..
цитата: | Операция rollback на сервере не нужна вообще, так как неудачную транзакцию сервер и не увидит |
| Не совсем так. Сервер увидит неудачную транзакцию, если, например, в клиентской программе не будет проверки блокировок ( значения, возвращаемого rlock() ). Rollback там не делается, потому что принятый пакет с изменениями сначала разбирается, наличие блокировок проверяется и потом, если все в порядке, все данные нормальные и проблем не ожидается, производится непосредственно запись в таблицы. цитата: | Если на сервере реализовывать целостность ссылок, foreign key, то на сервере надо тоже предусматривать возможность отката транцакции |
| Можно так же, как описано выше, предварительно проверять принятые данные, тогда rollback не понадобится. цитата: | Но тода при добавлении записей во время транзакции надо получать значения этих полей с сервера |
| Я думал, как можно делать такого рода вещи. Это ведь, чтобы использовать значения этих полей для записи в другие таблицы во время транзакции, верно ? Можно будет реализовать функции типа leto_fieldget( numfield, num_slot ) и leto_fieldput( numfield, num_slot ), которые во время транзакции будут включать в пакет соответствующие команды, и сервер, встретив эти команды, запишет в какой-то слот значение поля numfield в случае leto_fieldget и, соответственно, из слота в указанное поле в случае leto_fieldput.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 536
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.04.08 19:35. Заголовок: gfilatov пишет: Вы..
gfilatov пишет: цитата: | Выложил готовую к использованию исправленную сборку LetoDB build 0.6 по адресу: |
| Вопрос к Григорию: почему при запуске letodb.exe нет иконки в трее и нет вообще никакого окна от него ? Это сделано специально ? И на чем была проведена сборка ? Т.е. если на Харборе, то будет ли нормально работать хХарбор ? Или под свои программы на хХарборе нужно самостоятельно делать сборку letodb.exe ?
|
|
|
gfilatov
|
| модератор
|
Пост N: 759
Зарегистрирован: 25.05.05
|
|
Отправлено: 05.04.08 20:23. Заголовок: Andrey пишет: почем..
Andrey пишет: цитата: | почему при запуске letodb.exe нет иконки в трее и нет вообще никакого окна от него ? |
| Так задумано разработчиками сервера, для доступа к внутренней информации сервера служит дополнительная утилита manage.exe Andrey пишет: цитата: | на чем была проведена сборка ? |
| Использован Харбор. Andrey пишет: цитата: | будет ли нормально работать хХарбор ? |
| alkresin пишет: цитата: | Сервер ( letodb.exe ) может быть собран чем угодно, а вот rdd - rddleto.lib, конечно же, должна быть сделана той же версией компилятора ( Harbour, C ), которой вы собираете свои программы. |
| Думаю, что ответ Александра является исчерпывающим
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 537
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.04.08 12:09. Заголовок: gfilatov пишет: Так..
gfilatov пишет: цитата: | Так задумано разработчиками сервера, для доступа к внутренней информации сервера служит дополнительная утилита manage.exe |
| А как узнать версию сервера ? Это же нужно периодически для замены. Если бы сервер сидел в трее, то можно было бы вызывать его и менять настройки его. А так нельзя !!!
|
|
|
Pasha
|
| Администратор
|
Пост N: 881
Зарегистрирован: 23.05.05
|
|
Отправлено: 11.04.08 13:08. Заголовок: Как настроить на сер..
Как настроить на сервере кодовую страницу и другие параметры по умолчанию ? Codepage необходим для вычисления upper(), например, в фильтрах Я вижу в варианта: 1) Добавить codepage в PUSERSTRU (вместе с set exact, set dateformat etc), и отрабатывать перед каждой операцей, в которой вычисляется макрос или блок кода 2) Добавить глобальные настройки в letodb.ini Можно реализовать оба варианта, или один из двух Как лучше ?
|
|
|
alkresin
|
| moderator
|
Пост N: 159
Зарегистрирован: 06.07.06
|
|
Отправлено: 11.04.08 14:25. Заголовок: Оба. Codepage, навер..
Оба. Codepage, наверное, стоит передавать на сервер один раз с intro.
|
|
|
Pasha
|
| Администратор
|
Пост N: 884
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.04.08 16:39. Заголовок: Александр, у меня по..
Александр, у меня появилось такое предложение Что если сделать кеширование 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
|
| moderator
|
Пост N: 160
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.04.08 18:11. Заголовок: Процедура заполнения..
цитата: | Процедура заполнения экрана следующая: сначала вызовами dbskip(1) определяется количество строк грида, затем следует несколько вызовов dbSkip(-1), |
| Значит, надо. Только тогда обязательно и другую штуку надо сделать - запоминать в LETOAREA время получения кэша, и если оно превышает какую-то константу ( 1с, например, ) и таблица открыта в shared режиме, обновлять кэш. Это в любом случае надо было делать, а при кэшировании dbskip(-1) - тем более, иначе можно долго так по кэшу ходить, в то время как данные давно изменились.
|
|
|
Pasha
|
| Администратор
|
Пост N: 885
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.04.08 20:11. Заголовок: По поводу SET_EXACT...
По поводу SET_EXACT. А в каких случаях клиент должен устанавливать его на сервере, кроме как при выполнении макросов, заданных клиентом (фильтров, индексных выражений, условий индекса) ? Я не подумал, что установка этого флага может быть опасной для сервера, поскольку часть его кода остается на prg-уровне. Может быть, просто восстанавливать его значение после использования для фильтра/индекса ? Я пропустил установку параметров окружения клиента для leto_Goto Надо еще добавить в UpdateRec, поскольку во время этой операции обновляются ключи индекса
|
|
|
alkresin
|
| moderator
|
Пост N: 161
Зарегистрирован: 06.07.06
|
|
Отправлено: 16.04.08 12:12. Заголовок: По поводу SET_EXACT...
цитата: | По поводу SET_EXACT. А в каких случаях клиент должен устанавливать его на сервере, кроме как при выполнении макросов, заданных клиентом (фильтров, индексных выражений, условий индекса) ? |
| Т.е., при всех операциях перемещения, если установлен фильтр, и при update, если есть for в индексе ( но проще и быстрее set exact лишний раз установить, чем это проверять ). цитата: | Может быть, просто восстанавливать его значение после использования для фильтра/индекса ? |
| Конечно.
|
|
|
gfilatov
|
| модератор
|
Пост N: 769
Зарегистрирован: 25.05.05
|
|
Отправлено: 22.04.08 17:45. Заголовок: Выложил готовую к ис..
|
|
|
gfilatov
|
| модератор
|
Пост N: 773
Зарегистрирован: 25.05.05
|
|
Отправлено: 07.05.08 11:39. Заголовок: Выложил готовую к ис..
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 572
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.05.08 15:58. Заголовок: Вопрос на засыпку ??..
Вопрос на засыпку ???? А когда будет реализована шифрация текстовых данных !!! Чтоб они в базе шифрованные хранились !!! У себя в программе шифруешь запрос, отправляешь на сервер, сервер выдает шифрованные данные, далее у себя в программе их дешифруешь и потом показываешь ! Только нужно бы предусмотреть подключение своих алгоритмов шифрации-дешифрации, включая железных алгоритмов (типа ключа HASP HL) . Может кто-то по другому мыслить, так давайте обсуждать это. Но передачу данных по сети нужно шифровать. Да и хранить БД-нужно тоже шифрованную. Уже сама жизнь заставляет.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 578
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.05.08 14:19. Заголовок: Тестирую сервер. Сто..
Тестирую сервер. Столкнулся с непонятной вещью при использовании Манеджера из minigui ..... Почему всех программ по 2 штуки ???
|
|
|
gfilatov
|
| модератор
|
Пост N: 779
Зарегистрирован: 25.05.05
|
|
Отправлено: 23.05.08 17:07. Заголовок: Andrey пишет: Столк..
Andrey пишет: цитата: | Столкнулся с непонятной вещью |
| Andrey Логика работы обоих менеджеров (HwGUI и MiniGUI) абсолютно одинакова: они получают информацию от сервера LetoDB. По ходу, под Win98 удвоения программ не наблюдалось...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 581
Зарегистрирован: 12.09.06
|
|
Отправлено: 23.05.08 23:06. Заголовок: gfilatov пишет: По ..
gfilatov пишет: цитата: | По ходу, под Win98 удвоения программ не наблюдалось... |
| Пробовал на 2-х машинах под ХР.... Везде по 2-копии....
|
|
|
PSP
|
| постоянный участник
|
Пост N: 92
Зарегистрирован: 27.01.07
|
|
Отправлено: 24.05.08 08:44. Заголовок: У одной имя manage.e..
У одной имя manage.exe, а у другой - manager.exe
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 584
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.05.08 00:41. Заголовок: Взялся тестировать с..
Взялся тестировать сервер на локальной сети микрорайона, и вышел облом...... Сервер поставил у себя, а приложение отдал другу через несколько домов. У меня стоит Outpost Firewall Pro ver. 4.0 Настроил разрешение для работы как FTP-сервер. Мой тестовый пример у меня запускается, а у друга нет. Может дело в разных IP-адресах ???? У него адрес 10.60.232.15, у меня 10.60.202.15 Тестовый пример: Function Main() LOCAL cTable, nConnect // My host base cTable := "//10.60.202.15:2812/spiski.dbf" * Можно пользоваться и названием компа-сервера *cTable := "//SERVER2008:2812/spiski.dbf" //server host REQUEST LETO RDDSETDEFAULT( "LETO" ) CLEAR SCREEN @ 0,0 say "Open DBASE: "+cTable nConnect := leto_Connect( cTable ) ?? nConnect IF nConnect == 0 USE ( cTable ) NEW Browse() USE ELSE ALERT( "Server LetoDB not run !; "+cTable ) ENDIF Return nil Отключал у себя полностью Outpost Firewall, все равно не помогает.... Кстати пробовал пинговать комп, по этому адресу 10.60.232.15, не видется в сети.... Может сетка так настроена ? Где и что неправильно .....
|
|
|
Pasha
|
| Администратор
|
Пост N: 916
Зарегистрирован: 23.05.05
|
|
Отправлено: 26.05.08 08:46. Заголовок: Andrey пишет: Кстат..
Andrey пишет: цитата: | Кстати пробовал пинговать комп, по этому адресу 10.60.232.15, не видется в сети.... Может сетка так настроена ? |
| А как она настроена ? Какие вообще сетевые средства работают ? Только ftp ? Компьютер не пингуется, и о чем дальше говорить ? Надо, чтобы пинговался И можно попробовать использовать другой порт, вместо 2812 То, что компьютеры находятся в разных подсетях, роли не играет
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 586
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.05.08 13:26. Заголовок: Pasha пишет: А как ..
Pasha пишет: цитата: | А как она настроена ? Какие вообще сетевые средства работают ? Только ftp ? Компьютер не пингуется, и о чем дальше говорить ? Надо, чтобы пинговался |
| Так кто-же знает как настроена сеть .... Провайдер знает, а он фиг ответит.... Буду долбать его... Pasha пишет: цитата: | То, что компьютеры находятся в разных подсетях, роли не играет |
| Понял, спасибо !
|
|
|
Snake
|
| |
Пост N: 18
Зарегистрирован: 23.02.06
|
|
Отправлено: 26.05.08 14:57. Заголовок: imho если netmask ст..
imho если netmask стоит по умолчанию - 255.255.255.0 - и не будет видеть, надо ставить чн типа 255.255.0.0
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 593
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.05.08 00:43. Заголовок: Короче говоря это ПР..
Короче говоря это ПРОВАЙДЕР зарубил все порты, придется по другому тестировать ..... Вопрос самый главный: Как можно открыть одновременно базы на сервере и базы на локальной машине ??? Мне же нужно выборку делать, скидывать свое... да мало ли для чего.
|
|
|
sashaBG
|
| постоянный участник
|
Пост N: 34
Зарегистрирован: 15.09.05
|
|
Отправлено: 30.05.08 01:29. Заголовок: Не могу разобратся с Letо_Frename()
Leto_Frename( _Server + 'smplan.DBF' , _Server +'temp.dbf' ) msginfo(str(leto_ferror())) // тут получается ошибка 53
|
|
|
Pasha
|
| Администратор
|
Пост N: 922
Зарегистрирован: 23.05.05
|
|
Отправлено: 30.05.08 08:31. Заголовок: Leto_Frename( _Serve..
Leto_Frename( _Server + 'smplan.DBF' , _Server +'temp.dbf' ) 2-й параметр (новое имя) надо задавать без указания сервера: _Server
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 596
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.05.08 22:42. Заголовок: Вопрос самый главный..
Вопрос самый главный: Как можно открыть одновременно базы на сервере и базы на локальной машине ???
|
|
|
Pasha
|
| Администратор
|
Пост N: 923
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.05.08 09:49. Заголовок: Таблицы на сервере о..
Таблицы на сервере открывать через LETO, локально - через DBFCDX Можно конечно на каждом клиенте тоже запустить LetoDB, и стучаться к нему локально через 127.0.0.1, но это будет уже извращение.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 597
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.05.08 11:00. Заголовок: Pasha пишет: локаль..
Pasha пишет: А как ? Синтаксис команды можно привести ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 924
Зарегистрирован: 23.05.05
|
|
Отправлено: 31.05.08 13:44. Заголовок: синтаксис традиционн..
синтаксис традиционный для клиппера REQUEST LETO, DBFCDX USE t1 VIA LETO USE t2 VIA DBFCDX Естественно, надо указать путь доступа для таблиц на сервере или локально
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 601
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.05.08 22:21. Заголовок: Спасибо !!! :sm22: ..
Спасибо !!! А можно сейчас открывать на сервере NTX файлы ? А одновременно NTX и CDX ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 925
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.06.08 17:37. Заголовок: Сейчас на сервере мо..
Сейчас на сервере можно задать либо глобальную настройку - параметр DEFAULT_DRIVER, либо указать несколько БД (в разных каталогах), и для каждой указать параметры DATAPATH и DRIVER Пример: [DATABASE] DATAPATH=c:\data\b1 DRIVER = cdx [DATABASE] DATAPATH=c:\data\b2 DRIVER = ntx При открытии таблицы сервер по каталогу находит БД, и использует нужный драйвер
|
|
|
Pasha
|
| Администратор
|
Пост N: 926
Зарегистрирован: 23.05.05
|
|
Отправлено: 01.06.08 21:38. Заголовок: Добавил функцию LETO..
Добавил функцию LETO_SUM(cField, [cFilter], [ScopeTop], [ScopeBottom]) Функция суммирует поле cField для записей, удовлетворяющих условию фильтра и scope
|
|
|
a_sidorov
|
| |
Пост N: 1
Зарегистрирован: 07.06.08
|
|
Отправлено: 07.06.08 12:23. Заголовок: Несколько офисов по ..
Несколько офисов по Москве. Есть желание объединить. Запустил сервер на другой машине, внес изменения, но с ходу не очень получилось. На какие грабли наступаю: 1. При отсутствии файла letodb.ini (ну ошибся в имени, с кем не бывает) файл открывается по полному пути. Если поставить вызов leto_file(), то возвращает .f. (не работает), при этом все начинает глючить. Файл открывается с вероятностью 50%, выдавая случайным образом ошибку. Надо бы исправить. При открытии файла идет ошибка Error LETO/1021 Data type error: -002 2. Указываю в letodb.ini (уже делаю тест на локалке) EnableFileFunc = 1 DEFAULT_DRIVER = NTX DataPath = f:/ftest Оказавается, путь к dbf должен указываться с IP адресом, а к индексному файлу – без IP адреса. Но ведь, как правило, настройка путей прописывается в одном месте, кроме того, нужно проверять наличие файла на сервере. Придется после проверки наличия файла функцией leto_file(fname) удалять из fname IP адрес, например Stat func DelIPpath(fname) return if(Left(fname,2)=="//",substr(fname,at("/",substr(fname,3))+2),fname) Опять - почему это не делать на сервере? 3. Активно использую функцию XUPPER для поднятия русских букв в верхний регистр. Func XUpper( String ) Retu CharRepl( 'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщьыъэюя',; String,; 'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ' ) Приехали и встали. На сервере ее нет. Функция Upper() не поднимает русские буквы. Общее впечатление – сыровато с точки зрения – шаг влево, шаг вправо. Переделки сетевой задачи на NTX небольшие: в функции сетевого открытия проверяем наличие в имени файла “//“ и открываем файл VIA LETO. И убираем IP из имени файлов индексов для серверных файлов. Все остальные файлы, в имени которых нет “//” (в том числе локальные) открываются как NTX по умолчанию. В Нужно что-то делать с функциями в индексе. Как минимум пара функций есть своих кроме XUpper(). Пока стою и решаю, идти ли дальше.
|
|
|
Pasha
|
| Администратор
|
Пост N: 928
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.06.08 14:33. Заголовок: 1. При отсутствии le..
1. При отсутствии letodb.ini применяются стандартные настройки, где параметр EnableFileFunc выключен Впрочем, я пересмотрю leto_file(). На SF форуме Leonardo Machado тоже на нее жалуется, хотя у меня его пример работает 2. Параметры соединения: IP:port необходимы только при открытии таблицы, при открытии индекса они не нужны. Так что логика в этом есть. Впрочем, это можно обсудить 3. Вопрос про UDF уже здесь обсуждался, и пришли к выводу, что такие функции, или request для стандартных Харбор-функций, пользователью надо включать в тело server.prg. Ведь процедура сборки сервера простейшая Кстати, русские кодовые страницы на сервере подликовываются, и upper должен работать корректно
|
|
|
a_sidorov
|
| |
Пост N: 2
Зарегистрирован: 07.06.08
|
|
Отправлено: 09.06.08 10:46. Заголовок: Фукция Indexkey() во..
Фукция Indexkey() возвращает правильно только первые два индексных выражения (проверял на NTX), вместо третьего идет код. Сам индекс поддерживается. Пробовал переставлять второй и третий индекс, возвращает либо код 10 либо код 55, в зависимости от того, какой индекс стоит третьим.
|
|
|
Ответов - 325
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
All
[только новые]
|
|