_dba = &$dba; $this->_def = &$def; $this->_model = &$model; } function &createRecord() { $class = $this->_def->getRecordClass(); $ret = &new $class($this->_dba, $this->_def, $this, $this->_model, array()); return $ret; } function &find($id) { $id = intval($id); // todo: might not be needed. if (!isset($this->_cache[$id])) { //geoffrey: removed $this->_def->getField( because it's also used in findBy $this->_cache[$id] = &$this->findBy($this->_def->getPrimaryKey(), $id); } return $this->_cache[$id]; } function &findAll($order = '', $groupby = '', $limit = 0, $end = -1) { return $this->findAllWhere(NULL, array(), $order, $groupby, $limit, $end); } function &findAllByArray($pairs, $order = '', $groupby = '', $limit = 0, $end = -1) { // Generate the WHERE portion $where = ''; $sep = ''; foreach ($pairs as $key => $value) { $where = $sep . $this->_def->getField($key) . "=?"; $sep = ' AND '; } return $this->findAllWhere($where, array_values($pairs), $order, $groupby, $limit, $end); } function &selectAllWhere($select, $where, $values = array(), $order = '', $groupby = '', $limit = 0, $end = -1) { // Put the query together $select = "SELECT " . ((!$select) ? $this->_def->getSelectFields() : ($this->_def->getSelectFields() ? $this->_def->getSelectFields() .", ". $select : $select) ); $from = " FROM " . $this->_def->getSelectTables() . $this->getTempFrom(); $where = ($where) ? " WHERE " . $where . (($this->_def->getSelectWhere()) ? " AND " . $this->_def->getSelectWhere() : '') : (($this->_def->getSelectWhere() ? " WHERE " . $this->_def->getSelectWhere() : '') ); $order = ($order) ? " ORDER BY " . $order : ($this->_def->getSelectOrderby() ? " ORDER BY " . $this->_def->getSelectOrderby() : '' ); $groupby = ($groupby) ? " GROUP BY " . (($this->_def->getSelectGroupby()) ? $this->_def->getSelectGroupby() . (substr_utf($groupby, 0, 6) != "HAVING" ? ", " : " "). $groupby : $groupby) : ($this->_def->getSelectGroupby() ? " GROUP BY " . $this->_def->getSelectGroupby() : '' ); $limit = ($limit) ? " LIMIT " . $limit : ''; $sql = $select.$from.$where.$groupby.$order.$limit; //echo $sql .'
'; // Run the query $result = &$this->_dba->executeQuery($sql, $values); $class = $this->_def->getIteratorClass(); $ret = &new $class($this->_dba, $this->_def, $this, $this->_model, $result); return $ret; } function &findAllWhere($where, $values = array(), $order = '', $groupby = '', $limit = 0, $end = -1) { return $this->selectAllWhere(FALSE, $where, $values, $order, $groupby, $limit, $end); } function &findAllBy($col, $value) { return $this->findAllWhere($this->_def->getField($col) ."=?", array($value), '', '', 0, -1); } function &searchAllWhere($fields, $where, $values = array(), $order = '', $groupby = '', $limit = 0, $end = -1) { foreach($fields as $key => $field) { $fields[$key] = $this->_def->getField($field); } $fields = implode(",", $fields); $select = "MATCH(". $fields .") AGAINST (? IN BOOLEAN MODE) AS search_score"; // values[0] is implied to be what you're matching against. $values[0] = !isset($values[0]) ? "" : $values[0]; $values[0] = preg_replace("~(\s|\t|\n|\r|\n)~", " ", $values[0]); $values[0] = htmlentities($values[0], ENT_QUOTES, K4_CHARSET); $values[0] = str_replace("* ", " ", $values[0]); // don't want to end up with **'s in there $len = strlen_utf($values[0]); if(substr_utf($values[0], $len-1) == '*') { $values[0] = substr_utf($values[0], 0, $len-1); } $values[0] = implode("* ", explode(" ", $values[0])) .'*'; return $this->selectAllWhere($select, $where, $values, $order, $groupby, $limit, $end); } function &findBy($field, $value) { return $this->findWhere($this->_def->getField($field) .'=?', array($value)); } function &findByArray($pairs) { if (empty($pairs)) { return NULL; } // Generate the WHERE portion $where = ''; $sep = ''; foreach ($pairs as $key => $value) { $where .= $sep . $this->_def->getField($key) . "=?"; $sep = ' AND '; } return $this->findWhere($where, array_values($pairs)); } // common function for findWhere and selectWhere function &selectWhere($select, $where, $values = array(), $order = '') { // Put the query together $select = "SELECT " . ((!$select) ? $this->_def->getSelectFields() : ($this->_def->getSelectFields() ? $this->_def->getSelectFields() .", ". $select : $select) ); $from = " FROM " . $this->_def->getSelectTables() . $this->getTempFrom(); $where = ($where && $where != '') ? " WHERE " . $where . (($this->_def->getSelectWhere()) ? " AND " . $this->_def->getSelectWhere() : '') : (($this->_def->getSelectWhere()) ? " WHERE " . $this->_def->getSelectWhere() : '' ); $order = ($order && $order != '') ? " ORDER BY " . $order : ($this->_def->getSelectOrderby() ? " ORDER BY " . $this->_def->getSelectOrderby() : '' ); $groupby = (($this->_def->getSelectGroupby()) ? " GROUP BY " . $this->_def->getSelectGroupby() : '' ); //$limit = ($limit) ? " LIMIT " . $limit : ''; $limit = " LIMIT 1"; $sql = $select.$from.$where.$groupby.$order.$limit; //echo $sql .'
'; // Run the query $result = &$this->_dba->executeQuery($sql, $values); $ret = NULL; // Does the resultset have any records? if ($result->next()) { if ($result->hasNext()) { trigger_error("Selecting a single record returned multiple records", E_USER_WARNING); } $class = $this->_def->getRecordClass(); $ret = &new $class($this->_dba, $this->_def, $this, $this->_model, $result->current()); } return $ret; } function &findWhere($where, $values = array(), $order = '', $limit = 0) { return $this->selectWhere(FALSE, $where, $values, $order, $limit); } function getCountWhere($where, $values = array()) { $count = ($this->_def->getPrimaryKey() ? $this->_def->getField($this->_def->getPrimaryKey()) : "*"); $select = "SELECT COUNT(". $count .") AS row_count FROM ". $this->_def->getSelectTables(); $where = ($where && $where != '') ? " WHERE " . $where . (($this->_def->getSelectWhere()) ? " AND " . $this->_def->getSelectWhere() : '') : (($this->_def->getSelectWhere()) ? " WHERE " . $this->_def->getSelectWhere() : '' ); $sql = $select.$where; $result = &$this->_dba->executeQuery($sql, $values); $count = 0; if($result->next()) { $row = &$result->current(); $count = $row['row_count']; } $result->free(); return $count; } function deleteWhere($where, $values = array()) { $from = "DELETE FROM " . $this->_def->getTable(); $where = ($where && $where != '') ? " WHERE ". $where : ''; return $this->_dba->executeUpdate($from . $where, $values); } function deleteBy($column, $value) { return $this->deleteWhere($column .'=?', array($value)); } function delete($key_value) { if(!$this->_def->getPrimaryKey()) { trigger_error("Deleting from a table without a primary key."); } return $this->deleteWhere($this->_def->getPrimaryKey() .'=?', array($key_value)); } function updateWhere($set, $where, $values = array()) { $sql = "UPDATE ". $this->_def->getTable() ." SET "; $ret = FALSE; if($set != '') { $sql .= $set; if($where != '') { $sql .= " WHERE ". $where; } $ret = $this->_dba->executeUpdate($sql, $values); } return $ret; } function revive(&$record) { $record->revive($this->_dba, $this, $this->_model); } function addTempFrom($from) { $this->_temp_from = ", ". $from ." "; } function getTempFrom() { $ret = ""; $ret .= $this->_temp_from; $this->_temp_from = ""; return $ret; } } ?>