Ejemplo n.º 1
0
 /** @override */
 public function deleteItems(EarthIT_Schema_ResourceClass $rc, EarthIT_Storage_ItemFilter $filter)
 {
     $params = array();
     $params['table'] = $this->sqlGenerator->rcTableExpression($rc);
     $filterSql = $filter->toSql('stuff', $this->dbObjectNamer, new EarthIT_DBC_ParamsBuilder($params));
     $this->sqlRunner->doQuery("DELETE FROM {table} AS stuff\n" . "WHERE {$filterSql}", $params);
 }
 public function updateItems(array $updatedFieldValues, EarthIT_Schema_ResourceClass $rc, EarthIT_Storage_ItemFilter $filter, array $options = array())
 {
     $rcName = $rc->getName();
     $matchedKeys = array();
     if (isset($this->items[$rcName])) {
         foreach ($this->items[$rcName] as $k => $item) {
             if ($filter->matches($item)) {
                 $matchedKeys[] = $k;
             }
         }
     }
     $updated = array();
     foreach ($matchedKeys as $k) {
         $item = $this->items[$rcName][$k];
         $item = $updatedFieldValues + $item;
         $id = EarthIT_Storage_Util::itemId($item, $rc);
         if ($id !== null and $id !== $k) {
             // TODO: Look at options to determine if updating is allowed
             // to overwrite other items
             unset($this->items[$rcName][$k]);
             $this->items[$rcName][$id] = $item;
             $k = $id;
         }
         $updated[$k] = $item;
     }
     return $updated;
 }
 public function makeUpdateQueries(array $updates, EarthIT_Storage_ItemFilter $filter, EarthIT_Schema_ResourceClass $rc, array $options = array())
 {
     if (count($updates) == 0) {
         throw new Exception("Not updating anything!");
         // Maybe we could allow that?  In which case this just becomes a search.
         // Would have to construct the query differently in that case.
     }
     // TODO: Mind the options.
     // This code was copied from _bulkPatchyQueries
     // and committed as soon as the unit test passed.
     // It's probably a bit of a mess.
     // Refactor it if you want to.
     $params = array();
     $PB = new EarthIT_DBC_ParamsBuilder($params);
     $params['table'] = $this->rcTableExpression($rc);
     $conditions = $filter->toSql('stuff', $this->dbObjectNamer, $PB);
     $storableFields = EarthIT_Storage_Util::storableFields($rc);
     $outputColumnValueSqls = array();
     $inputColumnValueSqls = array();
     $columnParamNames = array();
     $fieldsByColumnName = array();
     $columnUpdates = array();
     foreach ($storableFields as $fn => $f) {
         $columnName = $this->dbObjectNamer->getColumnName($rc, $f);
         $fieldColumnNames[$fn] = $columnName;
         $fieldsByColumnName[$columnName] = $f;
         $columnParamName = $PB->newParam('c_');
         $columnParamNames[$columnName] = $columnParamName;
         $params[$columnParamName] = new EarthIT_DBC_SQLIdentifier($columnName);
         $columnValueParamName = $PB->newParam("v_");
         $columnValueParamNames[$columnName] = $columnValueParamName;
         if (array_key_exists($fn, $updates)) {
             $params[$columnValueParamName] = $updates[$fn];
             $columnUpdates[$columnName] = null;
             // Value never actually gets used kekeke
         }
         $columnValueSelectSql = $this->dbInternalToExternalValueSql($f, $rc, "{{$columnParamName}}");
         if ($columnValueSelectSql !== "{{$columnParamName}}") {
             $columnValueSelectSql .= "AS {{$columnParamName}}";
         }
         $outputColumnValueSqls[$columnName] = $columnValueSelectSql;
         $inputColumnValueSqls[$columnName] = $this->dbExternalToInternalValueSql($f, $rc, "{{$columnValueParamName}}");
     }
     $sets = $this->encodeColumnValuePairs($columnUpdates, $columnParamNames, $columnValueParamNames, $rc, $fieldsByColumnName);
     $sql = "UPDATE {table} AS stuff\n" . "SET\n\t" . implode(",\n\t", $sets) . "\n" . "WHERE {$conditions}\n" . "RETURNING\n\t" . implode(",\n\t", $outputColumnValueSqls);
     $returnSaved = true;
     // TODO: Only if requested by options
     return array(new EarthIT_Storage_StorageQuery($sql, $params, $returnSaved));
 }