Автор | Сообщение |
Pasha
|
| Администратор
|
Пост N: 2416
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.06.12 18:14. Заголовок: Leto DB Server (продолжение 8)
Немного доработал документацию к letodb
|
|
|
Ответов - 273
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
All
[только новые]
|
|
Andrey
|
| постоянный участник
|
Пост N: 2276
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.07.12 13:05. Заголовок: А почему ссылки на L..
|
|
|
Pasha
|
| Администратор
|
Пост N: 2455
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.07.12 13:31. Заголовок: Andrey пишет: А поч..
Andrey пишет: Там перечисляются только библиотеки, которые входят в поставку Harbour. А letodb - это отдельный проект. У меня была мысль передать letodb в harbour\contrib, как один из вариантов, поскольку положение с проектом сейчас явно ненормальное, даже если кто-то захочет присоединиться к проекту - он не сможет этого сделать. Но тогда может быть прекращена поддержка клиентской библиотеки для xHarbour, да и делать это без согласия автора проекта не хотелось бы.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2278
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.07.12 13:38. Заголовок: Все равно надо там р..
Все равно надо там разместить ссылки на LetoDB и выложить что-нибудь, пускай знают что есть классный продукт под Harbour. И решить вопрос с автором проекта...
|
|
|
Pasha
|
| Администратор
|
Пост N: 2456
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.07.12 13:44. Заголовок: Dima пишет: Возможн..
Dima пишет: цитата: | Возможно тут дело не в LetoDB а в TSBrowse |
| Скорее всего, надо сделать что-то вроде: oB:bTagOrder := {|| ordNumber()} для восстановления тэга при получении фокуса
|
|
|
Pasha
|
| Администратор
|
Пост N: 2457
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.07.12 13:49. Заголовок: Andrey пишет: Все р..
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2279
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.07.12 15:55. Заголовок: Pasha пишет: Разве ..
Pasha пишет: Да хотя бы туда.
|
|
|
alex_II
|
| |
Пост N: 77
Зарегистрирован: 12.07.06
|
|
Отправлено: 21.07.12 06:13. Заголовок: Pasha пишет: Скорее..
Pasha пишет: цитата: | Скорее всего, надо сделать что-то вроде: oB:bTagOrder := {|| ordNumber()} для восстановления тэга при получении фокуса |
| Спасибо за подсказку, помогло! Проверил вариант без letoDB, получил тот же глюк, значит дело в TSBrowse
|
|
|
Pasha
|
| Администратор
|
Пост N: 2463
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.08.12 18:09. Заголовок: Новости проекта: 1...
Новости проекта: 1. Если открывается большая БД, содержащая много (десятки и сотни) таблиц, появилась возможность открывать все таблицы одним запросом, а не множеством запросов, каждый отдельный для команды use Для этого надо вызвать udf-функцию UDF_OpenTables, и передать ей массив с описанием открываемых таблиц. Эта функция вернет массив строк, каждый элемент которого надо передать команде use вместо имени таблицы. При этом use не будет делать запрос к серверу, а заполнит данные rdd, используя элемент массива. Использование алиаса при этом обязательно. Пример: if leto_UDFExist( "UDF_OpenTables" ) aAreas := leto_UDF( ""UDF_OpenTables"", {{"table1",, .t.}, {"table2",, .t.}, {"table3",, .t.}} ) use (aAreas[1]) alias table1 shared new use (aAreas[2]) alias table2 shared new use (aAreas[3]) alias table3 shared new else use table1 alias table1 shared new use table2 alias table2 shared new use table3 alias table3 shared new endif 2. Добавлена функция на сервере leto_RecLockList( nUserStru, aRecNo ) --> lSuccess Функция leto_RecLockList блокирует записи с номерами, указанными в массиве aRecNo. Если блокировка какой-либо записи не удалась, блокировки снимаются, и возвращается результат .F. Эту функцию можно вызывать на сервере в модуле letoudf.prg, или с клиента вызовом leto_UDF( "leto_RecLockList", aRecNo ) Вместо множества вызовов dbRLock можно использовать один вызов leto_RecLockList. У меня при некоторых операциях блокируется свыше тысячи записей, и новая функция позволит резко сократить количество запросов к серверу.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2291
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.08.12 11:40. Заголовок: Хорошее решение ! К..
Хорошее решение ! Классно !
|
|
|
Pasha
|
| Администратор
|
Пост N: 2468
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.08.12 08:34. Заголовок: Вопрос касается выде..
Вопрос касается выделения памяти для списка блокированных записей в letodb сервере В dbfcdx/dbfntx список построен как простой массив значений типа unsigned long (это номера блокированных записей) При блокировке записи память под массив перевыделяется (его размер увеличивается), при снятии блокировки - размер уменьшается В letodb сделано примерно аналогично, только память под массив увеличивается порциями по 50 элементов, а при снятии блокировки - размер не уменьшается. В letodb это может привести к коллизиям при многопоточной обработке: при перевыделении памяти адрес массива может измениться, а в это время другой поток может к нему обращаться. Предложите другой способ организации этого списка. Пока я вижу только простейший список со ссылкой на следующий элемент. Может быть есть способ поэффективнее ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 2469
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.08.12 10:14. Заголовок: Остановился на однон..
Остановился на однонаправленном отсортированном списке. Структура такая: typedef struct { ULONG ulRecNo; PLETO_LOCK_ITEM pNext; } LETO_LOCK_ITEM, *PLETO_LOCK_ITEM; typedef struct { BOOL bLocked; PLETO_LOCK_ITEM pItem; } LETO_LOCK_LIST, *PLETO_LOCK_LIST; 3 функции для нее: Поиск в списке static BOOL letoIsRecInList( PLETO_LOCK_LIST pLockList, ULONG ulRecNo ) Добавление в список static void letoAddRecToList( PLETO_LOCK_LIST pLockList, ULONG ulRecNo ) Удаление из списка static void letoDelRecFromList( PLETO_LOCK_LIST pLockList, ULONG ulRecNo ) Ну и функция очистки всего списка. Каждая функция перед тем, как работать со списком, выполняет цикл с проверкой pLockList->bLocked: static void letoLockWait( PLETO_LOCK_LIST pLockList ) { while( pLockList->bLocked ) ; } 2 последние функции перед добавлением/удалением элемента блокируют список: pLockList->bLocked = TRUE; После чего разблокируют его. Вопрос. Не может ли быть здесь коллизий при многопоточной работе ? Пусть один поток что-то делает со списком, и заблокировал его. Другой поток перед поиском в списке вызывает цикл letoLockWait( pLockList ); Зацикливания, даже теоретически, не произойдет ?
|
|
|
|
Pasha
|
| Администратор
|
Пост N: 2475
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.08.12 15:44. Заголовок: Переделал списки бло..
Переделал списки блокированных записей, списки индексов, рабочих областей вместо массивов, которые могут перевыделяться в памяти, на однонаправленные списки. Но все-таки, меня терзают смутные сомнения. Если один поток что-то делает со списком, добавляет и в него элемент или удаляет, то надо на время операции блокировать список для доступа на чтение и запись другим потокам, во избежание неприятностей в виде гпф. А как это сделать ? Я в список добавляю 2 флага: bLockRead и bLockWrite: typedef struct { BOOL bLockRead; BOOL bLockWrite; ULONG ulSize; PLETO_LIST_ITEM pItem; } LETO_LIST, *PLETO_LIST; и перед доступом к списку проверяю эти флаги: void letoWaitWrite( PLETO_LIST pLockList ) { while( pLockList->bLockWrite || pLockList->bLockRead ) pLockList->bLockWrite += 0 ; } void letoWaitRead( PLETO_LIST pLockList ) { while( pLockList->bLockWrite ) pLockList->bLockWrite += 0 ; } Но эта зараза, а именно компилятор C, оптимизирует эти циклы, и ничего не делает. Специально дизассемблировал на предмет посмотреть. Оно не понимает, что к структуре имеет доступ другой поток, который может изменять значение флагов Как сделать блокировку списка ? Может быть, у потоков есть стандартный механизм для этого ?
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 2301
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.08.12 23:01. Заголовок: Pasha спасибо за сов..
Pasha спасибо за совершенствование LetoDB. Жалко что не могу помочь в таких сложных решениях. Поспрашивай, может на других Си-шных форумах помогут.
|
|
|
PSP
|
| постоянный участник
|
Пост N: 789
Зарегистрирован: 27.01.07
|
|
Отправлено: 23.08.12 08:34. Заголовок: Ну, а если в тело ци..
Ну, а если в тело цикла вставить дополнительные строки, не нарушающие логики, которые смогут убедить компилятор не оптимизировать цикл? К примеру: typedef struct { BOOL bLockRead; BOOL bLockWrite; int nTemp; ULONG ulSize; PLETO_LIST_ITEM pItem; } LETO_LIST, *PLETO_LIST; void letoWaitWrite( PLETO_LIST pLockList ) { while( pLockList->bLockWrite || pLockList->bLockRead ) { pLockList->bLockWrite += 0 ; if ( pLockList->nTemp ) { pLockList->nTemp := 0 ;} else { pLockList->nTemp := 1 ;} } } Upd: опечатка. Вместо pLockList->i д.б. pLockList->nTemp. Исправил.
|
|
|
santy
|
| |
Пост N: 93
Зарегистрирован: 16.12.08
|
|
Отправлено: 23.08.12 10:23. Заголовок: Паша, а если попроб..
|
|
|
Pasha
|
| Администратор
|
Пост N: 2476
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.08.12 12:57. Заголовок: santy пишет: Паша, ..
santy пишет: цитата: | Паша, а если попробовать использовать мьютекси. |
| Спасибо, это то что надо. Я чувствовал, что делаю что-то не то. Надо использовать мютексы.
|
|
|
AlexMyr
|
| |
Пост N: 584
Зарегистрирован: 11.06.10
|
|
Отправлено: 21.09.12 10:08. Заголовок: Хочу узнать дату пос..
Хочу узнать дату последнего обновления базы, dbinfo(4) возвращает пустую дату. Что делать?
|
|
|
Pasha
|
| Администратор
|
Пост N: 2484
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.09.12 14:07. Заголовок: Сейчас LastUpdate не..
Сейчас LastUpdate не передается с сервера. Надо будет добавить. Только это связано с изменением протокола, вот думаю, как сделать, чтобы новые версии сервера и клиента при этом работали со старыми.
|
|
|
AlexMyr
|
| |
Пост N: 587
Зарегистрирован: 11.06.10
|
|
Отправлено: 24.09.12 08:52. Заголовок: AlexMyr пишет: Сейч..
Pasha пишет: цитата: | Сейчас LastUpdate не передается с сервера. Надо будет добавить. |
|
Спасибо, работает!
|
|
|
AlexMyr
|
| |
Пост N: 588
Зарегистрирован: 11.06.10
|
|
Отправлено: 24.09.12 09:44. Заголовок: Паша! Команда append..
Паша! Команда append from я так понимаю не сработает с letodb сервера на локальный диск, надо через массив записи переганять?
|
|
|
Ответов - 273
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
All
[только новые]
|
|