Emacs может быть скомпилирован со встроенной поддержкой доступа к базам данных SQLite. В этом разделе описываются средства, доступные для доступа к базам данных SQLite из программ на Lisp.
Эта функция возвращает не nil, если в данном сеансе Emacs доступна встроенная поддержка SQLite.
Когда поддержка SQLite доступна, можно использовать следующие функции.
Эта функция открывает file как файл базы данных SQLite. Если file не существует, будет создана новая база данных и сохранена в этом файле. Если file опущен или равен nil, вместо этого создаётся новая база данных в оперативной памяти.
Возвращаемое значение — объект базы данных, который можно использовать в качестве аргумента для большинства последующих функций, описанных ниже.
Этот предикат возвращает не nil, если object является объектом базы данных SQLite. Объект базы данных, возвращаемый функцией sqlite-open, удовлетворяет этому предикату.
Закрыть базу данных db. Обычно нет необходимости вызывать эту функцию явно — база данных будет автоматически закрыта при завершении работы Emacs или при сборке мусора объекта базы данных.
Выполнить SQL-statement. Например:
(sqlite-execute db "insert into foo values ('bar', 2)")
Если присутствует необязательный параметр values, он должен быть списком или вектором значений для привязки при выполнении оператора. Например:
(sqlite-execute db "insert into foo values (?, ?)" '("bar" 2))
Это даёт точно такой же эффект, как и предыдущий пример, но является более эффективным и безопасным (поскольку не включает разбор или интерполяцию строк).
sqlite-execute обычно возвращает количество затронутых строк. Например, оператор ‘insert’ обычно возвращает ‘1’, тогда как оператор ‘update’ может вернуть ноль или большее число. Однако при использовании SQL-операторов, таких как ‘insert into … returning …’ и им подобных, будут возвращены значения, указанные в ‘returning …’.
Строки в SQLite по умолчанию хранятся в кодировке utf-8, и выборка текстового столбца декодирует строку с использованием этой кодировки. Выборка столбца-двоичного объекта (blob) возвращает необработанные данные без какого-либо декодирования (т. е. возвращает однобайтовую строку, содержащую байты в том виде, в котором они хранятся в базе данных). Однако вставка двоичных данных в столбцы blob требует осторожности, поскольку sqlite-execute по умолчанию интерпретирует все строки как utf-8.
Поэтому если у вас есть, например, данные GIF в однобайтовой строке с именем gif, вы должны специально пометить их, чтобы сообщить об этом sqlite-execute:
(put-text-property 0 1 'coding-system 'binary gif) (sqlite-execute db "insert into foo values (?, ?)" (list gif 2))
Выполнить SQL-statements. statements — это строка, содержащая 0 или более SQL-операторов. Эта команда может быть полезна, когда программе на Lisp необходимо выполнить несколько операторов языка определения данных (DDL) за один раз.
Выбрать некоторые данные из db и вернуть их. Например:
(sqlite-select db "select * from foo where key = 2")
⇒ (("bar" 2))
Как и в случае с sqlite-execute, вы можете дополнительно передать список или вектор значений, которые будут привязаны перед выполнением выборки:
(sqlite-select db "select * from foo where key = ?" [2])
⇒ (("bar" 2))
Это обычно более эффективно и безопасно, чем метод, использованный в предыдущем примере.
По умолчанию эта функция возвращает список подходящих строк, где каждая строка является списком значений столбцов. Если return-type равен full, имена столбцов (в виде списка строк) будут возвращены как первый элемент возвращаемого значения.
Если return-type равен set, эта функция вместо этого возвращает объект оператора. Этот объект можно исследовать с помощью функций sqlite-next, sqlite-columns и sqlite-more-p. Если результирующий набор невелик, часто удобнее просто вернуть данные напрямую, но если результирующий набор велик (или если вы не будете использовать все данные из набора), использование метода set выделяет значительно меньше памяти и поэтому более эффективно с точки зрения памяти.
Эта функция возвращает следующую строку в результирующем наборе statement, обычно объекте, возвращённом sqlite-select.
(sqlite-next stmt)
⇒ ("bar" 2)
Эта функция возвращает имена столбцов результирующего набора statement, обычно объекта, возвращённого sqlite-select.
(sqlite-columns stmt)
⇒ ("name" "issue")
Этот предикат указывает, есть ли ещё данные для извлечения из результирующего набора statement, обычно объекта, возвращённого sqlite-select.
Если statement больше не будет использоваться, вызов этой функции освободит ресурсы, занятые statement. Обычно это не требуется — когда объект statement будет собран сборщиком мусора, Emacs автоматически освободит его ресурсы.
Начать транзакцию в db. Во время транзакции другие читатели базы данных не будут иметь доступа к результатам, пока транзакция не будет зафиксирована с помощью sqlite-commit.
Завершить транзакцию в db и записать данные в её файл.
Завершить транзакцию в db и отменить все изменения, внесённые транзакцией.
Подобно progn (см. Последовательное выполнение), но выполняет body с удерживаемой транзакцией и фиксирует транзакцию в конце, если body завершается нормально. Если body сигнализирует об ошибке или фиксация транзакции не удаётся, изменения в db, выполненные body, откатываются. Макрос возвращает значение body, если оно завершается нормально и фиксация успешна.
Выполнить pragma в db. Прагма обычно является командой, которая влияет на базу данных в целом, а не на какую-либо конкретную таблицу. Например, чтобы заставить SQLite автоматически собирать мусор (данные, которые больше не нужны), можно сказать:
(sqlite-pragma db "auto_vacuum = FULL")
Эта функция возвращает не nil в случае успеха и nil, если прагма завершилась ошибкой. Многие прагмы могут быть выполнены только тогда, когда база данных совершенно новая и пустая.
Загрузить расширение с именем module в базу данных db. Расширения обычно являются файлами разделяемых библиотек; в системах GNU и Unix они имеют расширение имени файла .so.
Возвращает строку, обозначающую версию используемой библиотеки SQLite.
Если вы хотите просмотреть содержимое файла SQLite, вы можете использовать команду sqlite-mode-open-file. Она переключит вас в буфер, использующий sqlite-mode, который позволяет просматривать (и изменять) содержимое базы данных SQLite.