Example #1
0
 public function testSelectWithSharedLock()
 {
     $args = new ArgumentArray();
     $driver = new MySQLDriver();
     $query = new SelectQuery();
     $query->select(array('id', 'name', 'phone', 'address'))->from('users', 'u')->where('name = :name', [':name' => 'Joan']);
     $query->lockInShareMode();
     $sql = $query->toSql($driver, $args);
     $this->assertEquals('SELECT id, name, phone, address FROM users AS u WHERE name = :name LOCK IN SHARE MODE', $sql);
     $query->forUpdate();
     $sql = $query->toSql($driver, $args);
     $this->assertEquals('SELECT id, name, phone, address FROM users AS u WHERE name = :name FOR UPDATE', $sql);
 }
Example #2
0
 public function load($args, array $options = null)
 {
     if (!$this->currentUserCan($this->getCurrentUser(), 'load', $args)) {
         return $this->reportError('Permission denied. Can not load record.', array('args' => $args));
     }
     $dsId = $this->readSourceId;
     $pk = static::PRIMARY_KEY;
     $query = new SelectQuery();
     $query->from($this->table, $this->alias);
     $conn = $this->getReadConnection();
     $driver = $this->getReadQueryDriver();
     $kVal = null;
     // build query from array.
     if (is_array($args)) {
         $query->select($this->selected ?: '*')->where($args);
     } else {
         $kVal = $args;
         $column = $this->getSchema()->getColumn($pk);
         if (!$column) {
             // This should not happend, every schema should have it's own primary key
             // TODO: Create new exception class for this.
             throw new MissingPrimaryKeyException($this->getSchema(), "Primary key {$pk} is not defined");
         }
         $kVal = $column->deflate($kVal);
         $args = array($pk => $kVal);
         $query->select($this->selected ?: '*')->where($args);
     }
     // generate select * ... for update syntax for MySQL driver
     if (isset($options['for_update']) && $driver instanceof PDOMySQLDriver) {
         $query->forUpdate();
     }
     $arguments = new ArgumentArray();
     $sql = $query->toSql($driver, $arguments);
     // mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation = PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )
     $stm = $conn->prepare($sql);
     $stm->execute($arguments->toArray());
     if (false === ($this->_data = $stm->fetch(PDO::FETCH_ASSOC))) {
         // Record not found is not an exception
         return $this->reportError('Record not found', ['sql' => $sql]);
     }
     return $this->reportSuccess('Data loaded', array('id' => isset($this->_data[$pk]) ? $this->_data[$pk] : null, 'sql' => $sql, 'type' => Result::TYPE_LOAD));
 }