| Главная | Математика | Программирование | Caché | Творчество | Решатели |

Cache': Где наши данные?

Как получить доступ к данным с нестандартным размещением через объектный и sql интерфейсы?
При работе с данными через прямой доступ имеется возможность указать, где они находятся, явным образом. При использовании же как объектного так и sql интерфейсов такой возможности не предусмотрено. Это можно сделать, используя задание правил размещения этих данных.

В качестве примера будем использовать входящие в стандартную инсталляцию каше области USER и SAMPLES, и получим доступ к данным находящимся в области SAMPLES из процесса работающего в области USER.

Возьмем из области SAMPLES класс Sample.Person и используемый им класс Sample.Address и экспортируем их в формате xml (я привожу выполнение примера на Cache версии 5.0.21) в отдельный файл. Сам файл приводить не стану - его легко получить самостоятельно.

Теперь импортируем эти классы в область USER без компиляции и перейдем к их редактированию в Cache Studio.

Класс Sample.Address оставляем без изменений, просто компилируем.

Открываем редактирование класса Sample.Person, в меню студии выбираем пункт Вид - Просмотр способа хранения. И переходим к описанию хранения данных. У меня это выглядит таким образом:

<Storage name="Default">
    <Data name="PersonDefaultData">
        <Value name="1">
            <Value>%%CLASSNAME</Value>
        </Value>
        <Value name="2">
            <Value>DOB</Value>
        </Value>
        <Value name="3">
            <Value>FavoriteColors</Value>
        </Value>
        <Value name="4">
            <Value>Home</Value>
        </Value>
        <Value name="5">
            <Value>Name</Value>
        </Value>
        <Value name="6">
            <Value>Office</Value>
        </Value>
        <Value name="7">
            <Value>SSN</Value>
        </Value>
        <Value name="8">
            <Value>Spouse</Value>
        </Value>
    </Data>
    <DataLocation>^Sample.PersonD</DataLocation>
    <DefaultData>PersonDefaultData</DefaultData>
    <IdLocation>^Sample.PersonD</IdLocation>
    <IndexLocation>^Sample.PersonI</IndexLocation>
    <SequenceNumber>25</SequenceNumber>
    <StreamLocation>^Sample.PersonS</StreamLocation>
    <Type>%Library.CacheStorage</Type>
</Storage>
Здесь описано какие атрибуты у класса есть, порядок и место их хранения. Наша задача указать, что данные лежат не в области USER, а в области SAMPLES. Для этого в описании хранения явно прописываем указание области в атрибутах DataLocation, IdLocation, IndexLocation, StreamLocation. У меня это получается таким образом:
<Storage name="Default">
    <Data name="PersonDefaultData">
        <Value name="1">
            <Value>%%CLASSNAME</Value>
        </Value>
        <Value name="2">
            <Value>DOB</Value>
        </Value>
        <Value name="3">
            <Value>FavoriteColors</Value>
        </Value>
        <Value name="4">
            <Value>Home</Value>
        </Value>
        <Value name="5">
            <Value>Name</Value>
        </Value>
        <Value name="6">
            <Value>Office</Value>
        </Value>
        <Value name="7">
            <Value>SSN</Value>
        </Value>
        <Value name="8">
            <Value>Spouse</Value>
        </Value>
    </Data>
    <DataLocation>^|"SAMPLES"|Sample.PersonD</DataLocation>
    <DefaultData>PersonDefaultData</DefaultData>
    <IdLocation>^|"SAMPLES"|Sample.PersonD</IdLocation>
    <IndexLocation>^|"SAMPLES"|Sample.PersonI</IndexLocation>
    <SequenceNumber>25</SequenceNumber>
    <StreamLocation>^|"SAMPLES"|Sample.PersonS</StreamLocation>
    <Type>%Library.CacheStorage</Type>
</Storage>
Компилируем класс. Получили, что в областях USER и SAMPLES есть одинаковые классы Sample.Person и Sample.Address, при этом в области USER данные указываются на область SAMPLES.

Можем открыть Cache SQL Manager, и в нем открыть таблицы в обеих областях. Таким образом, мы получили решение исходной задачи - имеем и объектный и sql доступ к данным в другой области.

Также возможно указывать в качестве области не константу, а вычисляемое выражение, или вместо глобали использовать локальные переменные. В этом случае можно организовать весьма хитроумные способы размещения. Но в каждом из них нужно детально анализировать, как поведет себя оптимизатор SQL, как будет относиться объектный движок Cache при сохранении объекта если место его хранения изменилось. Но эффекты могут оказаться не только сложными но и полезными с точки зрения прикладных решений.

Евгений Каратаев.
Ссылки по теме
Универсальный MUMPS-commander

Cache': Как развернуть значение параметра в несколько строк

Cache': Как сделать select from dual

Cache': Как сделать select from limit

Cache': Как параметризовать select from in?

Cache': Как написать свою функцию агрегации для group by?

Интервью с Константином Аристовым

Cache': Удаляем русскую локализацию.

Доступ к MSSQL из Cache' на платформе Linux

CacheObject: SetOutput в Delphi

Комментарии в Cache

Вызываем метод базового класса

Краткая документация с примерами для Delphi

Передача аргументов

Прямой доступ через CacheObject

Прямой доступ через ODBC

Техника группировки

Директивы препроцессора

Проверка строки на "списочность"

Caché: профилируем программу

Использование плагина ekscr для построения отчета на сервере

Борьба с deadlock

Смотрим план запроса


| Главная | Математика | Программирование | Caché | Творчество | Решатели |

Дизайн и сопровождение: Евгений Каратаев








Если вам необходим почтовый аккаунт, тогда почта на Qip.ru - ваш выбор. Для хранения фото и видео рекомендуем бесплатный фотохостинг - Photo.Qip.ru.
Для студентов и абитуриентов: крупнейшая библиотека рефератов и сочинений - 5ballov.Qip.ru




Сайт размещен на бесплатном хостинге - Hosting.Qip.ru.