Sqlite3 Codeigniter database driver или поддержка sqlite-базы в Codeigniter без использования PDO

Для одного небольшого личного проекта понадобилось решил в целях любопытства и повышения общего уровня знаний воспользоваться базой данных Sqlite.

Крутиться все планировалось на Codeigniter2, о поддержке Sqlite внутри фреймворка я слышал, так что проблем не предвиделось. О том, что драйвер расчитан для второй версии Sqlite, а у меня в системе стояла третья я понял чуть позже, когда не смог подключить базу простым изменение config/database.php на манер:

$db['default']['hostname'] = '';
$db['default']['database'] = APPPATH.'db/sqlite3db.sqlite3';

Начались поиски драйвера.


 

Я не хвалюсь, что умею искать.

В основном путь моего поиска достаточно прост, в данном случае цепочка поиска была такой:

  1. Яндекс
  2. Google
  3. codeigniter.com
  4. codeigniter.ru
  5. habrahabr.ru

Из всех найденных советов по использованию Sqlite3 вместе с Codeigniter реальных я выделил только два:

  1. Использовать некий PDO SQLite3 Driver
  2. Скопировать папку с драйвером /codeigniter/database/drivers/sqlite в папку sqlite3 и во всех файлах «sqlite» поменять на «sqlite3» . К этому варианту я относся с некоторой иронией и не пробовал.

Первый вариант я попробовал, но не завелось.

Настойчивость я не проявлял, ибо хотелось готовый вариант. Еще немного поискав, я пришел к выводу что для Sqlite3 в php5.3+ имеется (при подключении соответственно sqlite3-библиотеки) возможность пользоваться замечательным небольшим классом SQLite3

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

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

На этот раз поиск увенчался успехом для моего проекта, и крахом для моего драйвера.

Соответствующий © драйвер Sqlite3 для Codeigniter был найден в недрах какого-то непонятного мне проекта авторства некого kaptk2 (слава Open source!).

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

Правда кое какие правки пришлось внести. В частности указать таймаут блокировки базы SQLite3:: busyTimeout :

Для этого в конфиг (app/config/database.php) следует внести специфичную для драйвера настройку:

$db['default']['hostname'] = '';
$db['default']['database'] = APPPATH.'db/sqlite3db.sqlite3';
$db['default']['busy_timeout'] = '200'; // милисекунды

Ну и в коде драйвера (codeigniter/database/driver/sqlite3/sqlite3_driver.php):

$conn_id = new SQLite3($this->database, SQLITE3_OPEN_READWRITE|SQLITE3_OPEN_CREATE);

// устанавливаем таймаут:
if ($this->busy_timeout)
    $conn_id->busyTimeout($this->busy_timeout);
// устанавливаем таймаут

$error_code = $conn_id->lastErrorCode();

Проверил, простейшие запросы INSERT, DELETE, SELECT работают, с остальным в пределах данного проекта мне работать не придется, так что пока функционала достаточно.

Единственная проблема у меня возникла с блокировкой базы во время выполнения множественных вставок. Синтаксиса mysql для insert с несколькими сетами значений sqlite3 не поддерживает:

INSERT INTO table(field1, field2) VALUES('value1', 'value2'), ('value3', 'value4')

В связи с этим функции _insert_batch() внутри драйвера найти не удастся.

Если запросы делать последовательно, то идущие один за одним insert’ы будут блокировать друг друга. Решить эту проблему можно с помощью транзакций, такая функциональность в драйвер встроена, а значит модель codeigniter, которая для mysql выглядела так:

function addAll($fields_array)
{
        return $this->db->insert('table',$fields_array);
}

для Sqlite3 будет выглядеть так:

function addAll($fields_array)
{
	$this->db->trans_begin();
	foreach($fields_array as $fields)
		$this->db->insert('table',$fields);

	return $this->db->trans_commit();
}

Этот метод работает.

Сам драйвер вы можете взять на github, там где и я, или можете скачать из моего архива, там уже внесены изменения busyTimeout: codeigniter_sqlite3_database_driver.zip

Полезно(0)Бесполезно(1)
Комментарии закрыты.