namespace pq\Gateway;
-use \pq\Query\Expr;
+use \pq\Query\Expressible;
-class Cell
+class Cell extends Expressible implements \ArrayAccess
{
/**
* @var \pq\Gateway\Row
protected $row;
/**
- * @var string
+ * @var bool
*/
- protected $name;
-
- /**
- * @var mixed
- */
- protected $data;
+ protected $dirty;
/**
* @param \pq\Gateway\Row $row
* @param string $name
* @param mixed $data
+ * @param bool $dirty
*/
- function __construct(Row $row, $name, $data) {
+ function __construct(Row $row, $name, $data, $dirty = false) {
+ parent::__construct($name, $data);
$this->row = $row;
- $this->name = $name;
- $this->data = $data;
+ $this->dirty = $dirty;
}
/**
- * Get value as string
- * @return string
- */
- function __toString() {
- return (string) $this->data;
- }
-
- /**
- * Test whether the value is an unevaluated expression
+ * Check whether the cell has been modified
* @return bool
*/
- function isExpr() {
- return $this->data instanceof Expr;
+ function isDirty() {
+ return (bool) $this->dirty;
}
/**
- * Get value
- * @return mixed
+ * Set the value
+ * @param mixed $data
+ * @return \pq\Gateway\Cell
*/
- function get() {
- return $this->data;
+ function set($data) {
+ if ($data instanceof Row) {
+ $this->row->__set($data->getTable()->getName() . "_id", $data->id);
+ $this->row->__unset($this->name);
+ return $this;
+ }
+ if ($data instanceof Cell) {
+ $data = $data->get();
+ }
+ parent::set($data);
+ $this->dirty = true;
+ return $this;
}
/**
* @return \pq\Gateway\Cell
*/
function mod($data, $op = null) {
- if (!($this->data instanceof Expr)) {
- $this->data = new Expr($this->name);
- /*
- if (!isset($this->data)) {
- $this->data = new Expr($this->name);
- } elseif (is_numeric($this->data)) {
- $this->data = new Expr($this->data);
- } else {
- $this->data = new Expr("%s", $this->row->getTable()->getConnection()->quote($this->data));
- }
- */
- }
-
- if ($data instanceof Expr) {
- $this->data->add($data);
- } elseif (!isset($op) && is_numeric($data)) {
- $this->data->add(new Expr("+ $data"));
- } else {
+ if (is_string($data)) {
$data = $this->row->getTable()->getConnection()->quote($data);
- $this->data->add(new Expr("%s %s"), isset($op) ? $op : "||", $data);
}
+ parent::mod($data, $op);
+ $this->dirty = true;
return $this;
}
- /**
- * Set the value in this cell
- * @param mixed $data
- * @return \pq\Gateway\Cell
- */
- function set($data) {
- $this->data = $data;
- return $this;
+ function offsetGet($o) {
+ if (isset($this->data) && !is_array($this->data)) {
+ throw new \UnexpectedValueException("Cell data is not an array");
+ }
+ return $this->data[$o];
+ }
+
+ function offsetSet($o, $v) {
+ if (isset($this->data) && !is_array($this->data)) {
+ throw new \UnexpectedValueException("Cell data is not an array");
+ }
+ if (isset($o)) {
+ $this->data[$o] = $v;
+ } else {
+ $this->data[] = $v;
+ }
+ $this->dirty = true;
+ }
+
+ function offsetExists($o) {
+ if (isset($this->data) && !is_array($this->data)) {
+ throw new \UnexpectedValueException("Cell data is not an array");
+ }
+ return isset($this->data[$o]);
+ }
+
+ function offsetUnset($o) {
+ if (isset($this->data) && !is_array($this->data)) {
+ throw new \UnexpectedValueException("Cell data is not an array");
+ }
+ unset($this->data[$o]);
+ $this->dirty = true;
}
}