Поддержка SQLite 3.0

Board index phpBBex 1.x Предложения и пожелания

Description: В phpBBex 1.x чего-то не хватает? Напишите об этом здесь, и мы постараемся исправиться.
Forum rules: Одна тема — один запрос новой возможности. Обязательно формируйте внятный заголовок, максимально отражающий суть вашей идеи. Также приведите примеры, где предлагаемая вами возможность будет актуальна.
Moderator: Поддержка

Post #1by Борис Бердичевский » 28.03.2013, 12:00

После некоторых усилий добавил свой МОД поддержки SQLite 3.0. Правда, проверял это на 1.5.3. Думаю, несложно будет адаптировать это и для 1.6.0.
Подскажите, как это добавить в систему, чтобы вы могли протестировать.

05.04.2013
Учитывая, что у меня нет возможности править сообщения, кроме данного, переношу именно сюда актуальный патч.

13.04.2013
Исправлена одна неточность, вложение заменено.

15.04.2013
Изменён патч, исправлена ошибка (старый код)

16.04.2013
Корректная замена sql запроса с ON DUPLICATE KEY UPDATE для SQLite 3.0+

17.04.2013
Исправлена моя ошибка в последней правке.
Attachments
sqlite3.patch.zip
Патч SQLite 3.0+
(14.82 KiB) Downloaded 331 times
Last edited by Борис Бердичевский on 17.04.2013, 16:47, edited 6 times in total.
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #2by VEG » 28.03.2013, 12:31

Добро пожаловать :)
Вы можете оформить это дело в виде патча к phpBBex, например. В Mercurial делается командой:
Code: Select all
hg diff > sqlite3.patch
Либо (если модификаций не очень много) можете использовать любой другой удобный вам формат.
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #3by Борис Бердичевский » 28.03.2013, 15:10

Адаптировал для 1.6.0, вроде нет проблем.
Будем разбираться с Меркурием :biggrin:
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #4by VEG » 28.03.2013, 15:15

  • Для начала работы скачайте и установите подходящую версию TortoiseHg
  • Выполните команду для скачивания версии 1.6.0 из репозитория:
    Code: Select all
    hg clone -r v1.6.0 https://code.google.com/p/phpbbex/ forum
  • В появившемся каталоге forum замените изменённые вами файлы и добавьте созданные вами файлы
  • Выполните команду (чтобы созданные вами файлы также учитывались):
    Code: Select all
    hg add
  • Создайте патч командой:
    Code: Select all
    hg diff > sqlite3.patch
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #5by Борис Бердичевский » 28.03.2013, 17:38

Я уже закоммитил под тагом v1.6.0-sqlite
Получил я и патч -- добавляю его в аттач.

Added after 8 minutes 3 seconds:
А-а-а, всё ясно. Закоммитить я закоммитил, но push у меня не прошёл, я же не знаю пароль!
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #6by Борис Бердичевский » 28.03.2013, 17:50

Это для справки список изменённых/добавленных файлов.

  • docs\INSTALL.html
  • includes\acp\acp_profile.php
  • includes\acp\acp_database.php
  • includes\db\db_tools.php
  • includes\functions_admin.php
  • includes\functions_install.php
  • includes\session.php
  • language\en\install.php
  • language\ru\install.php
  • includes\db\sqlite_3.php
  • install_forum\schemas\sqlite_3_schema.sql
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #7by Борис Бердичевский » 03.04.2013, 21:24

Я бы очень хотел, чтобы начали тестировать это важное дополнение.
У кого нет возможности установить этот вариант, могут тестировать на моём сервере:
http://www.borisba.com/phpBB3.k/index.php
Админ там tester
Пароль тот же.
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #8by VEG » 03.04.2013, 23:14

К сожалению, phpBBex 1.6.0 только вышел, и я сейчас переключился на другие задачи. Ваш код изучу позднее.
Вы сгенерировали патч-файл отмены ваших изменений (там вместо + всюду - и наоборот).

При беглом взгляде ошибочку заметил:
Code: Select all
      $sql_ary = array(
         'created'         => (int) time(),
         'last_visit'      => (int) time(),
         'visits'         => (int) visits + 1,
         'agent'            => (string) $db->sql_escape($agent),
         'last_ip'         => (string) $db->sql_escape($this->ip),
      );

      $sql = "UPDATE " . USER_BROWSER_IDS_TABLE
            . " SET " . $db->sql_build_array('UPDATE', $sql_ary)
            . " WHERE browser_id='" . $db->sql_escape($browser_id)
            . "' OR user_id='" . $db->sql_escape($user_id) . "'";
(int) visits + 1 не будет вычислено, ибо в коде нет константы visits.
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #9by Борис Бердичевский » 04.04.2013, 01:48

Так вот ОК?

Code: Select all
      // Update stats
      $sql_ary = array(
         'created'         => (int) time(),
         'last_visit'      => (int) time(),
         'agent'            => (string) $db->sql_escape($agent),
         'last_ip'         => (string) $db->sql_escape($this->ip),
      );

      $sql = "UPDATE " . USER_BROWSER_IDS_TABLE
            . " SET " . $db->sql_build_array('UPDATE', $sql_ary)
            . ", visits = visits + 1"
            . " WHERE browser_id='" . $db->sql_escape($browser_id)
            . "' OR user_id='" . $db->sql_escape($user_id) . "'";
      $db->sql_query($sql);

Завтра размещу корректные патчи.
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #10by Борис Бердичевский » 13.04.2013, 23:15

Исправил одну неточность в коде.
Как насчёт проверки и включения в репозиторий?

Просьба также удалить все вложения, кроме вложения в первом, стартовом моём сообщении.
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #11by VEG » 15.04.2013, 13:10

Момент с UNIX_TIMESTAMP я исправил. Что касается поддержки SQLite 3. На сколько я вижу, можно было обойтись меньшими правками, просто обновив существующий код для поддержки SQLite 2 до SQLite 3. Всё равно этот код не используется. То есть вместо sqlite_3 вы можете использовать идентификатор sqlite, что позволит не добавлять новый код и новой работы интерпретатору PHP.

Таким образом, в принципе можно добавить поддержку SQLite 3 в phpBBex 1.x. Но дело в том, что сейчас для phpBBex 2.x разрабатывается новый современный слой доступа к БД. По планам он будет поддерживать только MySQL и PHP 5.3+, а текущий слой будет объявлен устаревшим (останется только в целях совместимости).

По этой причине я не знаю, стоит ли сейчас добавлять поддержку новой БД по умолчанию, чтобы потом её лишиться. Может быть, стоит оставить эту модификацию опциональной. Приведённым выше способом её установку можно свести к копированию одного файла. Если найдутся ещё какие-то проблемы совместимости как с UNIX_TIMESTAMP — их можно решить прямо в коде phpBBex, чтобы упростить установку. Кто пожелает запускать phpBBex 1.x на роутере — сможет это сделать.
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #12by Борис Бердичевский » 15.04.2013, 16:00

VEG,
во-первых, исправление UNIX_TIMESTAMP недостаточно. Нужно ещё не использовать вариант "INSERT INTO" -- "ON DUPLICATE KEY UPDATE", это в SQLite не поддерживается. Этот вариант у меня заменен эквивалентным, стандартным, везде в phpBB используемым -- "SET" -- "WHERE".
Во-вторых, у меня поддержка в варианте с PDO, а это только начиная с php 5.3. Это современный код, и именно на его базе делается phpBB 3.1, см. сюда http://tracker.phpbb.com/browse/PHPBB3-9728
Насчёт sqlite_3 -- делал это в своё время, стремясь не трогать существующую поддержку sqlite, который 2. Не хотел бы это менять, поскольку я это использую в phpBB без ex, на действующем форуме.
Переход на версию 3.1 будет нескоро (и значит потенциальные юзеры sqlite заждутся). И если будет, там всё равно будет море правок, так что аргумент "подождать" -- не серьёзно.

Added after 8 minutes 2 seconds:
VEG wrote:Приведённым выше способом её установку можно свести к копированию одного файла.
Смеётесь? :biggrin:
Как автор МОДа утверждаю -- НЕТ. Кроме того, это МОД особый. Потребитель этого МОДа замучается при обновлении версий -- если МОД не будет имплантирован в версию. Я вот долгое время мучаюсь с обновлениями phpBB, каждый раз патч обновления нужно препарировать, вносить поддержку sqlite 3 и только потом запускать!
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #13by VEG » 15.04.2013, 18:32

Борис Бердичевский wrote:Этот вариант у меня заменен эквивалентным, стандартным, везде в phpBB используемым -- "SET" -- "WHERE".

Исходный вариант создаёт запись в таблице, а если запись с заданным ключом существует — она обновляет существующую:
Code: Select all
      $sql = "INSERT INTO " . USER_BROWSER_IDS_TABLE . "
         SET browser_id='" . $db->sql_escape($browser_id) . "', user_id='" . $db->sql_escape($user_id) . "',
            created=UNIX_TIMESTAMP(), last_visit=UNIX_TIMESTAMP(), visits=1,
            agent = '" . $db->sql_escape($agent) . "', last_ip = '" . $db->sql_escape($this->ip) . "'
         ON DUPLICATE KEY UPDATE last_visit=UNIX_TIMESTAMP(), visits=visits+1,
            agent = '" . $db->sql_escape($agent) . "', last_ip = '" . $db->sql_escape($this->ip) . "'";

Ваш вариант (из патча в первом сообщении):
Code: Select all
      $sql_ary = array(
         'created'         => (int) time(),
         'last_visit'      => (int) time(),
         'visits'         => (int) visits + 1,
         'agent'            => (string) $db->sql_escape($agent),
         'last_ip'         => (string) $db->sql_escape($this->ip),
      );

      $sql = "UPDATE " . USER_BROWSER_IDS_TABLE
            . " SET " . $db->sql_build_array('UPDATE', $sql_ary)
            . " WHERE browser_id='" . $db->sql_escape($browser_id)
            . "' OR user_id='" . $db->sql_escape($user_id) . "'";

Здесь опять используется явно нерабочее (int) visits + 1, плюс ваш код вообще никогда не создаёт записи в таблице USER_BROWSER_IDS_TABLE — он их только обновляет. То есть смысл этого кода полностью нарушен и он не выполняет никакой полезной работы. Без ON DUPLICATE KEY UPDATE здесь нужно писать два или даже три запроса (проверка — есть ли запись, и если есть — UPDATE, если нет — INSERT).

Борис Бердичевский wrote:Как автор МОДа утверждаю -- НЕТ.
На сколько я вижу, если бы вы использовали идентификатор sqlite вместо sqlite_3 — как минимум половины правок можно было бы избежать. Сами посмотрите на свой патч. Половина правок — это добавление case 'sqlite_3' там, где уже есть case 'sqlite'.

Борис Бердичевский wrote:Я вот долгое время мучаюсь с обновлениями phpBB, каждый раз патч обновления нужно препарировать, вносить поддержку sqlite 3 и только потом запускать!
Дело в том, что в случае встроенной поддержки SQLite, вся работа по тестированию и поддержке этой БД ляжет на разработчика phpBBex. Я потому и отказался от поддержки посторонних и используемых редко баз данных, чтобы не тратить на это время.

Вы предлагаете код для встраивания, который судя по всему тестировали только поверхностно. Первый попавшийся проблемный момент с UNIX_TIMESTAMP() и ON DUPLICATE KEY UPDATE не был протестирован на предмет работоспособности. То есть чтобы включить этот код, нужно начинать полномасштабное тестирование всех запросов, которые были добавлены или изменены в phpBBex за всё время, и двойное тестирование всех будущих изменений в phpBBex. К сожалению, я к этому не готов. Внешней видимости «всё ок» как в примере с запросом выше недостаточно. Оно только делает вид, что работает, а на самом деле работает не так как нужно.

Изначально я думал, что SQLite хорошо поддерживает расширения MySQL. Но судя по отсутствию популярной конструкции ON DUPLICATE KEY UPDATE — если совместимость и есть, то она достаточно формальна, и находится в пределах чистого SQL без расширений.

MySQL есть на всех хостингах. Случаи, когда нужна поддержка SQLite на мой взгляд надуманны. Запускать форум на роутере (что приводилось в пример на phpbbguru.net) — это из разряда «сделать по приколу», серьёзно никто этим заниматься не будет. А во всех остальных случаях, даже для небольшого форума, на всех хостингах есть MySQL. Если же вы запускаете форум на локальной машине — совершенно не проблема запустить MySQL Server в качестве сервиса. У меня он постоянно запущен, и не глядя на слабую машину — никакой ощутимой нагрузки не создаёт. В состоянии покоя расходует около 12 мегабайт оперативной памяти, что по современным меркам — ничто. Даже Skype — и тот отжирает 140 мегабайт :)

Это основная причина того, почему поддержка SQLite не является приоритетной. Если быть точным, то SQLite годится только для маленьких форумов. База данных в виде файла удобнее для начинающего администратора. Но как только форум начнёт расти — его всё равно придётся переносить на MySQL. Так почему бы сразу не делать на MySQL? Ведь маленькие форумы на MySQL работают как минимум не хуже :)

Впрочем, для нового слоя доступа есть определённые идеи, которые, возможно, позволили бы добавить к SQLite недостающие возможности. Я не уверен насчёт производительности подобного «расширения». Нужно будет провести ряд тестов, чтобы оценить перспективы подобного «расширителя» SQLite со стороны PHP.
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #14by Борис Бердичевский » 15.04.2013, 18:37

VEG wrote:сейчас для phpBBex 2.x разрабатывается новый современный слой доступа к БД. По планам он будет поддерживать только MySQL и PHP 5.3+,
Я здесь напутал, думал, что речь идёт о phpBB 3.1. И что это такое, можно подробнее?
И почему только MySQL ? (Уже сейчас -- только MySQL). И как это связано с SQLite?..

Added after 3 minutes 44 seconds:
У-у-упс, не знаю, как это старый код попал в обновлённый патч... :eek:
Конечно, исправлю!
Остальное -- чуть позже.

Added after 2 hours 9 minutes:
Так, патч я исправил.
VEG wrote:Вы предлагаете код для встраивания, который судя по всему тестировали только поверхностно. Первый попавшийся проблемный момент с UNIX_TIMESTAMP() и ON DUPLICATE KEY UPDATE не был протестирован на предмет работоспособности.
А что там тестировать? Вариант ON DUPLICATE KEY UPDATE просто не работает в sqlite, так что тестировать нечего.

VEG wrote:Но судя по отсутствию популярной конструкции ON DUPLICATE KEY UPDATE
А в чём проблема-то? Конструкция эта вполне заменяема эквивалентом, что я и сделал.

Added after 5 minutes 1 second:
VEG wrote:Нужно будет провести ряд тестов, чтобы оценить перспективы подобного «расширителя» SQLite со стороны PHP.
Расширение?
Это в phpBBex произведено "усечение" поддерживаемых типов БД. Если вы ратуете за кучу достоинств ex по сравнению со стандартным phpBB, то это "усечение" -- не самая верная идея. :wink:
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #15by VEG » 16.04.2013, 02:17

Борис Бердичевский wrote:И что это такое, можно подробнее?
Просто новый и современный слой доступа. В phpBB 3 ядро написано в стиле десятилетней давности. И в 3.1 мало что изменилось. В phpBBex планируются серьёзные обновления базовых подсистем движка.

Борис Бердичевский wrote:И почему только MySQL ?
Я уже описал выше, почему достаточно поддержки одного MySQL. Написание кода только под одну БД позволяет задействовать все её возможности и лучше оптимизировать код. Также это позволяет сократить время тестирования.

Борис Бердичевский wrote:Конструкция эта вполне заменяема эквивалентом, что я и сделал.
Прочитайте моё предыдущее сообщение. Ваша конструкция никогда не вставляет новых записей, как следствие — ей нечего обновлять. А поскольку обновлять нечего, в результате функция вообще ничего не делает. Рекомендую изучить документацию по INSERT ... ON DUPLICATE KEY UPDATE. Эту конструкцию нельзя сэмулировать одним запросом. Нужно минимум два: INSERT и UPDATE.

Борис Бердичевский wrote:Расширение?
Расширение на C++ для PHP конечно же было бы самым крутым вариантом. Но для большинства пользователей это поставит крест на движке — вряд ли кто-то захочет разбираться со сборкой и установкой расширений PHP, плюс не везде вообще это возможно. Есть кое-какие идеи, как можно было бы попробовать без значительных потерь в производительности сделать небольшое расширение синтаксиса SQL в SQLite немного необычной обёрткой на PHP.

Если тесты покажут, что такое решение не накладывает ощутимых накладных расходов, то вполне возможно, что в новый слой доступа всё-таки будет заложена поддержка нескольких типов баз данных.

Борис Бердичевский wrote:Это в phpBBex произведено "усечение" поддерживаемых типов БД. Если вы ратуете за кучу достоинств ex по сравнению со стандартным phpBB, то это "усечение" -- не самая верная идея. :wink:
Как я уже писал, отказ от поддержки непопулярных в мире PHP баз данных — это сознательное и обоснованное решение. Вообще поддержка различных БД кроме MySQL в PHP скриптах — это скорее приятное дополнение, чем весомое преимущество. Тот же WordPress всегда поддерживал только MySQL, но это не помешало ему стать самым популярным движком. Так уж сложилось, что PHP обычно используется вместе с MySQL, и это всюду поддерживается.
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #16by Борис Бердичевский » 17.04.2013, 00:15

Насчёт нужности поддержки SQLite 3.0 больше не буду спорить, Только отмечу, что никаких расширений C++ в php это уже не требует, начиная с 5.3 это поддерживается автоматически. Только флаг в "php.ini" нужно взвести.
Насчёт ON DUPLICATE KEY UPDATE -- я нашёл, как это делается в SQLite 3.0, добавляю в патч эту правку.

Added after 13 minutes 31 second:
И насчёт "непопулярности" SQLite 3.0+
Я бы не стал так категорично утверждать об уровне её популярности. :biggrin:
SQLite весьма интенсивно развивается, и значит она популярна!

Added after 4 minutes 47 seconds:
Ещё раз -- убедительная просьба удалить все мои вложения, кроме как из первого поста!
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months

Post #17by VEG » 17.04.2013, 01:10

Борис Бердичевский wrote:Только отмечу, что никаких расширений C++ в php это уже не требует, начиная с 5.3 это поддерживается автоматически.
Речь о том, чтобы добавить в слой доступа к SQLite поддержку конструкций, которые он не понимает. То есть тот же ON DUPLICATE KEY UPDATE.

Борис Бердичевский wrote:Ещё раз -- убедительная просьба удалить все мои вложения, кроме как из первого поста!
Удалил.
С наилучшими пожеланиями, Евгений
VEG M
Администратор
Avatar
Age: 32
Location: Минск, Беларусь
Reputation: 1576
With us: 7 years 6 months

Post #18by Борис Бердичевский » 17.04.2013, 09:43

VEG wrote:Речь о том, чтобы добавить в слой доступа к SQLite поддержку конструкций, которые он не понимает. То есть тот же ON DUPLICATE KEY UPDATE.
А зачем, когда есть аналог на базе SQL запроса?
Просто унифицировать SQL запросы и в коде "db_tools.php" или "sqlite_3.php" транслировать их.
Спасибо за выполнение просьбы, теперь будет только правильный и последний патч доступен!

Added after 7 minutes 12 seconds:
Дв, конечно, при переделке подсистемы движка для исполнения действий с БД желательно в результате ислючить все варианты case 'sqlite_3' и подобное -- во всех местах в коде.
Тогда действительно достаточно будет добавить 2 файла: sqlite_3.php и sqlite_3_schema.sql. И коды для показа перечня доступных БД при инсталляции должны быть гибкими.

Added after 6 hours 44 minutes:
Найдена ошибка в моей поправке. Сейчас проверяю после её исправления.

Added after 13 minutes 32 seconds:
Сделано, исправлено! :hi:
Борис Бердичевский M
Topic author, Бывалый
Avatar
Age: 61
Reputation: 11
With us: 6 years 7 months


Return to Предложения и пожелания