VirSQL — СУБД для PHP

Небольшое введение

Однажды мне пришлось писать веб сайт, который стоял на хостинге, к которому провайдер не давал ни одной СУБД. Выход один — использовать обычные файлы (fwrite, fgets и.т.д.). Тогда я решил написать свою СУБД в виде PHP скрипта для создания и управления (поиска, выборки и сортировки) файловых реляционных БД. Проект получил гордое название VirSQL, хотя SQL он, конечно, не поддерживает и имеет некоторые недостатки, но тем не менее используется сейчас во всех моих проектах. Загрузить можно тут.

Ниже текст справки, написанный мною специально для Habrahabr.

Общие сведения

Описание продукта

VirSQL – это система управления реляционными базами данных, полностью написанная на PHP 5.4. Главным отличием VirSQL от других СУБД является способ сохранения данных. Все данные
хранятся в обычных текстовых файлах. Это обеспечивает максимальную скорость работы и кроссплатформенность.

Как уже отмечалось выше, система написана полностью на PHP, следовательно, она не требует установки и подходит практически к любому хостингу. Достаточно лишь отправить файл
«VirSQL.php» на сервер, подключить его к нужному PHP скрипту директивой «include()» (или аналогичной) и использовать функции управления базой данных.

Формат данных

VirSQL хранит данные в виде текстовых файлов с расширением «.vir». Каждая база данных состоит из одной или нескольких таблиц, для хранения каждой из которых выделяется
отдельный текстовый файл. Строки этих таблиц называются записями, а столбцы полями. У каждого поля есть свое уникальное внутри таблицы имя (идентификатор) состоящий из латинских
букв, цифр и знаков подчеркивания. Порядок следования полей жестко фиксирован. Количество, названия и порядок полей не могут быть изменены после создания таблицы. Число записей
может варьироваться, как и порядок их следования. В таблице могут отсутствовать записи, но должно быть хотя бы одно поле.

Работа с базой данной

Для работы с базой данных используется только одна функция «VirSQL()», которая принимает лишь один параметр – строку, содержащую команду базы данных. Функция возвращает
результат выполнения команды. Команда имеет следующий формат:

name par1 par2 par3…
Здесь name – название команды, а par1, par2, par3 и.т.д. параметры.

Число параметров варьируется в зависимости от используемой команды.

Создание таблицы

Работа с базой данных так или иначе начинается с создания таблицы. Для этого предназначена команда «ntable».

Синтаксис

ntable file field1 field2 field3…
Здесь file – имя файла создаваемой таблицы. Следует указать полное имя (с относительным или абсолютным путем и расширением). В качестве расширения рекомендуется использовать «*.vir».

field1, field2, field3 и.т.д. – названия (идентификаторы) полей создаваемой таблицы.

Команда возвращает «true» при успешном создании таблицы и «false» при возникновении ошибки.

Пример 1

ntable database/my_database.vir name surname email
Будет создана таблица «my_database.vir» в папке «database» с 3 полями: «name», «surname» и «email».

Пример 2

ntable 1.vir 1
Будет создана таблица «1.vir» с одним полем – «1».

Удаление таблицы

Для удаления таблицы достаточно просто удалить соответствующий ей файл. Однако, так же существует команда для удаления таблиц.

Синтаксис

dtable filename
Здесь filename — это полное имя файла для удаления (включая абсолютный или относительный путь).

Команда ничего не возвращает

Пример

dtable database/to_delete.vir
Команда удалит файл «to_delete.vir» из папки «database»

Выборка данных

Для работы с данными требуется их извлечь из таблицы. Для извлечения нескольких записей таблицы, удовлетворяющих некоторому условию служит команда select.

Синтаксис

select database fields filter sort
Здесь database — полное имя (с абсолютным или относительным путем), fields — перечень полей для выборки (через запятую), filter — перечень условий (через запятую), которым должны удовлетворять выбираемые записи, sort — принцип сортировки выбираемых записей
Команда возвращает двухуровневый массив, первый уровень которого (индексный) содержит все записи, выбранные из таблицы, а второй (ассоциативный) поля этих записей.

Примечание: если требуется включить в выборку абсолютно все поля, в качестве значения параметра fields требуется указать «all».

Условия выборки

Параметр filter содержит условия которым должны удовлетворять выбираемые записи. Каждое условие может быть одного из двух типов: точное или диапазон. Точное условие имеет следующий синтаксис:

field|value
Здесь field — поле, для которого применяется условие, а value — значение, которое должно иметь это поле у записи, чтобы эта запись была включена в выборку.

Условие-диапазон имеет иной синтаксис:

field|min|max
Здесь field — поле, к которому применяется условие, а min и max — минимальное и максимальное значение этого поля соответственно, при которых эта запись включается в выборку.

Примечание: поле, для которого указывается правило обязательно должно быть указано в параметре fields.

Если требуется включить абсолютно все записи таблицы в выборку, в качестве значения параметра filter следует указать «no».

Сортировка

По умолчанию записи в выборке идут в порядке их следования в таблице, который может варьироваться при изменении содержимого таблицы. Для выстраивания данных в каком-то определенном порядке используется параметр sort.

Параметр имеет следующий синтаксис:

field|type
Здесь field — поле, по значению которого будет выполняться сортировка, а type — тип сортировки («up» — по возрастанию, «down» — по убыванию).

Если сортировка не требуется следует указать «no», и тогда записи в выборке будут следовать в порядке по умолчанию. Если требуется сохранить порядок по умолчанию, но развернуть его (первая запись станет последней, последняя – первой, вторая – предпоследней, предпоследняя – второй и.т.д.), следует указать «reverse». Если же требуется выстроить записи в случайном порядке, следует указать «rand».

Примечание: поле, сортировку по которому Вы производите должно быть обязательно включено в параметр fields.

Пример 1

select db/1.vir all no no
Команда выбирает из таблицы «1.vir», хранящейся в папке «db» все записи и все поля и выстраивает их в порядке по умолчанию.

Пример 2

select 2.vir name,email,age age|25|30 name|up
Команда выбирает из таблицы «2.vir» поля «name», «email» и «age» записей, в которых значение поля «age» укладывается в диапазон от 25 до 30 и сортирует выборку в порядке возрастания значения поля «name».

Пример 3

select 3.vir name,age,sex age|35|50, sex|male rand
Команда выбирает из таблицы «3.vir» поля «name», «age» и «sex» записей, в которых значение поля «sex» — «male», а значение поля «age» в диапазоне от 35 до 50 и сортирует выборку в случайном порядке.

Удаление записи

Удаление одной записи таблицы осуществляется при помощи команды delete.

Синтаксис

delete filename field value
Команда ищет в таблице, полное имя которой — filename запись, у которой значение поля field равно value и удаляет ее. Если таких записей несколько, удаляется первая в таблице.

Пример

delete db.vir nickname Virous
Будет удалена запись в таблице «db.vir», у которой поле «nickname» равно «Virous». Если таких несколько – будет удалена первая.

Добавление записи

Добавление записей в таблицу осуществляется с помощью команды add.

Синтаксис

add filename field1 field2 field3…
Команда добавляет в таблицу, полное имя которой — filename запись, у которой значение первого поля — field1, второго — field2 и.т.д.

Пример

add db.vir Virous 1985 +79037299613 virous@mail.ru
В таблицу «db.vir» будет добавлена запись, первое поле которой равно – «Virous», второго – «1985», третьего – «+79037299613», четвертого – «virous@mail.ru».

Количество записей

Найти количество записей, удовлетворяющих тому или иному условию (условиям) можно с помощью команды add.

Синтаксис

count filename filter
Команда возвращает количество записей таблицы, полное имя которой — filename, удовлетворяющих условию filter.

Условия

Параметр filter содержит условия которым должны удовлетворять выбираемые записи. Каждое условие может быть одного из двух типов: точное или диапазон. Точное условие имеет следующий синтаксис:

field|value
Здесь field — поле, для которого применяется условие, а value — значение, которое должно иметь это поле у записи, чтобы эта запись была засчитана.

Условие-диапазон имеет иной синтаксис:

field|min|max
Здесь field — поле, к которому применяется условие, а min и max — минимальное и максимальное значение этого поля соответственно, при которых эта запись засчитывается.

Если требуется найти количество всех записей таблицы, в качестве значения параметра filter следует указать «no».

Пример

count db.vir age|25|30,sex|female
Команда находит количество записей таблицы «db.vir», у которых значение поля «sex» — female, а значение поля «age» в диапазоне от 25 до 30.

Максимальное значение

Для нахождения записи с максимальным значением того или иного поля используется команда getmax.

Синтаксис

getmax filename field
Команда находит и возвращает в виде ассоциативного массива запись в таблице, полное имя которой — filename, имеющую наибольшее значение поля field.

Пример

getmax vir.vir age
Команда находит и возвращает в виде ассоциативного массива запись таблицы «vir.vir» с наибольшим значением поля «age»

Редактирование записи

Для изменения записи таблицы служит команда edit.

Синтаксис

edit filename keyfield keyvalue field value
Команда ищет в таблице, полное имя которой — filename запись, у которой значение поля keyfield равно keyvalue и изменяет значение поля field на value.

Пример

edit database.vir nickname Virous email unknown
Команда заменяет значение поля «email» на «unknown» в записи, у которой значение поля «nickname» равно «Virous» в таблице «database.vir».

Получение записи

Получение в виде ассоциативного массива одной записи таблицы осуществляется при помощи команды get.

Синтаксис

get filename field value
Команда ищет в таблице, полное имя которой — filename запись, у которой значение поля field равно value и возвращает ее в виде ассоциативного массива. Если таких записей несколько, возвращается первая в таблице.

Пример

get db.vir nickname Virous
Будет возвращена запись в таблице «db.vir», у которой поле «nickname» равно «Virous». Если таких несколько – будет возвращена первая.

Надеюсь на Ваши отзывы и сведения об ошибках. Спасибо всем прочитавшим…

ссылка на оригинал статьи http://habrahabr.ru/post/165075/

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *