Страница 1 из 1

Помогите с IMDD

Добавлено: 07 Сентябрь 2011, 23:03
Дед Пахом
Только начал использовать In-Memory driver, и тут же нарвался на чёрт знает что.
Есть таблица (MySQL), гружу её в память в начале программы: MemAccess:Templates.Load(), всё работает оч. хор. В какой-то момент понадобилось мне дать возможность юзеру перегрузить данные с сервера в память, ну думаю, делов-то? опять MemAccess:Templates.Load(), ан нет, не работает! Стал разбираться и выяснил, что в методе Reset (который вызывается из Load) не отрабатывает строка OPEN(SELF.Target,lMode) - возвращает ошибку "Access Denied". Кто-нибудь пните меня в нужном направлении!
C8, ABC

Re: Помогите с IMDD

Добавлено: 08 Сентябрь 2011, 0:30
Губин Игорь
поставь для IMMD файлов read/write + deny none и разрешение на Create
Поток один?

Re: Помогите с IMDD

Добавлено: 08 Сентябрь 2011, 11:09
Дед Пахом
memory файл в словаре не описан, поток один. Но кажется причину понял - ABC-шный RelationManager открывает таблицу и держит её. Если вынести Load вне RelationManager.Open/Close фрейма, то imdd таблица перегружается (правда, данные в ней какие-то странные, блобы пустые вроде, но это уже другая история)

Re: Помогите с IMDD

Добавлено: 08 Сентябрь 2011, 11:42
Губин Игорь
Ну я или описываю файл в словаре, тогда работаю с ним стандартными средствами или пишу всё ручками на уровне Open/next...

Re: Помогите с IMDD

Добавлено: 09 Сентябрь 2011, 16:27
Дед Пахом
Вобщем, с IMDD можно спокойно работать только в потоке главного фрейма (THREAD() = 1), чуть в сторону, и то с ABC-шными FileManager'ами конфликт, то блобы не грузятся.
Кстати, Dynamic driver тоже то ещё фуфло - блобы он трактует как CSTRING, в результате теряем все данные после первого нулевого байта в блобе.

Re: Помогите с IMDD

Добавлено: 09 Сентябрь 2011, 16:37
Губин Игорь
Дед Пахом писал(а):Вобщем, с IMDD можно спокойно работать только в потоке главного фрейма (THREAD() = 1)
БРРРРРРРР! :shock: Или так криво сделан файловый менеджер в ABC (у меня легаси) или вы "просто не умете их готовить".
Я использую IMDD и в хвост и в гриву. И в один файл на все потоки и отдельные копии в каждом потоке. Единственное НО: гружу я данные в IMDD файл ручками, но так уж у меня задумано изначально.

Re: Помогите с IMDD

Добавлено: 09 Сентябрь 2011, 16:59
Дед Пахом
Наверно, "не умею", но осадочек остался.

Re: Помогите с IMDD

Добавлено: 09 Сентябрь 2011, 19:56
Rimas
Дед Пахом писал(а):Вобщем, с IMDD можно спокойно работать только в потоке главного фрейма (THREAD() = 1), чуть в сторону, и то с ABC-шными FileManager'ами конфликт, то блобы не грузятся.
Кстати, Dynamic driver тоже то ещё фуфло - блобы он трактует как CSTRING, в результате теряем все данные после первого нулевого байта в блобе.
DRIVER('Memory', '/THREADEDCONTENT’)
не то?

Re: Помогите с IMDD

Добавлено: 09 Сентябрь 2011, 21:18
Дед Пахом
Не то по смыслу задачи - данные дожны быть одинаковыми в любом треде (то есть реальная таблица из БД).

Re: Помогите с IMDD

Добавлено: 09 Сентябрь 2011, 22:14
Губин Игорь
Не вижу где у тебя проблемы...
1. Ставь всегда Share
2. Ставь'/THREADEDCONTENT’
3. Заполнение базы веди в основном фрейме.

В этом случае после открытия каждого треда ты там получишь уникальный экземпляр полностью заполненной базы

Re: Помогите с IMDD

Добавлено: 10 Сентябрь 2011, 0:19
Дед Пахом
Губин Игорь писал(а):Не вижу где у тебя проблемы...
1. Ставь всегда Share
2. Ставь'/THREADEDCONTENT’
3. Заполнение базы веди в основном фрейме.

В этом случае после открытия каждого треда ты там получишь уникальный экземпляр полностью заполненной базы
1. Где Share ставить? In-Memory в словаре нет. Да он и так с модой 42h открывается (см. ABTblSyn.CLW)
2. Не пойму, зачем мне в каждом треде копия (нехилой) базы
3. Да, теперь так и сделал. Перед вызовом из главного меню процедуры, использующей In-Memory, сравниваю кол-во записей в реальной таблице и в памяти, при несовпадении гружу заново.

PS
так и чешутся руки отнаследоваться от FileSynchronizationClass и добавить всё что нужно в наследника, да хотя бы получить число записей в In-Memory надо написать

Код: Выделить всё

OPEN(Table)
nRecs = RECORDS(Table)
CLOSE(Table)
прежде чем Load вызвать.

Re: Помогите с IMDD

Добавлено: 10 Сентябрь 2011, 1:01
Губин Игорь
Дед Пахом писал(а):2. Не пойму, зачем мне в каждом треде копия (нехилой) базы
Дело в том, что если не ставить /threadcontent, то при изменении буфера в одном треаде он автоматически изменится и в другом. Вот такие пироги...

Насколько эти копии независимы, мне трудно сказать, не проверял. Надо протестировать. Может и одна копия с различными буферами.

Re: Помогите с IMDD

Добавлено: 10 Сентябрь 2011, 9:59
Дед Пахом
Губин Игорь писал(а):Дело в том, что если не ставить /threadcontent, то при изменении буфера в одном треаде он автоматически изменится и в другом. Вот такие пироги...

Насколько эти копии независимы, мне трудно сказать, не проверял. Надо протестировать. Может и одна копия с различными буферами.
Судя по хелпу, в каждом треде своя копия всей таблицы.

Re: Помогите с IMDD

Добавлено: 10 Сентябрь 2011, 11:11
Губин Игорь
Сорри, нёс полную пургу про /threadcontent (нефиг работать головой после полуночи).
Ставить его не надо в твоём случае. Речь должна идти о THREAD в описании структуры..

MemoryFile FILE,DRIVER('MEMORY'),PRE(MemF),BINDABLE,CREATE,THREAD ! Порождено словарём
Открывается везде 42h
Заполнение ведётся в потоке фрейма, но с вызовом отдельной процедуры с собственным открытием/закрытием файлов.

Если не поставить THREAD, то, как и следует ожидать, портятся буфера файла в разных потоках
Если не поставить 42h, то в потоке выдаётся ошибка открытия

Проверка сейчас велась на легаси. Окрытие файлов производилось штатными средствами шаблонов, никакого рукописания.