Поддержка SQLite 3.0

Список разделов phpBBex 1.x (поддерживается) Пожелания 1.x

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

Сообщение #1 Борис Бердичевский » 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
Исправлена моя ошибка в последней правке.
Вложения
sqlite3.patch.zip
Патч SQLite 3.0+
(14.82 КБ) Скачиваний: 547
Последний раз редактировалось Борис Бердичевский 17.04.2013, 16:47, всего редактировалось 6 раз(а).
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #2 VEG » 28.03.2013, 12:31

Добро пожаловать :)
Вы можете оформить это дело в виде патча к phpBBex, например. В Mercurial делается командой:
Код: Выделить всё
hg diff > sqlite3.patch
Либо (если модификаций не очень много) можете использовать любой другой удобный вам формат.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #3 Борис Бердичевский » 28.03.2013, 15:10

Адаптировал для 1.6.0, вроде нет проблем.
Будем разбираться с Меркурием :biggrin:
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #4 VEG » 28.03.2013, 15:15

  • Для начала работы скачайте и установите подходящую версию TortoiseHg
  • Выполните команду для скачивания версии 1.6.0 из репозитория:
    Код: Выделить всё
    hg clone -r v1.6.0 https://code.google.com/p/phpbbex/ forum
  • В появившемся каталоге forum замените изменённые вами файлы и добавьте созданные вами файлы
  • Выполните команду (чтобы созданные вами файлы также учитывались):
    Код: Выделить всё
    hg add
  • Создайте патч командой:
    Код: Выделить всё
    hg diff > sqlite3.patch
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #5 Борис Бердичевский » 28.03.2013, 17:38

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

Добавлено спустя 8 минут 3 секунды:
А-а-а, всё ясно. Закоммитить я закоммитил, но push у меня не прошёл, я же не знаю пароль!
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #6 Борис Бердичевский » 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
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #7 Борис Бердичевский » 03.04.2013, 21:24

Я бы очень хотел, чтобы начали тестировать это важное дополнение.
У кого нет возможности установить этот вариант, могут тестировать на моём сервере:
http://www.borisba.com/phpBB3.k/index.php
Админ там tester
Пароль тот же.
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #8 VEG » 03.04.2013, 23:14

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

При беглом взгляде ошибочку заметил:
Код: Выделить всё
      $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
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #9 Борис Бердичевский » 04.04.2013, 01:48

Так вот ОК?

Код: Выделить всё
      // 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
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #10 Борис Бердичевский » 13.04.2013, 23:15

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

Просьба также удалить все вложения, кроме вложения в первом, стартовом моём сообщении.
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #11 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
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #12 Борис Бердичевский » 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 заждутся). И если будет, там всё равно будет море правок, так что аргумент "подождать" -- не серьёзно.

Добавлено спустя 8 минут 2 секунды:
VEG:Приведённым выше способом её установку можно свести к копированию одного файла.
Смеётесь? :biggrin:
Как автор МОДа утверждаю -- НЕТ. Кроме того, это МОД особый. Потребитель этого МОДа замучается при обновлении версий -- если МОД не будет имплантирован в версию. Я вот долгое время мучаюсь с обновлениями phpBB, каждый раз патч обновления нужно препарировать, вносить поддержку sqlite 3 и только потом запускать!
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #13 VEG » 15.04.2013, 18:32

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

Исходный вариант создаёт запись в таблице, а если запись с заданным ключом существует — она обновляет существующую:
Код: Выделить всё
      $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) . "'";

Ваш вариант (из патча в первом сообщении):
Код: Выделить всё
      $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).

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

Борис Бердичевский:Я вот долгое время мучаюсь с обновлениями 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
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #14 Борис Бердичевский » 15.04.2013, 18:37

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

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

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

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

Добавлено спустя 5 минут 1 секунду:
VEG:Нужно будет провести ряд тестов, чтобы оценить перспективы подобного «расширителя» SQLite со стороны PHP.
Расширение?
Это в phpBBex произведено "усечение" поддерживаемых типов БД. Если вы ратуете за кучу достоинств ex по сравнению со стандартным phpBB, то это "усечение" -- не самая верная идея. :wink:
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #15 VEG » 16.04.2013, 02:17

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

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

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

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

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

Борис Бердичевский:Это в phpBBex произведено "усечение" поддерживаемых типов БД. Если вы ратуете за кучу достоинств ex по сравнению со стандартным phpBB, то это "усечение" -- не самая верная идея. :wink:
Как я уже писал, отказ от поддержки непопулярных в мире PHP баз данных — это сознательное и обоснованное решение. Вообще поддержка различных БД кроме MySQL в PHP скриптах — это скорее приятное дополнение, чем весомое преимущество. Тот же WordPress всегда поддерживал только MySQL, но это не помешало ему стать самым популярным движком. Так уж сложилось, что PHP обычно используется вместе с MySQL, и это всюду поддерживается.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #16 Борис Бердичевский » 17.04.2013, 00:15

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

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

Добавлено спустя 4 минуты 47 секунд:
Ещё раз -- убедительная просьба удалить все мои вложения, кроме как из первого поста!
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет

Сообщение #17 VEG » 17.04.2013, 01:10

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

Борис Бердичевский:Ещё раз -- убедительная просьба удалить все мои вложения, кроме как из первого поста!
Удалил.
VEG M
Администратор
Аватара
Откуда: Finland
Репутация: 1653
С нами: 11 лет 11 месяцев

Сообщение #18 Борис Бердичевский » 17.04.2013, 09:43

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

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

Добавлено спустя 6 часов 44 минуты:
Найдена ошибка в моей поправке. Сейчас проверяю после её исправления.

Добавлено спустя 13 минут 32 секунды:
Сделано, исправлено! :hi:
Борис Бердичевский M
Автор темы
Аватара
Репутация: 11
С нами: 11 лет


Вернуться в Пожелания 1.x



cron