Я работаю на уровне sqlite для легкой обработки sql запросов. Соединение выполняется с PDO, и в первую очередь я выполняю этот запрос для настройки параметров:
$this->_db->exec('PRAGMA synchronous=FULL; PRAGMA journal_mode=WAL; PRAGMA temp_store=MEMORY; PRAGMA locking_mode=EXCLUSIVE; PRAGMA busy_timeout=5000;');
У меня есть функция для создания таблицы, вот как это выглядит:
public function createTable($table, $struct, $drop_flag=true) {
$this->_db->beginTransaction();
if ($drop_flag && $this->tableExists($table)) {
$this->query("DROP TABLE ".$table); // <---- This is the point by the unit tests where it comes to that error
}
$query = [];
$index = [];
foreach ($struct as $name => $type) {
$key = explode(' ', $name);
if (sizeof($key) == 1) {
$query[] = $name . ' ' . $this->_convertType($type);
} else {
$val = explode('(', rtrim($type, ')'));
switch ($key[0]) {
case 'PRIMARY':
case 'UNIQUE':
case 'KEY':
$index_name = $table.'_'.$key[1];
$index[] = 'CREATE ' . ($key[0] == 'UNIQUE' ? 'UNIQUE ' : '')
. 'INDEX ' . $index_name . ' ON ' . $table
. ' ("' . str_replace(',', '","', $val[0]) . '")';
break;
}
if ($key[0] == 'PRIMARY') {
$columns = explode(',', $type);
$primaries = [];
foreach ($columns as $value) {
if (strpos($value, '(')) {
$primaries[] = substr($value, 0, strpos($value, '('));
} else {
$primaries[] = $value;
}
}
$query[] = 'PRIMARY KEY (' . implode(',', $primaries) . ')';
}
}
}
$stmt = $this->query('create table ' . $table . ' (' . implode(',', $query) . ');');
if ($stmt === false) {
$this->_db->rollback();
throw new Own_Sql_Exception($query . "\n" . $this->_db->errorInfo()[2], Own_Sql_Exception::QUERY_ERROR);
}
foreach ($index as $in) {
$this->query($in, true);
}
$this->_db->commit();
}
Эта функция работает отлично, но когда я запускаю свой модульный тест с phpunit, я получаю сообщение об ошибке: SQLSTATE [HY000]: Общая ошибка: 6 таблица базы данных заблокирована.
Вот код функции моего модульного теста:
public function testCreateTable() {
$db = new_db_connection();
$this->start = microtime(true);
$db->createTable('test', array(
'id' => 'int',
'name' => 'varchar(255)',
'PRIMARY KEY' => 'id'
));
$createQuery = $db->currentQuery;
$this->assertTrue($db->tableExists('test'), $createQuery);
$cols = $db->showColumns('test');
$this->assertEquals(2, sizeof($cols));
$db->createTable('test', array( // <---- Here is the point where i got the error
'id' => 'int',
'name' => 'varchar(255)',
'title' => 'varchar(255)',
'PRIMARY KEY' => 'id'
));
$cols = $db->showColumns('test');
$this->assertEquals(3, sizeof($cols));
$db->createTable('test', array(
'id' => 'int',
'name' => 'varchar(255)',
'title' => 'varchar(255)',
'order_field' => 'int',
'PRIMARY KEY' => 'id'
), true);
$cols = $db->showColumns('test');
$this->assertEquals(4, sizeof($cols));
}
Кто-нибудь знает, как исправить эту ошибку?