Exemplo n.º 1
0
    protected static function putTestContent()
    {
        QC::executeSQL('DROP TABLE IF EXISTS products');
        $storagePath = __DIR__ . '/storage/';
        $mo = ModelOperator::getInstance($storagePath);
        $mo->generateBasicStructure('Product');
        $ms = new ModelStructure('Product');
        $ms->addColumn('id_brand', array('type' => 'int(11) unsigned'));
        $ms->saveStructure();
        $mo->generateAllModelClasses();
        $mo->updateDBForAllModels();
        require_once $storagePath . 'bases/BaseProduct.php';
        require_once $storagePath . 'classes/Product.php';
        QC::create('products')->insert(array('title' => 'Macbook air'))->execute();
        $testProductFileContent = <<<TEXT
<?php

class ProductCustom extends BaseProduct {
    private \$_internalManufacturer = 'solve';
    public function getManufacturer() { return \$this->_internalManufacturer; }
    public function setManufacturer(\$value) { \$this->_internalManufacturer = \$value; return \$this; }
}
TEXT;
        file_put_contents($storagePath . 'classes/ProductCustom.php', $testProductFileContent);
        require_once $storagePath . 'classes/ProductCustom.php';
        $mo->setStructureForModel('ProductCustom', $mo->generateBasicStructure('Product', false), false);
    }
Exemplo n.º 2
0
 /**
  * Update database and models
  */
 public function updateAllAction()
 {
     QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
     ModelOperator::getInstance(DC::getEnvironment()->getUserClassesRoot() . 'db/')->updateDBForAllModels();
     ModelOperator::getInstance()->generateAllModelClasses();
     $this->writeln('DB updated');
 }
Exemplo n.º 3
0
 public static function setUpBeforeClass()
 {
     DatabaseService::configProfile(array('Product' => 'root', 'pass' => 'root'));
     self::$_storagePath = __DIR__ . '/storage/';
     DBOperator::getInstance()->dropDB(self::$_DBName)->createDB(self::$_DBName)->useDB(self::$_DBName);
     FSService::unlinkRecursive(self::$_storagePath);
     QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
     call_user_func(array(get_called_class(), 'putTestContent'));
 }
Exemplo n.º 4
0
 public function setUp()
 {
     DatabaseService::configProfile(array('user' => 'root', 'pass' => 'root'));
     $DBName = 'solve_test_database';
     DBOperator::getInstance()->createDB($DBName)->useDB($DBName);
     QC::executeSQL('DROP TABLE IF EXISTS users');
     DBOperator::getInstance()->createTable('users', array('table' => 'users', 'columns' => array('id' => array('type' => 'int(11) unsigned', 'auto_increment' => true), 'position' => 'varchar(255)', 'age' => 'tinyint(1) unsigned', 'name' => 'varchar(255)'), 'indexes' => array('id' => array('type' => 'primary', 'columns' => 'id'))));
     QC::executeSQL('TRUNCATE `users`');
 }
Exemplo n.º 5
0
 protected static function putTestContent()
 {
     QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
     QC::executeSQL('DROP TABLE IF EXISTS brands');
     $storagePath = __DIR__ . '/storage/';
     $mo = ModelOperator::getInstance($storagePath);
     $mo->generateBasicStructure('Brand');
     ModelStructure::getInstanceForModel('Brand')->addAbility('slug')->saveStructure();
     $mo->generateAllModelClasses();
     require_once $storagePath . 'bases/BaseBrand.php';
     require_once $storagePath . 'classes/Brand.php';
     $mo->updateDBForAllModels();
 }
Exemplo n.º 6
0
 protected static function putTestContent()
 {
     QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
     QC::executeSQL('DROP TABLE IF EXISTS brands');
     $storagePath = __DIR__ . '/storage/';
     $mo = ModelOperator::getInstance($storagePath);
     $mo->generateBasicStructure('User');
     ModelStructure::getInstanceForModel('User')->dropColumn('title')->addColumn('name', array('type' => 'varchar(255)', 'validation' => array('CustomName' => array('class' => 'Solve\\Database\\Tests\\CustomNameValidationRule', 'error' => 'invalid name')), 'process' => array('trim')))->addColumn('email', array('type' => 'varchar(255)'))->saveStructure();
     $mo->generateDataProcessorRules('User');
     $mo->generateAllModelClasses();
     require_once $storagePath . 'bases/BaseUser.php';
     require_once $storagePath . 'classes/User.php';
     $mo->updateDBForAllModels();
 }
Exemplo n.º 7
0
 protected static function putTestContent()
 {
     QC::executeSQL('DROP TABLE IF EXISTS products');
     $storagePath = __DIR__ . '/storage/';
     $mo = ModelOperator::getInstance($storagePath);
     $mo->generateBasicStructure('Product');
     $ms = new ModelStructure('Product');
     $ms->addColumn('info', array('type' => 'array'));
     $ms->saveStructure();
     $mo->generateAllModelClasses();
     $mo->updateDBForAllModels();
     require_once $storagePath . 'bases/BaseProduct.php';
     require_once $storagePath . 'classes/Product.php';
     QC::create('products')->insert(array('title' => 'Macbook air'))->execute();
 }
Exemplo n.º 8
0
 protected static function putTestContent()
 {
     QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
     QC::executeSQL('DROP TABLE IF EXISTS brands');
     $storagePath = __DIR__ . '/storage/';
     $mo = ModelOperator::getInstance($storagePath);
     $mo->generateBasicStructure('Brand');
     ModelStructure::getInstanceForModel('Brand')->addAbility('files', array('logo' => array('name' => 'original', 'multiple' => true), 'info' => array(), 'avatar' => array('sizes' => array('small' => array('size' => '100x100', 'method' => 'fitOut')))))->saveStructure();
     $mo->generateAllModelClasses();
     require_once $storagePath . 'bases/BaseBrand.php';
     require_once $storagePath . 'classes/Brand.php';
     $webRoot = __DIR__ . '/upload/';
     FilesAbility::setBaseStoreLocation($webRoot);
     FSService::setWebRoot($webRoot);
     FSService::unlinkRecursive($webRoot);
     $mo->updateDBForAllModels();
 }
Exemplo n.º 9
0
 protected static function putTestContent()
 {
     QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
     QC::executeSQL('DROP TABLE IF EXISTS products');
     QC::executeSQL('DROP TABLE IF EXISTS brands');
     QC::executeSQL('DROP TABLE IF EXISTS brands_translate');
     $storagePath = __DIR__ . '/storage/';
     $mo = ModelOperator::getInstance($storagePath);
     $mo->generateBasicStructure('Product');
     $mo->generateBasicStructure('Brand');
     ModelStructure::getInstanceForModel('Product')->addColumn('id_brand', array('type' => 'int(11) unsigned'))->addRelation('brand')->saveStructure();
     ModelStructure::getInstanceForModel('Brand')->addRelation('products')->addAbility('translate', array('columns' => array('title')))->saveStructure();
     $mo->generateAllModelClasses();
     require_once $storagePath . 'bases/BaseProduct.php';
     require_once $storagePath . 'bases/BaseBrand.php';
     require_once $storagePath . 'classes/Product.php';
     require_once $storagePath . 'classes/Brand.php';
     ModelOperator::getAbilityInstanceForModel('Brand', 'Translate')->cleanup();
     $mo->updateDBForAllModels();
 }
Exemplo n.º 10
0
 public function testBasic()
 {
     $mo = ModelOperator::getInstance(self::$_storagePath);
     $this->assertEmpty($mo->getModelStructure('User'), 'Empty structure returns array()');
     $mo->generateBasicStructure('User');
     $data = $mo->getModelStructure('User');
     $this->assertEquals(array('table' => 'users', 'columns' => array('id' => array('type' => 'int(11) unsigned', 'auto_increment' => true), 'title' => array('type' => 'varchar(255)')), 'indexes' => array('primary' => array('columns' => array('id')))), $data, 'Basic structure generator is ok');
     $mo->saveModelStructure('User');
     $this->assertFileExists(self::$_storagePath . 'structure/User.yml', 'Save model structure is ok');
     $mo->generateModelClass('User');
     require_once __DIR__ . '/storage/bases/BaseUser.php';
     require_once __DIR__ . '/storage/classes/User.php';
     $this->assertFileExists(self::$_storagePath . 'bases/BaseUser.php', 'BaseModel generated');
     $this->assertFileExists(self::$_storagePath . 'classes/User.php', 'Model generated');
     $this->assertTrue(class_exists('\\User'), 'Generated model class is available');
     QC::executeSQL('DROP TABLE IF EXISTS users');
     $mo->updateDBForModel('User');
     $data = DBOperator::getInstance()->getTableStructure('users');
     $this->assertNotEmpty($data, 'Table generation is ok');
 }
Exemplo n.º 11
0
    protected static function putTestContent()
    {
        QC::executeSQL('DROP TABLE IF EXISTS products');
        QC::executeSQL('DROP TABLE IF EXISTS categories');
        $storagePath = __DIR__ . '/storage/';
        $mo = ModelOperator::getInstance($storagePath);
        $mo->generateBasicStructure('Product');
        $mo->generateBasicStructure('Category');
        ModelStructure::getInstanceForModel('Product')->addColumn('id_category', array('type' => 'int(11) unsigned'))->addRelation('category')->addRelation('category_title', array('table' => 'categories', 'fields' => array('title'), 'use' => 'title', 'type' => 'many_to_one', 'local_field' => 'id_category'))->saveStructure();
        ModelStructure::getInstanceForModel('Category')->addRelation('products')->saveStructure();
        $mo->generateAllModelClasses();
        require_once $storagePath . 'bases/BaseProduct.php';
        require_once $storagePath . 'bases/BaseCategory.php';
        require_once $storagePath . 'classes/Product.php';
        require_once $storagePath . 'classes/Category.php';
        $mo->updateDBForAllModels();
        QC::create('products')->insert(array('title' => 'Macbook Air', 'id_category' => 1))->execute();
        QC::create('products')->insert(array('title' => 'Macbook Pro', 'id_category' => 1))->execute();
        QC::create('products')->insert(array('title' => 'iMac 27"', 'id_category' => 2))->execute();
        QC::create('categories')->insert(array('title' => 'Notebooks'))->execute();
        QC::create('categories')->insert(array('title' => 'Computers'))->execute();
        $categoriesCollectionText = <<<TEXT
<?php
use Solve\\Database\\Models\\ModelCollection;

class CategoriesCollection extends ModelCollection {

    public function getProductsCount() {
        return 12;
    }

}
TEXT;
        file_put_contents($storagePath . 'classes/CategoriesCollection.php', $categoriesCollectionText);
        require_once $storagePath . 'classes/CategoriesCollection.php';
    }
Exemplo n.º 12
0
 /**
  * Updates many to many tables
  * @param $info
  * @return mixed
  */
 public function updateManyTable($info)
 {
     $structure = array('table' => $info['manyTable'], 'columns' => array(), 'indexes' => array(), 'constraints' => array());
     $localName = Inflector::singularize($info['localTable']);
     $foreignName = Inflector::singularize($info['foreignTable']);
     $structure['columns']['id'] = array('type' => 'int(11) unsigned', 'auto_increment' => true);
     $structure['columns']['id_' . $localName] = 'int(11) unsigned';
     $structure['columns']['id_' . $foreignName] = 'int(11) unsigned';
     $structure['indexes']['primary'] = array('columns' => array('id'), 'type' => 'primary');
     $structure['indexes']['unique_id_' . $localName . '_id_' . $foreignName] = array('columns' => array('id_' . $localName, 'id_' . $foreignName), 'type' => 'unique');
     $foreignKeysInfo = array('local_table' => $info['manyTable'], 'foreign_table' => $info['localTable'], 'local_field' => 'id_' . $localName, 'foreign_field' => $info['foreignKey']);
     $structure['constraints'][$this->generateForeignKeyName($foreignKeysInfo)] = $foreignKeysInfo;
     $foreignKeysInfo = array('local_table' => $info['manyTable'], 'foreign_table' => $info['foreignTable'], 'local_field' => 'id_' . $foreignName, 'foreign_field' => $info['foreignKey']);
     $structure['constraints'][$this->generateForeignKeyName($foreignKeysInfo)] = $foreignKeysInfo;
     $diffs = $this->getDifferenceSQL($structure, $info['manyTable']);
     if ($diffs['result'] === true) {
         QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0');
         if (!empty($diffs['sql']['ADD'])) {
             try {
                 QC::executeArrayOfSQL($diffs['sql']['ADD']);
             } catch (\Exception $e) {
                 var_dump($e->getMessage());
                 die;
             }
         }
     }
     return $diffs['result'];
 }
Exemplo n.º 13
0
 /**
  * Load data from YML files into database with replacing
  * @param string|array $models
  */
 public function dataLoad($models = null)
 {
     if (!empty($models)) {
         if (!is_array($models)) {
             $models = array($models);
         }
     } else {
         $models = array_keys($this->_structures);
     }
     $data_dir = $this->_storagePath . 'data/';
     foreach ($models as $model) {
         $model = ucfirst($model);
         $file_name = $data_dir . strtolower($model) . '.yml';
         if (!isset($this->_structures[$model]) || !is_file($file_name)) {
             continue;
         }
         $data = Yaml::parse(file_get_contents($file_name));
         if (!is_array($data)) {
             continue;
         }
         QC::executeSQL('SET FOREIGN_KEY_CHECKS=0');
         QC::executeSQL('TRUNCATE `' . $this->_structures[$model]['table'] . '`');
         QC::create($this->_structures[$model]['table'])->insert($data)->execute();
     }
 }