Автор: Kris Jordan (krisjordan@gmail.com)
Наследование: extends PDO
Пример #1
0
 /**
  * Once results are needed this method executes the accumulated query
  * on the data source.
  */
 protected function realize()
 {
     if (!$this->hasResults) {
         unset($this->results);
         $this->results = $this->source->queryForClass($this->sqlBuilder, $this->rowClass);
         $this->hasResults = true;
     }
 }
 function setUp()
 {
     $pdo = new PdoDataSource(self::DSN);
     $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $pdo->beginTransaction();
     $pdo->exec('CREATE TABLE table_b (id INTEGER PRIMARY KEY AUTOINCREMENT, column_b STRING)');
     $pdo->exec('CREATE TABLE table_a (id INTEGER PRIMARY KEY AUTOINCREMENT, column_a STRING)');
     $pdo->commit();
     $this->source = $pdo;
 }
Пример #3
0
 function createTableSql($descriptor)
 {
     return parent::createTableSql($this->modelToTableDescriptor($descriptor));
 }
 function getStatementForBuilder(SqlBuilder $builder, $action, PdoDataSource $source)
 {
     $criteria = $builder->getCriteria();
     $builderTable = $builder->getTable();
     $tableDescriptors = array();
     foreach ($criteria as $criterion) {
         $table = $builderTable;
         $column = $criterion->column;
         if (strpos($column, '.') !== false) {
             $parts = explode('.', $column);
             $table = $parts[0];
             $column = $parts[1];
         }
         if (!isset($tableDescriptors[$table])) {
             $tableDescriptors[$table] = $source->getTableDescriptor($table)->getColumns();
         }
         if (isset($tableDescriptors[$table][$column])) {
             switch ($tableDescriptors[$table][$column]->type) {
                 case RecessType::DATETIME:
                 case RecessType::TIMESTAMP:
                     if (is_int($criterion->value)) {
                         $criterion->value = date('Y-m-d H:i:s', $criterion->value);
                     } else {
                         $criterion->value = null;
                     }
                     break;
                 case RecessType::DATE:
                     $criterion->value = date('Y-m-d', $criterion->value);
                     break;
                 case RecessType::TIME:
                     $criterion->value = date('H:i:s', $criterion->value);
                     break;
                 case RecessType::BOOLEAN:
                     $criterion->value = $criterion->value == true ? 1 : 0;
                     break;
                 case RecessType::INTEGER:
                     if (is_array($criterion->value)) {
                         break;
                     } else {
                         if (is_numeric($criterion->value)) {
                             $criterion->value = (int) $criterion->value;
                         } else {
                             $criterion->value = null;
                         }
                     }
                     break;
                 case RecessType::FLOAT:
                     if (!is_numeric($criterion->value)) {
                         $criterion->value = null;
                     }
                     break;
             }
         }
     }
     $sql = $builder->{$action}();
     $statement = $source->prepare($sql);
     $arguments = $builder->getPdoArguments();
     foreach ($arguments as &$argument) {
         // Begin workaround for PDO's poor numeric binding
         $param = $argument->getQueryParameter();
         if (is_numeric($param)) {
             continue;
         }
         if (is_string($param) && strlen($param) > 0 && substr($param, 0, 1) !== ':') {
             continue;
         }
         // End Workaround
         // Ignore parameters that aren't used in this $action (i.e. assignments in select)
         if ('' === $param || strpos($sql, $param) === false) {
             continue;
         }
         $statement->bindValue($param, $argument->value);
     }
     return $statement;
 }
 function getStatementForBuilder(SqlBuilder $builder, $action, PdoDataSource $source)
 {
     $sql = $builder->{$action}();
     $statement = $source->prepare($sql);
     $arguments = $builder->getPdoArguments();
     foreach ($arguments as &$argument) {
         // Begin workaround for PDO's poor numeric binding
         $param = $argument->getQueryParameter();
         if (is_numeric($param)) {
             continue;
         }
         if (is_string($param) && strlen($param) > 0 && substr($param, 0, 1) !== ':') {
             continue;
         }
         // End Workaround
         // Ignore parameters that aren't used in this $action (i.e. assignments in select)
         if ('' === $param || strpos($sql, $param) === false) {
             continue;
         }
         $statement->bindValue($param, $argument->value);
     }
     return $statement;
 }