PHP, SQLite и регистронезависимость | Erinome Lane
Несмотря на объявленную поддержку UTF, встраиваемая СУБД SQLite3 по умолчанию не умеет делать регистронезависимую сортировку, сравнение и операции по преобразованию строк над буквами, не входящими в английский алфавит. Для решения этой проблемы разработчики SQLite рекомендуют использовать расширение ICU, с подключением которого станет возможным выбирать различные кодировки и иметь возможность пользоваться регистронезависимыми операциями сравнения любых символов кроме латиницы. Вот только описаний, как это сделать для php-mod-sqlite3, найти толком нельзя, да и объем ICU превышает размер самой библиотеки SQLite! Для embedded-применений – например, в OpenWrt – такое не годится.
Давным-давно, в далекой-далекой галактике… оказалось, что много лет назад некий товарищ по имени ioannis в рамках решения означенной проблемы создал небольшое расширение SQLite, по сути представляющее собой урезанную версию ICU, из которой был выброшен код, который в 95% случаев никогда не потребуется. Таким образом удалось сократить размер расширения с мегабайт до символических 70-90 кбайт (в зависимости от архитектуры и компилятора). Копия исходного сообщения осталась доступна на mail-archive.com, и хотя оригинальная ссылка на исходный код расширения sqlite3_unicode.c неработоспособна, его все еще можно найти в интернете, а также мы добавили его в наш архив.
Возможности расширения#define SQLITE3_UNICODE_FOLD – поддержка нелатинских символов функцией FOLD() – +10КБ
#define SQLITE3_UNICODE_LOWER – поддержка нелатинских символов функцией LOWER() – +10КБ
#define SQLITE3_UNICODE_UPPER – поддержка нелатинских символов функцией UPPER() – +10КБ
#define SQLITE3_UNICODE_TITLE – поддержка нелатинских символов функцией TITLE() – +10КБ
#define SQLITE3_UNICODE_UNACC – преобразование accented-символов в обычные, для русского языка не очень актуально – +30КБ
#define SQLITE3_UNICODE_COLLATE – заменяет COLLATION типа NOCASE на новый, в котором при сравнении не учитывается регистр в т. ч. и для нелатинских символов.
#define SQLITE3_UNICODE_UNACC_AUTOMATIC – попытаться применять UNACC в функции LIKE и операциях сравнения с COLLATE NOCASE.
Что характерно, функциональность, которая не требуется, может быть отключена путем убирания соответствующих #define для экономии места и увеличения производительности (вряд ли, впрочем, существенного).
Теперь разберемся, как собрать это расширение и задействовать его в cli-версии SQLite и в модуле для PHP.
Сборка под LinuxДля начала, скачиваем и распаковываем исходный код SQLite – нам потребуются заголовочные файлы из него. Можно использовать любую версию: я брал amalgamation без autoconf – она меньше. В тот же каталог копируем sqlite3_unicode.c.
Далее, корректности ради, открываем sqlite3_unicode.c текстовым редактором и вписываем вверху директиву:
/* we want shared library. only. */ #define SQLITE_ENABLE_UNICODE 1
Этим мы указываем, что собираемся компилировать shared-библиотеку. С другой стороны – соответствующий #if в коде расширения написан таким своеобразным образом, что этого можно и не делать.
Затем следует непосредственно процесс компиляции. Предполагается, что пакеты из набора build-essentials уже установлены в системе – во всяком случае, здесь потребуется gcc:
gcc -shared -o sqlite3_unicode.so sqlite3_unicode.c
Закрывая глаза на ряд warning’ов, получаем готовую библиотеку.
При работе с cli-версией потребуется разместить полученный sqlite3_unicode.so в каталоге с остальными системными библиотеками, либо же выполнить export следующего вида:
export LD_LIBRARY_PATH="/path/to/library/dir:$LD_LIBRARY_PATH"
Затем открываем cli и пишем команду .load sqlite3_unicode. Если ошибок не возникло – значит, расширение успешно загрузилось.
Для загрузки расширения в PHP потребуется в php.ini выставить корректный путь к месту расположения библиотеки в перараметре sqlite3.extension_dir. Затем в скрипте используем команду вида $db->loadExtension(‘sqlite3_unicode.
Вот и всё – теперь сравнения с COLLATE NOCASE будут регистронезависимыми не только для латиницы, но и для русских букв.
Сборка под OpenWrtТеперь попробуем побороть Buildroot от OpenWrt и кросс-компилировать это расширение в toolchain’е для запуска на роутере. В конечном счете, именно ради этого весь процесс и затевался – на ПК-то нет проблемы установить ICU, в отличие от встраиваемых систем. Надо признать, что борьба с Buildroot’ом для меня оказалась намного сложнее, чем все поиски решения проблемы с регистрозависимостью в целом и попытки разобраться, как его собирать в обычных условиях, в частности.
В конечном счете, после бессчетных неудачных попыток, я остановился на варианте формирования отдельного пакета, содержащего только это расширение с выставленным параметром DEPENDS на libsqlite3 и включенным в его состав С-файле с исходным кодом. Скачать готовый пакет можно в нашем архиве.
Его можно распаковать в каталог “package” корневой директории Buildroot’а, а затем нужно в make menuconfig выбрать пакет libsqlite3_unicode и запустить его сборку при помощи команды make package/libsqlite3_unicode/compile.
После установки полученного ipk на роутер подключение данного расширения производится аналогичным ранее описанному способом. Обратите внимание, что имя расширения для OpenWrt – libsqlite3_unicode.so, его размещение по умолчанию – /usr/lib.
This entry was posted in Сеть и интернет and tagged linux, openwrt, грабли. Bookmark the permalink.
Домашняя бухгалтерия на PHP 5, SQLite 3, ExtJs 4
Домашняя бухгалтерия на PHP 5, SQLite 3, ExtJs 4
Домашняя бухгалтерия на ExtJS 4, PHP 5, SQLite 3.Демо — http://demobuh.skahin.ru
Пароль и логин: admin
Описание возможностей и онлайн использование: http://buh.skahin.ru
Разработка и исходный код: https://github.com/pihel/cash
Список возможностей:
Просмотр операций Настраиваемое представление: список колонок, фильтры, сортировки Поддержка клавиатурных сокращений: Enter (или двойной клик) - редактирование Insert - вставка новой записи Alt-1 (2,3,4) - быстрый переход между вкладками Операции, Планирование, Аналитика, Настройки Сохранение состояния в строке запроса.Это дает возможность быстрой передачи прямой ссылки другим людям. Расширенный поиск Гибкий поиск по всем параметрам записи Прямая и обратная логика Добавление операций Автоподстановка значений при вводе на основании ранее введенных Автоматическое создание справочных данных: выбор существующих записей из выпадающего списка или текстовый ввод новых. Автоматическая подстановка часто используемых параметров после выбора позиции: магазин, группа товара Копирование записей в один клик (дата меняется на текущую) Запись геопозиции покупки Полная поддержка клавиатуры: Обход по табу Автофокус на часто используемых полях Enter - Сохранение и закрытие формы Shift-Enter - Сохранение и добавление новой записи Esc - закрытие формы без сохранения Обязательные поля: Дата операции Позиция (номенклатура) Группа Валюта Тип валюты (кошелек) Количество Получатель (организация) Тип операции: приход или расход Дополнительные поля: Файл Примечание Добавление и распознование чеков Перед начало работы нужно указать ключ доступа "ocr" на странице настроек. Нажимаем "Добавить чек" Выбираем фото или скан чека Получаем распознаный чек Планирование расходов и финансовые цели Простановка плановых месячных затрат по группам товара Просмотр и сверка расхода с планом за указанный период Финансовые цели - в разработке Аналитические отчеты Общий или раздельный анализ Возможность построения графиков как по конкретному пользователю, так и по всем разом. Общий анализ расхода и дохода Отчет показывает круговую диаграмму расхода и прихода за период. Баланс расхода и прихода Отчет показывает динамику изменения прихода, расхода и баланса между ними за период веремени. Помесячная динамика Помесячное сравнение расхода и прихода за указанный период. Анализ по группам товара Анализ расхода или прихода в разрезе групп товара за указанный период. Анализ расхода групп товара по месяцам Анализ динамики расхода по группам товара в разрезе месяцев за указанный период. Расходы по организациям Анализ расхода по организациям за указанный период. Отчет также дает возможность просмотреть разрер организаций по определенной группе товара. Анализ по кошелькам Анализ расхода или прихода в разрезе кошельков за указанный период Анализ по валютам Анализ расхода или прихода товаров в разрезе валюты за указанный период. Финансовая безопасность Прогнозирование притока или оттока накоплений с учетом роста расхода или прихода в разрезе месяцев на два года. Входные параметры отчета: Начальный баланс (денежный остаток) Среднемесячный расход % роста расхода в год Среднемесячный приход % роста баланса. Расчет на основании ежемесячной капитализации: ( начальный баланс + (приход за месяц - расход за месяц * % роста расходов / 12 месяцев) ) * % роста баланса / 12 месяцев Денежные накопления Сумма всех накоплении и справнение с планируемой суммой. Карта покупок Отчет работает при включенном позиционировании при вводе товаров. Демо Мобильная версия Версия для мобильный устройств Версия для старых мобильников, которые медленно показывают полнофункциональную версию. Запись геопозиции при внесении покупки Подсказки про вводе товара Мультиязычность Мультиязычность Поддержка несокльких языков Региональные настройки даты и валюты Выбор валюты поумолчанию и языка справочников происходит при первом запуске системы (установке) Настройка прав Гибкая настройка прав Возможность создания несольких баз с разным набором пользователей. Разные базы не будут визуально пересекаться ни в просмотре операций, ни в аналитике, ни в планировании. Возможность создания несольких пользователей для одной базы. Это дает возможность вести совместный учет финансов. Такие операции будут учитываться соместно в просмотре, аналитике или планировании. Возможность выдачи различных прав для пользователей: Чтение - дает возможность входа в бухгалтерию, просмотра списка операций Запись - дает возможность добавления, редактирования списка операции и планирования Аналитика - просмотр аналитических отчетов Настройка - административные права: создание пользователей, баз, раздача прав. Права настроек дают также редактировать справочники системы: Настройки системы: язык, пути до статичных файлов, название бухгалтерии, почта администратора, валюта и другие Справочники в расширенном режиме: группы товара, организации, товары, валюты, кошельки и т.д. Так же тут есть возможность выгрузить базу данных в формате sqlite3 целиком на локальный компьютер. Доступ с ограниченными правами Слева представлено, как выглядит бухгалтерия для пользователя с правами Чтения и Аналитики. Нет возможности просматривать или редактировать настройки, нет возможности добавлять или редактировать операции. Но есть возможность просматривать записи, фильтровать и строить аналитические отчеты. Семейный или раздельный бюджет При входе в бухгалтерию есть возможность выбрать: Базу - что дает индивидуальный разрез видимых данных (допустим: семейный, личный, небольшой организации) Пользователя базы - пользователь с индивидуальными правами конкретной бд, который будет видеть данные только этой базы Пароль - пароль от пользователя к выбранной базе Язык Пути дальнейшего развития финансовые цели в планировании API для основных операций Экспорт/импорт в xlsx, pdf Загрузка данных из инет банков Ежемесячные повторяющией расходы (доходы) Отчет по сравнению периодов
Следующее Предыдущее Главная страница
Подписаться на: Комментарии к сообщению (Atom)
PHP: SQLite3 — Руководство
класс SQLite3 {
общедоступный константа инт ОК ;
общественный константа инт ЗАПРЕТ ;
общественный константа инт ИГНОРИРОВАТЬ ;
общественный
константа
инт
общественный константа инт CREATE_TABLE ;
публичный константа инт CREATE_TEMP_INDEX ;
общественный константа инт CREATE_TEMP_TABLE ;
общественный константа инт CREATE_TEMP_TRIGGER ;
общественный константа инт CREATE_TEMP_VIEW ;
общественный константа инт CREATE_TRIGGER ;
общественный
константа
инт CREATE_VIEW
общественный константа инт УДАЛИТЬ ;
общественный константа инт DROP_INDEX ;
общественный константа инт DROP_TABLE ;
общественный константа инт DROP_TEMP_INDEX ;
общественный константа инт DROP_TEMP_TABLE ;
общественный константа инт DROP_TEMP_TRIGGER ;
общественный константа инт DROP_TEMP_VIEW ;
общественный константа инт DROP_TRIGGER ;
общественный константа инт DROP_VIEW ;
общественный константа инт ВСТАВКА ;
общественный константа инт ПРАГМА ;
общественный константа инт ЧТЕНИЕ ;
общественный константа инт ВЫБРАТЬ ;
общественный константа инт СДЕЛКА ;
общественный константа инт ОБНОВЛЕНИЕ ;
общественный константа инт ПРИСОЕДИНИТЬ ;
общественный константа инт ОТСОЕДИНЕНИЕ ;
общественный константа инт ALTER_TABLE ;
общественный константа инт ПЕРЕИНДЕКС ;
общественный константа инт АНАЛИЗ ;
общественный константа инт CREATE_VTABLE ;
общественный константа инт DROP_VTABLE ;
общественный константа инт ФУНКЦИЯ ;
общественный константа инт ТОЧКА СОХРАНЕНИЯ ;
общественный константа инт КОПИЯ ;
общественный константа инт РЕКУРС. ;
public __construct (строка $filename
, int $flags
= SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, строка $encryptionKey
= «») общедоступная резервная копия (SQLite3 $ место назначения 902 30 , строка $sourceDatabase
= "главная", строка $destinationDatabase
= "main"): bool public busyTimeout(int $milliseconds
): bool public changes(): int
public close(): bool
public createAggregate( 902 53 строка $имя
,
вызываемый $stepCallback
,
вызываемый $finalCallback
,
int $argCount
= -1
): bool public createCollation(string $name
, callable $callback
): bool public createFunction(
string $name
,
вызываемый $callback
,
int $argCount
= -1, 9 0253 int $flags
= 0
): bool public enableExceptions( bool $enable
= false
): bool public static escapeString(string $string
): string public exec(string $query
): bool публичный lastErrorCode(): целое число
public lastErrorMsg(): string
public lastInsertRowID(): int
public loadExtension(string $name
): bool public open(string $filename
, int 902 29 $flags
= SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE, string $encryptionKey
= «»): void public openBlob( string
$table
, string
$column
, int
$rowid
, строка
$база данных
= «основной», int
$flags
= SQLITE3_OPEN_READONLY
): ресурс|ложь публичная подготовка (строка
$запрос
): SQLite3 Stmt|false общедоступный запрос (строка $запрос
) : SQLite3Result|false public querySingle(string $query
, bool $entireRow
= false
): смешанный public setAuthorizer(?callable 902 29 $callback ): boolобщедоступная статическая версия() : массив
}Средство управления базой данных SQLite
Просмотр и поиск
Просмотр содержимого ваших таблиц или поиск определенных строк
Обновление, вставка, удаление
Редактирование содержимого ваших таблиц, вставка новых строк или удаление существующих
Изменить таблицы
Добавить, удалить или переименовать столбцы или изменить их тип – в т. ч. возможности SQLite не поддерживаются!
Импорт и экспорт
Импорт и экспорт файлов CSV или дампов SQL
Следуя духу SQLite
phpLiteAdmin — это веб-инструмент администрирования базы данных SQLite, написанный на PHP с поддержкой SQLite3 и SQLite2. Следуя духу системы плоских файлов, используемой SQLite, phpLiteAdmin состоит из одного исходного файла, phpliteadmin.php, который помещается в каталог на сервере, а затем открывается в браузере. Установка не требуется. Доступные операции, набор функций, интерфейс и взаимодействие с пользователем сопоставимы с phpMyAdmin.
Easy
Для установки и использования
Мощный
Может делать больше, чем сам SQLite
Облегченный
Только один файл ~ 250 КБ
Настраиваемый
10+ языков и 10+ тем
НАШИ СЧАСТЛИВЫЕ КЛИЕНТЫ
Демо
Попробуйте phpLiteAdmin сейчас
Скачать
Получить последнюю стабильную версию
Система отслеживания проблем
Сообщить об ошибке или запросить функции
Группа обсуждения
Присоединиться к беседе
Конфиденциальность и файлы cookie: этот сайт использует файлы cookie. Продолжая использовать этот веб-сайт, вы соглашаетесь на их использование.
Чтобы узнать больше, в том числе о том, как управлять файлами cookie, см. здесь: Политика в отношении файлов cookie
Выпущен phpLiteAdmin 1.9.8
Наконец-то, спустя долгое время, сегодня была выпущена новая стабильная версия phpLiteAdmin. Скачать phpLiteAdmin 1.9.8 теперь Он содержит множество улучшений по сравнению с 1.9.7.1. Одной из основных новых функций является автоматическое завершение и подсветка синтаксиса в полях редактора SQL. Внимание: этот выпуск также включает исправления безопасности. phpliteAdmin от 1.9.5 до 1.9.7.1 (и некоторые 1.9.8-dev[…]
Предупреждение системы безопасности: версия для разработчиков phpLiteAdmin 1.9.8-dev
В разрабатываемых версиях 1.9.8-dev обнаружена проблема безопасности были опубликованы между 22 января 2017 г. и 17 августа 2017 г. (сегодня). Эти версии позволяют злоумышленникам изменять или удалять существующие базы данных или создавать новые базы данных без аутентификации.