Написал для себя модель расширяющую класс ORM для комфортной разработки с использованием SQLite
Проверяет наличие БД и создает при необходимости таблицу и необходимой структурой
Гарантирована работа с SQLite, с другими типами не должна работать и не работает в текущем исполнении
Дорабатывать модель в планах нет, выкладываю как идею:
Код:
<?php defined('SYSPATH') or die('No direct script access.');
// эксперименты с созданием базы с нуля
class Model_xc_ORM extends ORM
{
private $_config_database = array();
private $_mask = array(); // права директории и файла
private $_path_parts = array();
private function config_database()
{
$this->_config_database =
Kohana::$config->load('database');
$_ = explode(':',$this->_config_database[$this->_db_group]["connection"]["dsn"]);
$this->_path_parts = pathinfo($_[1]);
$this->_path_parts['path'] = $_[1];
// var_dump($this->_path_parts);
}
// проверка существования бд и создание при необходимости
public function control($data = FALSE)
{
$this->config_database();
$this->_mask['old'] = umask(0); // На аргумент $mode umask() влияет текущее значение umask
// проверка существования файла бд
if ( ! is_file($this->_path_parts['path']))
{
return
$this->_create_db();
}
// проверка таблицы
try
{
$this->find();
}
catch (Exception $e)
{
$e = explode(":", $e->getMessage());
if ($e[2] == ' 1 no such table')
{
return $this->_create_table();
}
else
{
Kohana::$log->add(Log::CRITICAL, $e->getCode()."\n\r".__FILE__.':'.__LINE__);
return ('Неожиданная ситуация [] '.$e->getMessage().' [] '.$e->getCode());
}
}
$this->clear();
// umask($this->_mask['old']);
return TRUE;
}
// создание бд
private function _create_db($data = FALSE)
{
// если файл базы не создан
if ( ! is_file($this->_path_parts['path']))
{
if ( ! is_dir($this->_path_parts['dirname'])
AND ( ! mkdir($this->_path_parts['dirname'], 0775, TRUE))) // оператор сравнения используем имменно AND
{
return 'Ошибка! Директория ['.$this->_path_parts['dirname'].'] не создана';
}
try
{
$this->_create_file();
$_create_table = $this->_create_table();
if($_create_table !== TRUE)
return
('Была обнаружена исправимая ошибка, меры устранения приняты, '
.'<br /><a href='.$_SERVER["REQUEST_URI"].'>повторите попытку сейчас</a>.'
.'<br />Если это сообщение не пропадает - обратитесь к администратору.');
else
{
return $_create_table;
}
} catch (Exception $e) {
return 'Ошибка! Файл ['.$this->_path_parts['basename'].'] не доступен для записи';
}
}
return 'Ошибка!';
}
// создание таблицы
private function _create_file()
{
fclose(fopen($this->_path_parts['path'], 'w'));
chmod($this->_path_parts['path'],0664);
}
// создание таблицы
private function _create_table()
{
$pdo = new PDO($this->_config_database[$this->_db_group]["connection"]["dsn"]);
$query = $pdo->query($this->_create_table_query());
if ( ! $query)
return 'Ошибка! Таблица ['.$this->_table_name.'] не создана '.$this->_create_table_query();
return TRUE;
}
private function _create_table_query()
{
$_table_name = $this->_table_name;
$_primary_key = $this->_primary_key;
$_table_columns = $this->_table_columns;
$type = array(
'data_type' => array(
'int' => 'INTEGER',
'integer' => 'INTEGER',
'varchar' => 'TEXT',
'bool' => 'NUMERIC',
'boolean' => 'NUMERIC',
'float' => 'REAL',
'text' => 'TEXT',
),
'is_nullable' => array(TRUE => 'NULL', FALSE => 'NOT NULL', ),
// 'autoincrement' => array(TRUE => 'AUTOINCREMENT', FALSE => '', ),
// 'primary' => array(TRUE => 'PRIMARY KEY', FALSE => '', ),
);
$sql = "CREATE TABLE $_table_name (";
foreach ($_table_columns as $ColumnName => $ColumnType)
{
$sql .= "$ColumnName ";
foreach ($ColumnType as $data_type => $data_typeV)
{
$data_type = strtolower($data_type);
$sql .= $type[$data_type][$data_typeV]." ";
}
$sql .= ",";
}
$sql .= "PRIMARY KEY ($_primary_key)";
$sql .= ");";
return
$sql;
}
} //end of file
как пользоваться
1. Создаем модель
Код:
<?php defined('SYSPATH') or die('No direct script access.');
class Model_DB_Product extends Model_xc_ORM
{
protected $_primary_key = 'id_product';
protected $_db_group = 'products'; //конфигурация базы данных
protected $_table_name = 'products'; //
protected $_table_columns =
array(
'id' => array('data_type' => 'int', 'is_nullable' => FALSE),
'id_product' => array('data_type' => 'int', 'is_nullable' => FALSE),
'id_manufacturer' => array('data_type' => 'varchar', 'is_nullable' => FALSE),
'available' => array('data_type' => 'bool', 'is_nullable' => TRUE), // наличие TRUE, NULL - уведомить, FALSE
'name' => array('data_type' => 'varchar', 'is_nullable' => TRUE), // наименование
'price' => array('data_type' => 'float', 'is_nullable' => TRUE), // цена
'description' => array('data_type' => 'text', 'is_nullable' => TRUE), // описание
'features' => array('data_type' => 'text', 'is_nullable' => TRUE), // характеристики
// 'href' => array('data_type' => 'varchar', 'is_nullable' => TRUE),
);
public function rules()
{
return
array(
'id_product' => array(
array('not_empty'), // ( ! empty() )
array('digit', array(':value', TRUE)), // целое число , TRUE для совместимости с UTF-8
'id_manufacturer' => array(
array('not_empty'), // ( ! empty() )
array('alpha', array(':value', TRUE)), // только из символов алфавита , TRUE для совместимости с UTF-8
),
);
}
} //end of file
2. в контроллере
Код:
$product = ORM::factory('DB_Product');
// проверка существования бд
$control = $product->control();
if ($control !== TRUE)
{
var_dump($control);
die();
}
предложения и замечания принимаются ))