Используем объекты Caché Бакулин Сергей Москва, 11 апреля

Preview:

Citation preview

Используем объекты CachéБакулин Сергей

Москва, 11 апреля

Caché Server Pages (CSP)Caché Server Pages (CSP)

Объекты в Caché 5.1

ПлатформыПлатформы

Ядро CachéЯдро Caché

SQLSQL

ODBCODBC JDBCJDBC

ObjectsObjectsDirectDirect

Cal

lin

Cal

lin

Cal

lou

tC

allo

ut

Vis

MV

isM

Caché Object Script & Caché BasicCaché Object Script & Caché Basic

MultiValueMultiValue

SO

AP

SO

AP

C+

+C

++

Java

Java

Per

lP

erl

Act

iveX

Act

iveX

Pyt

ho

nP

yth

on

Jalo

pen

oJa

lop

eno

.NE

T.N

ET

Сервер CachéСервер Caché

Объектная модель Объектная модель CachéCaché• Множественное наследованиеМножественное наследование

• АтрибутыАтрибуты

– ЛитералыЛитералы

– СсылкиСсылки

– КоллекцииКоллекции

– ПотокиПотоки

• МетодыМетоды

– Методы объектовМетоды объектов

– Методы классовМетоды классов

• Запросы на Запросы на SQLSQL

• Объекты Объекты CachéCaché в клиентском в клиентском приложенииприложении

– Создание, редактирование и Создание, редактирование и удаление объектов удаление объектов CachéCaché

– Запуск методов классов Запуск методов классов CachéCaché– Работа с запросами классов Работа с запросами классов

CachéCaché

• Объектная модель данныхОбъектная модель данных

• Бизнес логика в Бизнес логика в CachéCaché

• Нет необходимости Нет необходимости использовать реляционные использовать реляционные интерфейсы с ОО средством интерфейсы с ОО средством разработкиразработки

Объекты в Caché 5.1

Объектная модель Объектная модель CachéCaché• Множественное наследованиеМножественное наследование

• АтрибутыАтрибуты

– ЛитералыЛитералы

– СсылкиСсылки

– КоллекцииКоллекции

– ПотокиПотоки

• МетодыМетоды

– Методы объектовМетоды объектов

– Методы классовМетоды классов

• Запросы на Запросы на SQLSQL

Caché Object Factory

• ActiveX-ActiveX-компонент компонент CacheObject.FactoryCacheObject.Factory

• Объектная фабрикаОбъектная фабрика– Называется так, поскольку именно Называется так, поскольку именно

этот объект создает объекты классов этот объект создает объекты классов CachéCaché

– Эта же фабрика используется для Эта же фабрика используется для открытия объектов из БД и открытия объектов из БД и сохранения ихсохранения их

• Разработчик получает доступ ко всем Разработчик получает доступ ко всем свойствам и методам объектовсвойствам и методам объектов

Caché Objects : использование фабрики

Uses ComObj;Var Factory : Variant; Pers: Variant;procedure Start();Begin Factory := CreateOleObject( 'CachéObject.Factory'); Factory.Connect( 'cn_iptcp:127.0.0.1[1972]:Samples'); Pers := Factory.New(‘User.Person'); Pers.Name=‘Serguey’; Pers.sys_Save;End;

Web-сервисы

• Простой Простой Web-Web-сервиссервис

• Создан мастером Создан мастером Web-Web-сервисовсервисов

• Автоматически Автоматически на веб-сервере на веб-сервере помещается помещается WSDLWSDL -- описание описание

Class User.CacheServ Extends %SOAP.WebService [ProcedureBlock]{/// Название сервисаParameter SERVICENAME = "AplusB";/// URL для вызова вебсервисаParameter LOCATION = "http://localhost/csp/samples";/// AplusBMethodClassMethod AplusBMethod(a as %Integer, b as %Integer) As %String [ WebMethod ]{ Quit a+b}

http://Сервер/csp/приожение/класс.cls?WSDLhttp://Сервер/csp/приожение/класс.cls?WSDL

Генератор классов C++

• Новое расширение Новое расширение компилятора классов компилятора классов Caché, создающее Caché, создающее классы С++ (код и классы С++ (код и заголовочные файлы) заголовочные файлы) на основании классов, на основании классов, определенных в Caché определенных в Caché Class DictionaryClass Dictionary

• Является внешним по Является внешним по отношении к отношении к Caché Caché приложениемприложением

С++С++С++С++

ПроксиПроксиклассыклассы

CachéCachéCachéCaché

Библиотека Библиотека классовклассов

Библиотека Библиотека классовклассов

Библиотека Caché C++

• Новый набор классов C++, с помощью Новый набор классов C++, с помощью которого реализуется проекция классов которого реализуется проекция классов Caché Caché в классы в классы C++C++ с сохранением их с сохранением их функциональностифункциональности

• Поддерживаются среды разработкиПоддерживаются среды разработки

• MS VS 6.0MS VS 6.0

• MS VS 7.1MS VS 7.1

• Borland C++ Builder 6.0Borland C++ Builder 6.0

• ggссcc

• Нужно еще? Нужно еще? Свяжитесь с нами!Свяжитесь с нами!

Раннее связывание и динамические объектыd_ref<d_ref<UserUser__PersonPerson> > perper = = UserUser__PersonPerson::openid(&db,L"1");::openid(&db,L"1");

d_string name=d_string name=perper->getName();->getName();

d_string res=d_string res=perper->Method();->Method();

d_ref<Dyn_obj>d_ref<Dyn_obj>perper=NULL;=NULL;

const_name_t cl_name(L"const_name_t cl_name(L"UserUser..PersonPerson"); ");

perper = Dyn_obj::openid(&db, cl_name, L"1"); = Dyn_obj::openid(&db, cl_name, L"1");

d_ref<Dyn_obj> d_ref<Dyn_obj> perper = =

Dyn_obj::openref(Dyn_obj::openref(perper-->get_property(L“>get_property(L“NameName"), &db);"), &db);

D_type** args =(D_type**)db.get_arg_ptrs_buf();D_type** args =(D_type**)db.get_arg_ptrs_buf();

d_int arg1(1);d_int arg1(1); args[0]=&arg1;args[0]=&arg1;

d_string d_string resres((perper->run_obj_method(L“->run_obj_method(L“MethodMethod",args,1));",args,1));

• Стандартный подход для Стандартный подход для большинства разработчиковбольшинства разработчиков

• Удобство синтаксисаУдобство синтаксиса

• Работа непосредственно с Работа непосредственно с прокси-классамипрокси-классами

o Динамическое Динамическое определение определение типов данныхтипов данных

o Помогает Помогает более широко более широко использовать использовать наследованиенаследование

Использование Java

• BEA WebLogic8.1BEA WebLogic8.1

• JBoss4.0 3JBoss4.0 3

CachéCaché

Java BindingJava

BindingEJB

BindingEJB

Binding

• Генератор Генератор классовклассов

• Библиотека Библиотека прокси-классовпрокси-классов

• Объектный Объектный серверсервер

EJB в один момент

Автоматически создаетАвтоматически создает::

• Entity beanEntity bean

• Дескриптор установкиДескриптор установки

• Сценарий установкиСценарий установки

• Тестовое приложениеТестовое приложение

Автоматически создаетАвтоматически создает::

• Entity beanEntity bean

• Дескриптор установкиДескриптор установки

• Сценарий установкиСценарий установки

• Тестовое приложениеТестовое приложение

Пример работы с объектом Cachéиз Java

• Открываем объектОткрываем объект

person = (Sample.Person)Sample.Person._open(dbconnection, new person = (Sample.Person)Sample.Person._open(dbconnection, new Id(strID)Id(strID),3,3););

• Выводим свойства объектовВыводим свойства объектов

System.out.println("Name: " + person.getName());System.out.println("Name: " + person.getName());

• Изменяем свойстваИзменяем свойства

person.person.ssetetNameName("("SergueySerguey"); ");

• Сохраняем объект в БДСохраняем объект в БД

person._save();person._save();

• Закрываем объектЗакрываем объект

dbconnection.closeObject(person.getOref());dbconnection.closeObject(person.getOref());

person = null; person = null;

Perl Binding, Python Binding

•Используются специальные пакеты Используются специальные пакеты системных прокси-классовсистемных прокси-классов

–Соединение с серверомСоединение с сервером

–Фабрика объектовФабрика объектов

–Полная поддержка объектной Полная поддержка объектной модели модели CachéCaché

Пример для Python

• Создание соединения с серверомСоздание соединения с серверомconn = intersys.pythonbind.connection() conn = intersys.pythonbind.connection() conn.connect_now(url,user,password, None) conn.connect_now(url,user,password, None)

database = intersys.pythonbind.database(conn) database = intersys.pythonbind.database(conn)

• Создаем новый объектСоздаем новый объектperson = database.create_new("Sample.Person", None) person = database.create_new("Sample.Person", None)

• Работаем со свойствамиРаботаем со свойствамиperson.set("Name","Doe, Joe A") name = person.get("Name") person.set("Name","Doe, Joe A") name = person.get("Name")

• Выполняем методВыполняем методanswer = person.run_obj_method("Addition",[17,20]) answer = person.run_obj_method("Addition",[17,20])

• Сохраняем объектСохраняем объектperson.run_obj_method("%Save",[]) person.run_obj_method("%Save",[])

ADO.Net Managed Provider

C#, VBC#, VB..Net, …Net, …C#, VBC#, VB..Net, …Net, …

AD

OA

DO

.. Net

Net O

bjectO

bject

• Высокая скорость Высокая скорость работы в работы в объектном и объектном и реляционном реляционном представлении в представлении в рамках одного рамках одного приложенияприложения

• Visual Studio.Net Visual Studio.Net 20052005

““РоднаяРодная” .Net ” .Net связкасвязка

CachéCachéCachéCaché

Проецируем классы .Net

Windows

.NET Client.NET Client.NET Client.NET Client

Прокси-КлассыПрокси-Классы

ISC ClassBinderISC ClassBinder

CachéCaché

Определение класса

Определение класса

Исходный код

Исходный код

Клиент на любой платформе

• Самостоятельное приложение илиСамостоятельное приложение или инструмент инструмент Visual StudioVisual Studio

• Сгенерированный код напрямую Сгенерированный код напрямую используется приложением используется приложением .Net.Net

Использование Генератора классовИспользование Генератора классовИспользование Генератора классовИспользование Генератора классов

Мастер создания классов .Net

.Net приложение, создающее классы-проекции для

–С#

–C++

–VB.Net

Caché Managed Provider для .Net

Windows

.NET Framework.NET Framework.NET Framework.NET Framework

.NET приложение.NET приложение

КодКод

Caché / EnsembleCaché / Ensemble

Классы/ТаблицыКлассы/Таблицы

Managed Objects

Managed Objects

Сервер (любая платформа)

ADO.NETADO.NET

ObjectsObjects

SQLSQL

TCPTCP

Пример работы с объектом

Sample.Person person = Sample.Person.OpenId(CacheConnect, "1");

Console.WriteLine(“Значение свойств: \r\n "

+ person.Id() + ": "

+ person.Name

Пример SQL-запроса

string SQLtext = "SELECT * FROM Sample.Person WHERE ID = 1";

CacheCommand Command = new CacheCommand(SQLtext, CacheConnect);

CacheDataReader Reader = Command.ExecuteReader();

while (Reader.Read()) {

Console.WriteLine("Provider output: \r\n "

+ Reader[Reader.GetOrdinal("ID")] + ": "

+ Reader[Reader.GetOrdinal("Name")]);

};

Объекты и таблицы

CacheCommand CacheCommand cacheCommandcacheCommand = = User.User.PersonPerson.FindAll(cacheConnection); .FindAll(cacheConnection);

UserUserTable = new DataTable();Table = new DataTable();

UserUserTable.Load(Table.Load(cacheCommandcacheCommand.ExecuteReader()); .ExecuteReader());

UserDSUserDS.DataSource = .DataSource = UserUserTable;Table;

DropDrop.DisplayMember =.DisplayMember = "Name"; "Name";

DropDrop.ValueMember = "ID"; .ValueMember = "ID";

• В коде можно сочетать В коде можно сочетать объектный и реляционный объектный и реляционный подход в одном приложенииподход в одном приложении

Использование коллекций литералов и ссылок на объекты

CacheListOfStrings CacheListOfStrings colorscolors = = personperson.FavoriteColors.FavoriteColors

int row = 0;int row = 0;

foreach (string color in foreach (string color in colorscolors) {) {

Display.WriteLine(" Element #" + row++ + " = " + color);Display.WriteLine(" Element #" + row++ + " = " + color);

}}

//////Плюс стандартные методы обработки коллекций Плюс стандартные методы обработки коллекций CachéCaché

if (if (colorscolors.Count > 0) .Count > 0) colorscolors.RemoveAt(0);.RemoveAt(0);

colorscolors.Insert(0,"Blue");.Insert(0,"Blue");

colorscolors.Add("Green");.Add("Green");

Наследование и отношения

•Классы-проекции .Net соответствуют по структуре своим оригиналам в Caché. Работать с ними можно аналогичным образом:

CacheRelationshipObject CacheRelationshipObject colleaguescolleagues = = companycompany.Employees;.Employees;

foreach (Sample.Employee colleague in foreach (Sample.Employee colleague in colleaguescolleagues) {) {

Display.WriteLine("\t" + colleague.Name);Display.WriteLine("\t" + colleague.Name);

}}

В версии 5.2. - Jalapenо

•Java Object Schema ImportJava Object Schema Import

–Традиционно Традиционно Caché Caché предлагает предлагает механизмы по созданию прокси-механизмы по созданию прокси-классов из хранимых классов классов из хранимых классов CachéCaché. . Jalapeno Jalapeno обращает этот обращает этот механизм, позволяет создавать механизм, позволяет создавать классы классы Caché Caché из существующих из существующих описаний классов описаний классов Java.Java.

Что нам все это даст?!

•Простота проектирования и Простота проектирования и модернизации приложениймодернизации приложений

•Накопленный багаж ОО практик при Накопленный багаж ОО практик при разработке приложенийразработке приложений

•Единство моделей данных на Единство моделей данных на клиенте и на сервереклиенте и на сервере

Таким образом…

• Полноценная объектная модель на всех уровнях Полноценная объектная модель на всех уровнях разработкиразработки

• Объектные средства реализации бизнес логикиОбъектные средства реализации бизнес логики

• Широкие возможности по применению объектных Широкие возможности по применению объектных средств разработкисредств разработки

– .Net.Net– JavaJava– C++C++– DelphiDelphi– PerlPerl– PythonPython

• Возможность сочетать мощь объектного подхода со Возможность сочетать мощь объектного подхода со стандартным стандартным SQL-SQL-доступомдоступом

Возьмите у нас Возьмите у нас Caché 5.1Caché 5.1!!

Используем объекты Caché Бакулин Сергей

(sergey@intersystems.ru)

Recommended