Аннотация:
В этой статье дается обзор технологии "Extensible Storage Engine". Хотя технология опубликована немногим более года назад — новой её можно назвать только условно. Она использовалась при создании таких продуктов, как Active Directory и Exchange 2000, но до недавнего времени не была известна широкому кругу разработчиков. В узком же кругу тех, кто с ней сталкивался, она была известна под именем "JET Blue".
Кроме того, статья будет интересна желающим узнать, как организована работа СУБД на низком уровне.
Здравствуйте, Artour A. Bakiev, Вы писали:
AAB>Статья:
Большое спасибо за статью, было очень интересно почитать.
Я хотел добавить про SQLite. Мне известно как минимум две успешных коммерческих разрабоки (и готовящаяся к выходу третья) на ее основе. А также новый продукт от Google — Google Gear тоже использует SQLite. И мне почему-то кажется, что после того, как на SQLite обратил внимание Google, дела у них пойдут стремительно "в гору". Хотя и сейчас, на мой взгляд, всё в порядке.
Кстати, насколько я понял, в JET Blue нет возможности выполнять SQL запросы? Это я к тому, что заменять им уже используемые "легковесные" Firebird и SQLite будет весьма затратно.
Эх не работает, говорит что в esent.dll (которая у меня в C:\Windows\System32) нет функций типа JetBeginSessionA JetCreateDatabase. В SDK dll-ки вообще не было. Безбобразие.
Здравствуйте, Michael Rusakov, Вы писали:
MR>Кстати, насколько я понял, в JET Blue нет возможности выполнять SQL запросы? Это я к тому, что заменять им уже используемые "легковесные" Firebird и SQLite будет весьма затратно.
Совершенно верно. С помощью JET Blue невозможно выполнить SQL запрос (конечно, об этом следовало бы явно упомянуть в самой статье). Заменить один движок на другой будет не просто.
Здравствуйте, FractalizeR, Вы писали:
FR>Отличная статья, я только не понял, что такого Extensible в этом Storage Engine? Он и правда расширяемый? В каком плане?
Насколько я могу судить, слово "Extensible " в названии продукта — это скорее привлекающий внимание звучный термин, нежели описание каких-то особенностей данной технологии.
Здравствуйте, CatWarrior, Вы писали:
CW>Здравствуйте, Artour A. Bakiev, Вы писали:
CW>А где можно раздобыть esent.h и esent.lib ?
Думаю, проще всего получить эти файлы, установив один из последних SDK. Я не уверен, есть ли эти файлы в "Windows Server 2003 SP1 Platform SDK". Но они определённо поставляются с "Microsoft Platform SDK for Windows Server 2003 R2" (http://www.microsoft.com/downloads/details.aspx?FamilyID=0baf2b35-c656-4969-ace8-e4c0c0716adb&DisplayLang=en). Мicrosoft провёл очередную реорганизацию на своём сайте и потому в статье содержится неверная ссылка.
Здравствуйте, CatWarrior, Вы писали:
CW>Здравствуйте, CatWarrior, Вы писали:
CW>Эх не работает, говорит что в esent.dll (которая у меня в C:\Windows\System32) нет функций типа JetBeginSessionA JetCreateDatabase. В SDK dll-ки вообще не было. Безбобразие.
Определены ли директивы компилятора _UNICODE и UNICODE?
Здравствуйте, Artour Bakiev, Вы писали:
AB>Здравствуйте, CatWarrior, Вы писали:
CW>>Здравствуйте, CatWarrior, Вы писали:
CW>>Эх не работает, говорит что в esent.dll (которая у меня в C:\Windows\System32) нет функций типа JetBeginSessionA JetCreateDatabase. В SDK dll-ки вообще не было. Безбобразие.
AB>Определены ли директивы компилятора _UNICODE и UNICODE?
указал /UNICODE, добавил (#define UNICODE #define _UNICODE). Использую VS 2005. Ошибка осталась, появляется при запуске.
The procedure entry point JetBeginSessionA could not be located in the dinamic link library ESENT.dll
CW>указал /UNICODE, добавил (#define UNICODE #define _UNICODE). Использую VS 2005. Ошибка осталась, появляется при запуске.
CW>The procedure entry point JetBeginSessionA could not be located in the dinamic link library ESENT.dll
Вы не хотите эту dll посмотреть чем-нибудь вроде tdump из комплекта Delphi? Сразу будет ясно, что там есть и чего нету.
Re: Extensible Storage Engine
От:
Аноним
Дата:
27.07.07 07:32
Оценка:
Здравствуйте, Artour A. Bakiev.
Подскажите пожалуйста а что это за esentprf.dll, имееющаяся в комплекте Windows 2000? Уж названия больно похожи.
CW>>указал /UNICODE, добавил (#define UNICODE #define _UNICODE). Использую VS 2005. Ошибка осталась, появляется при запуске.
CW>>The procedure entry point JetBeginSessionA could not be located in the dinamic link library ESENT.dll
FR>Вы не хотите эту dll посмотреть чем-нибудь вроде tdump из комплекта Delphi? Сразу будет ясно, что там есть и чего нету.
Я смотрел утилитой Depends из VS 2005... там не экспортятся ф-ции с суффиксом "A" и "W" хотя в MSDN явно написано что реализация через эти методы...
Система Win XP Prof. SP2.
Здравствуйте, ZNick, Вы писали:
ZN>Здравствуйте, FractalizeR, Вы писали:
CW>>>указал /UNICODE, добавил (#define UNICODE #define _UNICODE). Использую VS 2005. Ошибка осталась, появляется при запуске.
CW>>>The procedure entry point JetBeginSessionA could not be located in the dinamic link library ESENT.dll
FR>>Вы не хотите эту dll посмотреть чем-нибудь вроде tdump из комплекта Delphi? Сразу будет ясно, что там есть и чего нету.
ZN>Я смотрел утилитой Depends из VS 2005... там не экспортятся ф-ции с суффиксом "A" и "W" хотя в MSDN явно написано что реализация через эти методы... ZN>Система Win XP Prof. SP2.
Перед
#include <esent.h>
нужно поставить
#define JET_VERSION 0x0501
Расшифровка из esent.h:
// JET_VERSION is similar to WINVER. It allows the most recent header to be used
// against older targets. Supported versions are:
// 0x0500 — Windows 2000
// 0x0501 — Windows XP
// 0x0502 — Windows 2003
// 0x0600 — Windows Vista
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Artour A. Bakiev.
А>Подскажите пожалуйста а что это за esentprf.dll, имееющаяся в комплекте Windows 2000? Уж названия больно похожи.
Честно говоря — не знаю — не встречался с таким файлом.
Название (а точнее, сочетание букв "prf" в названии) наводят на мысль, что это "ESE NT performance" — возможно, библиотека позволяет снимать показатели производительности для ESE движка, используя стандартный Performance Monitor.
Здравствуйте, Artour Bakiev, Вы писали:
AB>Здравствуйте, AndrejC, Вы писали:
AC>>Esli est' index iz neskol'kih kolonok (Long i Currency tipov) — kak pravil'no vyzvat' JetMakeKey neskol'ko raz? Izpol'zuja JetMakeKey i zatem JetSeek vsio vremia poluchaju oshibku: 1039 (JET_wrnSeekNotEqual), hotia i ispol'zuju JET_bitSeekGE
AB>Боюсь, я не смогу помочь, не видя исходного кода. Пришлите, пожалуйста, исходный код — я попробую помочь Вам.
Вот образец такого кода:
JET_ERR error;
long emptyCurrency = 0;
unsigned long emptyLong = 0;
unsigned long myID = 123;
error = JetSetCurrentIndex(sess_id, table_id, _T("index1"));
if (error)
throw new ApplicationException(error, JetErrorMessage(error));
// column1 is of type long
error = JetMakeKey(sess_id, table_id, &emptyLong, sizeof(emptyLong), JET_bitNewKey);
if (error)
throw new ApplicationException(error, JetErrorMessage(error));
// column2 is of type currency
error = JetMakeKey(sess_id, table_id, &emptyCurrency, sizeof(emptyCurrency), JET_bitNewKey);
if (error)
throw new ApplicationException(error, JetErrorMessage(error));
// column3 is of type long
error = JetMakeKey(sess_id, table_id, &emptyLong, sizeof(emptyLong), JET_bitNewKey);
if (error)
throw new ApplicationException(error, JetErrorMessage(error));
// column4 is of type long
error = JetMakeKey(sess_id, table_id, &myID, sizeof(emptyLong), JET_bitNewKey);
if (error)
throw new ApplicationException(error, JetErrorMessage(error));
index1 (создан не мною) состоит из 4 колонок (long и currency типов). Значения в первых 3-х колонках не интересуют при поиске, поетому выставлены в 0, а значение 4-ой сравнивается со значением переменной myID. Но совершенно непонятно понимает ли в таком случае Engine, что я устанавливаю значения для каждой колонки отдельно, т.к. я не вижу возможности указать порядковый номер колонки для етого (вызовы JetMakeKey).
Возможен ли вообще при таком индексе корректный результат поиска или нужно иметь специальный индекс, состоящий только из 4-ой колонки?
Буду очень благодарен за ответ здесь. Писал Вам отделжно на email, но может не получили.