Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

База данных на PHP с поддержкой индексирования (Юрий Насретдинов, оценка: 2)
Goto page 1, 2  Next
Author Message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Wed Dec 26, 2007 10:16 pm (написано за 6 секунд)
   Post subject: База данных на PHP с поддержкой индексирования
Reply with quote

У меня еще очень давно родилась идея написать на PHP базу данных так,чтобы она поддерживала язык запросов SQL, и могла быть заменителем базы MySQL на хостинге. Тогда я решил взять за основу существующий движок plain text базы и к нему написать парсер SQL.

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

Сейчас я решил опять заняться этим вопросом, но решил, что и "ядро" базы тоже будет написано мной, причем с поддержкой индексов. Сейчас я написал некоторую часть ядра, и у меня на данный момент поддерживается создание таблиц с auto_increment полями (такое поле возможно только одно и оно автоматически становится primary key) и числовыми unique key индексами.

Вопрос к аудитории номер 1: есть ли у кого-нибудь желание помочь мне с обработкой SQL-запросов? К сожалению, я пока что не предполагаю коммерческого применения базы, поэтому денег не обещаю.

Вопрос номер 2: интересно ли будет Вам использовать подобную базу данных в своих проектах?

База данных уже сейчас держит индексы, поэтому выборка по primary key или unique key даже из базы в 100 000 записей занимает порядка 0.04 сек при произвольном доступе и 0.005 сек, если данный кусок успел попасть в кэш.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Dec 26, 2007 10:33 pm (спустя 17 минут; написано за 20 секунд)
   Post subject:
Reply with quote

получится SmartyDB :)
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Dec 26, 2007 10:36 pm (спустя 2 минуты; написано за 56 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов
Идея очень симпатичная. Сейчас у меня загрузка очень большая, но чем смогу -- помогу.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Wed Dec 26, 2007 11:02 pm (спустя 25 минут; написано за 2 минуты 44 секунды)
   Post subject:
Reply with quote

Rumata wrote:
получится SmartyDB :)
SmartyDB -- это разве не просто «морда» к базе данных вроде MySQL?

WingedFox
Спасибо :). Когда ядро будет хоть в какой-то степени готово, я его выложу сюда (пока что у него уж очень серьёзные ограничения -- разрешено не более одного числового unique поля, select из базы возможен только с одним условием в where, и т.д.).
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Wed Dec 26, 2007 11:08 pm (спустя 6 минут; написано за 17 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов
SVN нужон?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Wed Dec 26, 2007 11:25 pm (спустя 16 минут; написано за 57 секунд)
   Post subject:
Reply with quote

WingedFox
Спасибо за предложение :). Давай
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Wed Dec 26, 2007 11:43 pm (спустя 18 минут; написано за 4 минуты 16 секунд)
   Post subject:
Reply with quote

Smarty - компилятор шаблонов, который преобразует набор инструкций, написанных на некотором псевдоязыке, в нормальные конструкции рнр
в данном случае я обыграл это определение

SmartyDB - компилятор запросов SQL в инструкции работы с файлами.
Ведь будет очень неразумно каждый раз разбирать регулярными выражениями сложные запросы.

А вообще идея красивая.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Wed Dec 26, 2007 11:59 pm (спустя 15 минут; написано за 1 минуту 13 секунд)
   Post subject:
Reply with quote

Rumata wrote:
Ведь будет очень неразумно каждый раз разбирать регулярными выражениями сложные запросы.
Неразумно, согласен...
Rumata wrote:
SmartyDB - компилятор запросов SQL в инструкции работы с файлами.
Можно немного подробнее про него? Единственное вразумительное, что я смог найти по поводу SmartyDB -- doc.quickdev.org/qddoc/HTMLSmartyConverter/SmartyDB/SmartyDB.html, это то?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Dec 27, 2007 12:27 am (спустя 28 минут; написано за 36 секунд)
   Post subject:
Reply with quote

Ну, если изначально добавить "шаблонизацию" запросов, то разобрать запрос регами надо будет только один раз =)
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Thu Dec 27, 2007 1:33 am (спустя 1 час 6 минут; написано за 1 минуту 10 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов wrote:
по поводу SmartyDB
вот не думал, что такое существует.
по прочтении первого поста у меня сразу возник ассоциативный ряд, который я уже описал
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Thu Dec 27, 2007 1:43 am (спустя 10 минут; написано за 1 минуту 43 секунды)
   Post subject:
Reply with quote

Rumata
Ясно :). А я пытался найти её...

P.S. Кстати, уже после того, как я начал писать свою базу, накопал интересный скрипт, который реализует почти все функции MySQL и даже поддерживает его синтаксис (см. вложение).

Я уж думал, что можно не писать свою базу, но, к сожалению, ни одной базы данных с поддержкой индексирования я так и не нашёл


ff-0.2c.zip
 Description:

Download
 Filename:  ff-0.2c.zip
 Filesize:  16.63 KB
 Downloaded:  773 Time(s)

Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Thu Dec 27, 2007 11:26 pm (спустя 21 час 42 минуты)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «Оффтоп»,
расположенную в форуме Разное :: PHP (27 Декабря 2007, 23:26).
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Thu Dec 27, 2007 11:51 pm (спустя 25 минут; написано за 6 минут 44 секунды)
   Post subject:
Reply with quote

Господа, я полагаю, тут есть небольшое недопонимание... Самое сложное в создании базы данных -- это всё-таки не распарсить SQL, хотя на PHP это тоже сложно. Основная идея была в том, что вообще создание шустрой базы данных на PHP, которая способна работать с сотнями тысяч записей -- это сложная и интересная идея.

Поэтому я и подчёркиваю всё время, что база данных с поддержкой индексов :). Причём PRIMARY INDEX, он же по совместительству AUTO INCREMENT поле, сделан по очень простой схеме -- просто в файлик table.pri в позиции 4*id записывается адрес начала записи в основном файле с данными table.dat, которая соответствует указанному id. Для PRIMARY KEY время доступа получается O(1). А для UNIQUE KEY используется бинарное дерево (пока что без балансировки), что даёт время O(log N) в случае, если поступающие данные достаточно случайны. Самый плохой случай будет, если поступающие данные идут, скажем, в порядке возрастания значений -- в таком случае время доступа будет O(N), что, в общем-то, не сильно отличается от просмотра всей таблицы целиком :).
Back to top
View user's profile Send private message Send e-mail
Валенок
Участник форума



Joined: 06 Apr 2006
Posts: 520
Карма: -3
   поощрить/наказать


PostPosted: Fri Dec 28, 2007 12:19 am (спустя 28 минут; написано за 10 секунд)
   Post subject:
Reply with quote

Юрий Насретдинов ага, спасибо что разъяснили..
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Fri Dec 28, 2007 3:03 am (спустя 2 часа 44 минуты; написано за 14 минут 36 секунд)
   Post subject:
Reply with quote

Итак, попробую описать текущую функциональность:
  1. создание таблицы (без проверки структуры) ( YNDb::create(...) ).
    В таблице обязательно должно присутствовать строго одно auto_increment поле, чтобы работал PRIMARY индекс. В противном случае возможны тормоза и глюки.
    Также опционально доступен один INDEX и один UNIQUE.
    Все индексированные поля поддерживают только тип INT.
  2. вставка в таблицу ( YNDb::insert(...) ), с автоматическим проставлением auto_increment значений и заполнением индексов. ВНИМАНИЕ! При нехватке места на диске, или подобных обстоятельствах, возможна порча структуры базы данных без возможности восстановления! Также возможно внесение неправильных записей в базу, что, впрочем, не должно приводить к полной неработоспособности базы (невозможно будет лишь далее добавлять данные и будет некорректно читаться последняя «битая» запись).
  3. выборка из базы ( YNDb::select(...) ) : произвольные столбцы (в том числе и "*"), произвольные значения LIMIT (не меньше нуля), сортировка строго по одному полю и строго одно WHERE условие (>, <, =, IN).
    Для WHERE условий применяется оптимизация с использованием индексов в следующих случаях (в скобках указаны операторы, для которых оптимизация прописана):

    PRIMARY KEY -- (>, =, IN)
    INDEX -- (=)
    UNIQUE -- (=).
По сути, это самый-самый минимум для базы (и даже меньше, должен признать), но при желании даже такую базу можно использовать. По поводу INDEX и UNIQUE -- индексы хорошо работают в случае, когда поступающие данные достаточно случайны! В противном случае (в случае упорядоченного поступления данных) эффективность индексов может значительно уменьшиться. Пока что средств вроде REPAIR TABLE нету, поэтому базу данных стоит применять только в случае, если у Вас на сервере нет перебоев с питанием и достаточно места на жёстком диске.

Посмотреть пример работы можно, запустив script/test.php: происходит автоматическое создание таблицы, вставка данных туда и выборка из таблицы.


db.rar
 Description:
папка .data -- папка с данными для базы
папка script -- скрипты, db.php -- сам класс базы, test.php -- тестирование базы

P.S. База требует PHP5, но от этого требования можно избавиться, удалив везде private и public, а также добавив пару var для свойс

Download
 Filename:  db.rar
 Filesize:  4.74 KB
 Downloaded:  730 Time(s)

Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Fri Dec 28, 2007 10:45 pm (спустя 19 часов 41 минуту; написано за 5 секунд)
   Post subject:
Reply with quote

Да, пожалуй, базе все-таки до минимума не хватает операций update и удаления записей :).
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Sun Dec 30, 2007 11:50 pm (спустя 2 дня 1 час 5 минут; написано за 4 минуты 19 секунд)
   Post subject:
Reply with quote

Добавил простейшую реализацию DELETE (и в таблице и в индексе просто остаются «дыры», которые при обходе пропускаются). Также описан синтаксис создания таблицы, теперь есть проверка структуры. На очереди операция UPDATE. После этого я буду думать над расширением возможностей SELECT :).

Проект доступен через SVN: svn.debugger.ru/repos/YNDb/trunk . За выданный SVN благодарю WingedFox :).

P.S. Как-то очень тихо и незаметно проект перевалил за 1000 строчек кода. При этом db.php весит 26 Кб :). Сама идея базы навеяна BerkleyDB, если я не ошибаюсь, в этой базе 100000 строк кода и нет поддержки SQL :).
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Mon Dec 31, 2007 4:58 am (спустя 5 часов 7 минут; написано за 1 минуту 33 секунды)
   Post subject:
Reply with quote

Юрий Насретдинов
Если есть какие задачи, описывай их тут. Сам я копаться в коде врядли буду, но что-то конкретное сделать могу. 8*)
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Dec 31, 2007 6:04 am (спустя 1 час 6 минут; написано за 3 секунды)
   Post subject:
Reply with quote

Для начала реализовать обработку запросов INSERT и CREATE TABLE на уровне MySQL 3 версии (3.23 по-моему). Все,что не поддерживается на уровне базы данных, нужно обрабатывать корректно (например, попытку добавления составного индекса нужно считать ошибкой, а, скажем, ключевое слово DELAYED для INSERT запросов, можно молча пропускать, и не считать ошибкой). Причем желательно такие места писать так, чтобы, когда соответствующая функциональность непосредственно в самом ядре базы появится, можно было легко модифицировать код обработки SQL запроса, чтобы он использовал встроенные средства базы.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Dec 31, 2007 6:13 am (спустя 8 минут; написано за 4 секунды)
   Post subject:
Reply with quote

И еще одна важная вещь, которую я забыл: обязательно (!) необходимо правильно обрабатывать строки: например 'ля-ля\' ля' должно рассматриваться именно как ля-ля' ля, но не как ля-ля\. Желательно при этом обойтись без посимвольного разбора (я думаю, можно использовать что-то вроде fgetcsv для этих целей).
Back to top
View user's profile Send private message Send e-mail
[S]
Guest





Карма: 386
   поощрить/наказать


PostPosted: Mon Dec 31, 2007 3:12 pm (спустя 8 часов 59 минут; написано за 5 минут 53 секунды)
   Post subject: Ответ на письмо Ю.Н.
Reply with quote

Ответ на письмо Ю.Н. (Ваша почта сваливается с ошибкой mail delivery failed). Ответ № 1.

Проект называется, если мне изменяет память, FFQL. s.cmsdev.ru/articles/8/
1. Уже нет. Проект умер давно. Это проект работал только с простыми запросам, с более сложными он не справляется. (Т.е. Врядли думаю что это станет заменой).
3. Желания - нет.
2. Я не против, используй.

Прочитал темку.
> Вопрос номер 2:
В своих проектах я бы точно не стал это использовать, т.к. по моим наблюдениям, PHP "нормально" работает c файлами менее 1М. При больших объемах, как вы там хотите, 100 000 записей - это... это я не знаю что будет тогда. В UNMS (s.cmsdev.ru) я использовал другой принцип - один файл - одна запись. Там есть некое подобие индексирования, т.е. если представляете структуру таблицы типа comments. Выбрать из такой "таблицы" все комментарии к определенной новости можно было действительно быстро (без просмотра всей "таблицы"). Но там реализовано по другому все, сделано как класс DB, причем каждый класс DB, для разного типа "таблиц", если интересно, то s.cmsdev.ru - Umbrella NMS. Но такой подход (одна запись - один файл) - это замена шила на мыло, т.к. PHP может создавать несколько файлов можно только при выключенном safe_mode. Изначально все проекты были расчитаны на "бедных буратин" (игровые кланы и т.п. коммунити), у которых нет денег на платный хостинг, и с расчетом на бесплатный с поддержкой PHP. А у большинства хостеров он включен. Даже не знаю что проще: найти PHP хостинг с выключенным safe_mode, или бесплатный хоситнг с MySQL. (наверное, второе). Другая причина - это то что хостинг сейчас очень дешевый, любой школьник может себе позволить. Т.к. что уже (теперь), я считаю, что такой проект - не найдет практического применения.

Мне какой-то то-ли немец, то-ли голландец тоже писал по этому поводу, что, дескать, он "почти" понимает как "мое творение" работает и хочет его "доработать". За смысл не ручаюсь, т.к. он прислал письмо на русском в машинном переводе =)
Если вы заинтересованы в сотруднечестве с ним, то попытаюсь найти письмо

Удачи.

Ответ номер 2.
Зовут того кента "Iain Staffell". Письмо не удалось найти, имя вспомнилось благодаря поднятым записям в блоге. также известно что у него есть аккаунт на sourceforge как-то так: istaffel, не помню...

P.S. Больше я в эту тему не вернусь.
Back to top
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Dec 31, 2007 3:50 pm (спустя 38 минут; написано за 6 минут 2 секунды)
   Post subject:
Reply with quote

Ну, в общем, смотрите как знаете. Мне понравилась идея обработки SQL запросов -- это, по-моему, единственная реализация с поддержкой JOIN'ов хоть в какой-то мере. То, что Ваш движок для работы с файлами никуда не годится (не масштабируется совершенно :) ), это несущественно. Раз люди пишут целые базы данных вроде BerkleyDB, в которых SQL нету, говорит о сложности реализации быстрой и масштабируемой базы :).

Я ещё у Вас не увидел обработки запятых в строках и обработки экранированных кавычек (я плохо смотрел?), и не очень аккуратную обработку имён таблиц в запросах :). Мне кажется, что можно попробовать продолжить те идеи, которые были заложены в Вашем проекте, и доделать до человеского состояния (с учётом того, что уже, в общем-то, оно работает)
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Dec 31, 2007 6:42 pm (спустя 2 часа 51 минуту; написано за 19 секунд)
   Post subject:
Reply with quote

Выложил описание API для тех методов, для которых синтаксис уже вряд ли будет меняться.
Back to top
View user's profile Send private message Send e-mail
deMone
Участник форума



Joined: 03 May 2004
Posts: 90
Карма: 6
   поощрить/наказать

Location: из России

PostPosted: Mon Jan 07, 2008 2:30 pm (спустя 6 дней 19 часов 47 минут; написано за 19 секунд)
   Post subject:
Reply with quote

Quote:
Добавил простейшую реализацию DELETE (и в таблице и в индексе просто остаются «дыры», которые при обходе пропускаются).
Скоро нужно будет делать VACUUM :)
Back to top
View user's profile Send private message Send e-mail
deMone
Участник форума



Joined: 03 May 2004
Posts: 90
Карма: 6
   поощрить/наказать

Location: из России

PostPosted: Mon Jan 07, 2008 2:39 pm (спустя 8 минут; написано за 14 секунд)
   Post subject:
Reply with quote

Попутно, вдруг поможет чем: sourceforge.net/projects/osqlp/
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Jan 07, 2008 7:46 pm (спустя 5 часов 7 минут; написано за 14 минут 17 секунд)
   Post subject:
Reply with quote

Написал частичную реализацию UPDATE (строки можно заменять на менее длинные, или такие же по длине, нельзя обновлять значения INDEX полей (это не касается UNIQUE)). В SVN эта версия ещё не выложена (я выложу, как только появится более-менее адекватная реализация UPDATE для INDEX полей).

Чтобы продемонстрировать, как работает моя база сейчас, я хочу показать свой же форум, в котором большАя часть переписана с использования SQL на нативный интерфейс базы (а именно: ЧПУ, листинг форумов, просмотр списков тем для каждого форума, просмотр самой темы, создание новой темы, добавление своего сообщения).

При этом, я в него экспортировал базу сообщений forum.dklab.ru (ноябрь 2007 года; база не содержит ничего, кроме сообщений и списка форумов -- всё это итак лежит в открытом доступе), и вы можете сами посмотреть, как оно работает с таким объемом базы. Хочу отметить следующее: база «тормозит» при большом количестве повторяющихся значений для INDEX полей, но в целом вы увидите, что выигрыш по сравнению с полным просмотром базы (60 Мб!!) очень большой.

Скачать саму базу можно отсюда: f.dolphin-php.org/files/yuac_forum.rar (15.39 Мб)
Модифицированный движок форума: f.dolphin-php.org/files/yuac_forum_engine.rar (115 Кб)

После того, как вы распакуете движок форума, откройте config.php и укажите вместо "K:\\YNDb\\yuac_forum" папку, в которую вы распаковали базу данных. После этого можете запускать форум: вы должны увидеть список форумов, как на forum.dklab.ru, иметь возможность просматривать форумы и темы, а также постить новые сообщения и темы (правда, всё от пользователя Guest, к сожалению).

Форумы с большим количеством тем (измеряемое тысячами) и темы с большим количеством сообщений работают довольно медленно. Это происходит из-за того, что при большом количестве одинаковых значений для INDEX поля происходит получение _всех_ записей из основной таблицы, которые соответствуют этому значению поля с INDEX (использование LIMIT не ускоряет работу с индексированными полями).
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Jan 07, 2008 7:46 pm (спустя 11 секунд; написано за 9 секунд)
   Post subject:
Reply with quote

deMone
Спасибо, посмотрю :)
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Jan 07, 2008 8:09 pm (спустя 22 минуты; написано за 10 секунд)
   Post subject:
Reply with quote

deMone
Если честно, мне кажется, что это совсем не то...
Back to top
View user's profile Send private message Send e-mail
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Sun Jan 13, 2008 12:42 pm (спустя 5 дней 16 часов 33 минуты; написано за 6 минут 33 секунды)
   Post subject:
Reply with quote

Юрий Насретдинов, если интересно, то немного повозившись с ff из svn'а мне удалось таки заставить его выполнить такое
Code (php): скопировать код в буфер обмена
<?php
  include "\workspace\ff\ff_conf.php";
  ff_connect();
  ff_select_db('db');
  ff_query("DROP TABLE IF EXISTS `darts_users`;");
ff_query("CREATE TABLE `darts_users` (
  `USER_ID` int(11) NOT NULL auto_increment,
  `user` varchar(50) NOT NULL default '',
  `password` varchar(50) default NULL,
  `email` varchar(255) default NULL,
  `realname` text,
  `age` int(11) default '0',
  PRIMARY KEY  (`USER_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
"
);
  ff_query("INSERT INTO `darts_users` VALUES (2, 'TEPKOM', 'qwerty', '', ', ,<br>,. 33-1', 0);");
  ff_query("INSERT INTO `darts_users` VALUES (4, 'test', 'qwerty', ' Somethere in the space', 'Somethere in the space', 0);");
  ff_query("INSERT INTO `darts_users` VALUES (5, 'test', 'test', '', '', 0);");
?>
Более содержательных тестов не проводилось, больно уж режут уже глаз всякие лишние глобальности ;-). однако база создалась и данные туда поместились... Понятно, не без глюков, но хоть без явных ошибок трансляции.
Вот набор патчей... Он касается, в основном исправления ошибок в самом ff и используемых им регулярках.
Code (any language): скопировать код в буфер обмена
Index: Z:/workspace/ff/ff_insert.php
===================================================================
--- Z:/workspace/ff/ff_insert.php        (revision 18)
+++ Z:/workspace/ff/ff_insert.php        (working copy)
@@ -64,7 +64,7 @@
                 $i = intval(key($db)) + $ci['auto_increment']['value'];
                 $values[$pk] = $i;
                 $GLOBALS['FF_LAST_INSERT_ID'] = $i;
-        }elseif($db[$i]) return ff_set_error(3, $i);
+        }elseif(isset($db[$i])) return ff_set_error(3, $i);
         $db[$i] = $values;
         return ff_set_m_table($t);
 }
Code (any language): скопировать код в буфер обмена
Index: Z:/workspace/ff/ff_create.php
===================================================================
--- Z:/workspace/ff/ff_create.php        (revision 18)
+++ Z:/workspace/ff/ff_create.php        (working copy)
@@ -62,7 +62,7 @@
         $Q = ff_q();
         $regexp = '/CREATE\s+TABLE\s+(IF\s+NOT\s+EXISTS\s+)?/si';
         preg_match($regexp, $query, $match);
-        $if_not_exists = (bool)$match[1];
+        $if_not_exists = isset($match[1])?(bool)$match[1]:false;
         $query = preg_replace($regexp, null, $query);
         preg_match("/($Q?)(\w+)\\1\s*\(\s*(.*)\s*\)/s", $query, $match);
         $t = $match[2];
@@ -72,8 +72,11 @@
         }
         $cols = ff_explode_gcg($match[3]);
         $type = 'INTEGER|(SMALL|TINY|MEDIUM|BIG)?INT|FLOAT|DOUBLE|REAL|DECIMAL|NUMERIC|DATE|TIME|DATETIME|TIMESTAMP|VARCHAR|CHAR|(TINY|MEDIUM|LONG)?(TEXT|BLOB)|ENUM|SET';
+        $primary_key=Array();
+        $columns=Array();
+        $types=Array();
         foreach($cols as $s){
-                if(!preg_match("/(\w+)\s+($type)\s*(\s*\((.*?)\))?/i", $s, $match)) continue;
+                if(!preg_match("/$Q?(\w+)$Q?\s+($type)\s*(\((.*?)\))?/i", $s, $match)) continue;
                 $types[] =  strtolower($match[2]);
                 $columns[] = $match[1];
                 $c = count($columns) - 1;
@@ -102,6 +105,7 @@
         return 1;
 }
 function ff_detect_primary_keys($columns, $query){
+        $Q = ff_q();
         preg_match("/PRIMARY\s+KEY\s*\(?$Q?(\w+)/si", $query, $match);
         $primary_key = array_search($match[1], $columns);
         return $primary_key;
Code (any language): скопировать код в буфер обмена
Index: Z:/workspace/ff/ff_core.php
===================================================================
--- Z:/workspace/ff/ff_core.php        (revision 18)
+++ Z:/workspace/ff/ff_core.php        (working copy)
@@ -55,7 +55,7 @@
 }
 function ff_connect($s = '.'){
         register_shutdown_function('ff_close');
-        global $FF_TABLES, $FF_M_TABLES, $FF_SERVER;
+        global $FF_TABLES, $FF_M_TABLES, $FF_SERVER, $FF_SERVER_PATH;
         if(!is_dir($FF_SERVER_PATH.$s)) return ff_set_error(502);
         $FF_SERVER = $s;
         $FF_TABLES = array();
Правда каким образом предполагается прикручивать все это к DB, я пока совершенно без никакого понятия ;-)
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Sun Jan 13, 2008 12:55 pm (спустя 13 минут; написано за 1 минуту 5 секунд)
   Post subject:
Reply with quote

Ksnk
В любом случае, спасибо за хоть какой-нибудь вклад в развитие проекта :)
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Jan 14, 2008 2:17 am (спустя 13 часов 21 минуту; написано за 3 минуты 32 секунды)
   Post subject:
Reply with quote

Юрий Насретдинов
Я согласен, что написать свою реализацию СУБД это здорово и интересно.
Но очень сомнительно, на мой взгляд, писать ее полностью на PHP.

Пока мне видится такая работа как проба собственных сил в весьма сложном проекте.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Mon Jan 14, 2008 10:31 am (спустя 8 часов 14 минут; написано за 4 секунды)
   Post subject:
Reply with quote

Да, мне хотелось (и хочется) попробовать свои силы в очень сложном проекте :). При этом ничего на Си я писать не планировал, ибо весь смысл в таком случае потеряется...
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Wed Jan 16, 2008 4:10 pm (спустя 2 дня 5 часов 38 минут; написано за 20 секунд)
   Post subject:
Reply with quote

Ну и вдобавок к предыдущему: у Oracle есть реализация BerkleyDB целиком на Java :). www.oracle.com/database/berkeley-db/je/index.html
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Sun Feb 24, 2008 10:45 pm (спустя 1 месяц 8 дней 6 часов 34 минуты; написано за 19 секунд)
   Post subject:
Reply with quote

случайно нашел сегодня xpoint.ru/forums/programming/theory_algorythms/thread/39763.xhtml
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Tue Feb 26, 2008 2:18 am (спустя 1 день 3 часа 32 минуты; написано за 54 секунды)
   Post subject:
Reply with quote

Rumata
Да, спасибо, я видел это... Проблема в том, что это написание парсера SQL не входит в мои планы.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Tue Sep 30, 2008 11:46 pm (спустя 7 месяцев 4 дня 21 час 28 минут; написано за 4 минуты 45 секунд)
   Post subject:
Reply with quote

В общем, проект, на самом деле, не совсем заброшен, но код действительно ужасен и требует переработки :).

Выкладываю версию с частично работающей функцией UPDATE, которую можно использовать, если у вас нету INDEX полей. Впрочем, почему-то UPDATE для UNIQUE полей тоже работает не совсем так, как ожидается (у меня она умудрялась находить данные и по старому и по новому ключам), так что лучше дождаться более стабильной версии :).

Протестировать работу базы Вы можете, создав папку data вместе с папкой со скриптом, и запустив тесты из test.php (для начала неплохо запустить CREATE [иначе будет выдаваться "File with table structure or with table data could not be read."], потом INSERT [иначе везде в качестве результатов вы будете видеть FALSE :)]).

Ни в коем случае не используйте эту версию ядра базы на production сервере и для хранения важных данных -- они могут быть утеряны! Скоро должна выйти версия, которая, по крайней мере, не портит индексы :).


YNDb-testing.zip
 Description:

Download
 Filename:  YNDb-testing.zip
 Filesize:  23.37 KB
 Downloaded:  683 Time(s)

Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Sat Oct 04, 2008 2:26 pm (спустя 3 дня 14 часов 40 минут; написано за 3 минуты 32 секунды)
   Post subject:
Reply with quote

Обновлённая версия, в которой должна работать операция UPDATE. Для индексированных и UNIQUE полей она реализована просто как удаление индекса, и последующее добавление нового. При этом индекс «засоряется», т.е. увеличивается в размерах, и начинает работать медленней. Оптимизация индекса будет предоставлена через некоторое.

Прошу тех, кому интересно, попробовать написать тест для этой базы, который проверяет корректность работы базы, в том числе и операции UPDATE. Примеры подобных тестов можете посмотреть в файле test.php. Также есть UNIT-тест, который длится примерно 5 минут и тестирует множество операций и проверяет целостность базы после каждого существенного запроса.


YNDb-testing.zip
 Description:
Следующая версия

Download
 Filename:  YNDb-testing.zip
 Filesize:  24.4 KB
 Downloaded:  647 Time(s)

Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Sat Oct 04, 2008 6:19 pm (спустя 3 часа 52 минуты; написано за 9 минут 41 секунду)
   Post subject:
Reply with quote

Как и в прошлый раз, я сделал экспорт базы этого форума на мой самописный форум, который был слегка модифицирован, чтобы использовать в качестве движка YNDb, мою базу :).

Исходные файлы моего форума [ядро базы уже включено в архив]:

m.forum.dklab.ru/files/yuac_forum.zip (~180 Кб)

Экспортированная база сообщений:

m.forum.dklab.ru/files/forum_data.zip (~15,4 Мб) -- распакуйте содержимое в папку forum_data относительно index.php форума

Мне не хотелось заниматься перекодировкой дампа БД, поэтому вместо русских букв там везде вопросики, но на суть это не влияет :).

На форуме работает добавление новых сообщений, создание тем, просмотр форумов и тем (некоторые форумы и темы не откроются из-за того, что импорт был произведен напрямую из MySQL, и не все особенности хранения сообщений и тем были учтены).

Скажем, эта тема будет доступна по адресу polygon/yuac_forum/php/heap/6932.html, где polygon/yuac_forum/ -- это домен и название папки, в которую установлен (громко сказано, на самом деле просто файлы скопированы ;)) форум. Можно заметить, что сообщения идут не по порядку :). Но если вы добавите сообщение в эту тему, оно будет вставлено не в середину, а в конец :). То, что сообщения идут не по порядку -- это лишь особенность импорта базы.
Back to top
View user's profile Send private message Send e-mail
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 195
   поощрить/наказать

Location: 007 495

PostPosted: Sat Oct 04, 2008 6:54 pm (спустя 34 минуты; написано за 1 минуту 5 секунд)
   Post subject:
Reply with quote

Если кому лень устанавливать форум себе, можете послать мне ЛС и я, скорее всего, пришлю вам ссылку на установленную версию форума, доступную из интернета.
Back to top
View user's profile Send private message Send e-mail
nerezus
Заглянувший



Joined: 09 Jan 2009
Posts: 5
Карма: -2
   поощрить/наказать


PostPosted: Fri Jan 09, 2009 11:05 pm (спустя 3 месяца 5 дней 4 часа 10 минут; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

Quote:
К сожалению, я пока что не предполагаю коммерческого применения базы, поэтому денег не обещаю.
Можно сделать хранимые процедуры, и на них написать интерпретатор пхп.
И на него портировать уже эту СУБД. С хранимыми процедурами. И на них тоже будет пхп.

А что, хорошая идея.

> интересно ли будет Вам использовать подобную базу данных в своих проектах?
Смысла нету. Совсем.
Если хочешь сделать пользу людям - то лучше sqlite доработал бы ;) Он это все может ;)
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML