Интернет, компьютеры, софт и прочий Hi-Tech | |||
Избранные докиМетки (все метки)internet, it, интернет, интернет сеть, информационные технологии, ит, по, программное обеспечение, сайт, софт
Подписаться через RSS2Email.ru
Дополнительномониторы, движок, Битрикс, хостинг, сайты, мобильные, электроника, видеокарта, СКС, AXIS |
Загружаемые расширения SQLite
Начиная с версии 3.3.6 SQLite позволяет загружать новые функции SQL и сортирующие последовательности из разделяемых библиотек и DLL. Это означает, что вам больше ненужно перекомпилировать SQLite, чтобы добавлять в него новые функции и сортировки. Это новое экспериментальное API включает в себя функцию
Новый API доступен из командной строки с использованием команды
.load имя_файла ?точка_входа? Новое API может быть использовано также и из SQL с помощью функции
SELECT load_extension('имя_файла');
SELECT load_extension('имя_файла','точка_входа');
Здесь Точка входа должная быть функцией, соответствующей следующему прототипу: int sqlite3_extension_init( sqlite3 *db, /* Коннект к базе данных */ char **pzErrMsg, /* Сюда вписывается сообщение об ошибке */ const sqlite3_api_routines *pApi /* Методы API */ ); Параметр Соображения безопасностиНекоторые программы
позволяют пользователям вводить SQL-запросы, которые затем проверяются с помощью
int sqlite3_enable_load_extension(sqlite3 *db, int onoff); Параметр Пример расширенияСледующий код демонстрирует, как создавать загружаемое расширение: #include <sqlite3ext.h> SQLITE_EXTENSION_INIT1 /* ** SQL-функция half() возвращает половину от введённого значения. */ static void halfFunc( sqlite3_context *context, int argc, sqlite3_value **argv ){ sqlite3_result_double(context, 0.5*sqlite3_value_double(argv[0])); } /* SQLite выполняет эту программу только один раз в момент загрузки расширения. ** Можете создавать здесь новые функции, сортирующие последовательности и модули ** виртуальных таблиц. Обычно они экспортируются в разделяемую библиотеку. */ int sqlite3_extension_init( sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi ){ SQLITE_EXTENSION_INIT2(pApi) sqlite3_create_function(db, "half", 1, SQLITE_ANY, 0, halfFunc, 0, 0); return 0; } В приведённом выше примере зелёным цветом подсвечен тот код, который должен присутствовать в каждом загружаемом расширении. Код, подсвеченный синим цветом, реализует ваше расширение. В примере реализована единственная функция SQL, которая умножает введённый параметр на 0.5. Реальное загружаемое расширение может быть гораздо более полезным. Расширение вовсе не ограниченно созданием единственной функции или сортирующей последовательности. Мы думаем, что в общем случае расширения будут предоставлять множество пользовательских функций, сортирующих последовательностей и/или модулей виртуальных таблиц. Заметьте, что расширение использует заголовочный файл "sqlite3ext.h" вместо
"sqlite3.h". Это является важной особенностью. Динамически загружаемые
расширения должны всегда использовать "sqlite3ext.h", в то время как статически
линкуемые дополнения всегда используют "sqlite3.h". Если ваш код должен
использоваться как в статической линковке, так и в качестве динамически
загружаемого модуля, то необходимо использовать Символы Как собрать загружаемое расширение в разделяемую библиотекуВам нужен заголовочный файл Имя файла расширения может быть любым на
ваш выбор с традиционным расширением файла
Запуск из командной строкиSQLite version 3.3.17 Enter ".help" for instructions sqlite> .load half.sqlext sqlite> select half(7); 3.5 Чего хотелось быАвтоматическая загрузка расширений из разделяемых библиотек в момент открытия базы данных. Это было бы полезно для тех пользователей, которые используют не консольную программу, а только разделяемую библиотеку SQLite. Список разделяемых библиотек, которые должны быть загружены при открытии
данной базы данных, можно хранить в специальной таблице SQLite. Эти разделяемые
библиотеки расширений не должны иметь путей или суффиксов имен файлов
( Пользователь должен иметь возможность установить эти библиотеки таким
способом, как это предусмотрено в его ОС с использованием соответствующих
механизмов загрузки (PATH, LD_LIBRARY_PATH и т.п.). Соответственно суффикс имени
файла должен определяться при компиляции sqlite3 под конкретную платформу и
может быть Планируемая таблица может быть такой: create table sqlite_extensions (
load INT, -- Порядок, в котором должны загружаться/инициализироваться
-- расширения. Сопоставленные меньшим числам должны загружаться
-- первыми. Если эти числа равны, то загрузка происходит в
-- алфавитном порядке по имени.
name TEXT, -- Имя разделяемой библиотеки с расширением.
-- ЗАМЕЧАНИЕ: путь и суффикс НЕ включаются в имя.
init TEXT, -- Имя инициализирующей функции, входящей в разделяемую
-- библиотеку. Необязательное поле, может быть NULL. В последнем
-- случае функция точки входа должна быть сконструирована из
-- имени.
fini TEXT -- Имя функции - точки входа в разделяемой библиотеке для
-- выгрузки расширения. Расширения должны выгружаться в обратном
-- порядке к их загрузке. Необязательное поле, может быть NULL.
);
Перевод: Дмитрий Скоробогатов, 31.08.2011. Предыдущие публикации: Последнее редактирование: 2011-08-31 06:35:15 Метки материала: sqlite, загружаемые расширения, расширения sqlite, базы данных, ит, по, программа, программы, it, приложение, софт, программирование, software, soft, программное обеспечение, db, разработка по, информационные технологии, c, спо, программное обеспечение по 2 комментарияОставьте, пожалуйста, свой комментарий к публикации |
||
© 2007-2012, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.