123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468 |
- <?php
- /* vim: set expandtab sw=4 ts=4 sts=4: */
- /**
- * Saved searches managing
- *
- * @package PhpMyAdmin
- */
- namespace PhpMyAdmin;
- use PhpMyAdmin\Message;
- use PhpMyAdmin\Relation;
- use PhpMyAdmin\Response;
- use PhpMyAdmin\Util;
- /**
- * Saved searches managing
- *
- * @package PhpMyAdmin
- */
- class SavedSearches
- {
- /**
- * Global configuration
- * @var array
- */
- private $_config = null;
- /**
- * Id
- * @var int|null
- */
- private $_id = null;
- /**
- * Username
- * @var string
- */
- private $_username = null;
- /**
- * DB name
- * @var string
- */
- private $_dbname = null;
- /**
- * Saved search name
- * @var string
- */
- private $_searchName = null;
- /**
- * Criterias
- * @var array
- */
- private $_criterias = null;
- /**
- * @var Relation $relation
- */
- private $relation;
- /**
- * Public constructor
- *
- * @param array $config Global configuration
- */
- public function __construct(array $config)
- {
- $this->setConfig($config);
- $this->relation = new Relation();
- }
- /**
- * Setter of id
- *
- * @param int|null $searchId Id of search
- *
- * @return static
- */
- public function setId($searchId)
- {
- $searchId = (int)$searchId;
- if (empty($searchId)) {
- $searchId = null;
- }
- $this->_id = $searchId;
- return $this;
- }
- /**
- * Getter of id
- *
- * @return int|null
- */
- public function getId()
- {
- return $this->_id;
- }
- /**
- * Setter of searchName
- *
- * @param string $searchName Saved search name
- *
- * @return static
- */
- public function setSearchName($searchName)
- {
- $this->_searchName = $searchName;
- return $this;
- }
- /**
- * Getter of searchName
- *
- * @return string
- */
- public function getSearchName()
- {
- return $this->_searchName;
- }
- /**
- * Setter of config
- *
- * @param array $config Global configuration
- *
- * @return static
- */
- public function setConfig(array $config)
- {
- $this->_config = $config;
- return $this;
- }
- /**
- * Getter of config
- *
- * @return array
- */
- public function getConfig()
- {
- return $this->_config;
- }
- /**
- * Setter for criterias
- *
- * @param array|string $criterias Criterias of saved searches
- * @param bool $json Criterias are in JSON format
- *
- * @return static
- */
- public function setCriterias($criterias, $json = false)
- {
- if (true === $json && is_string($criterias)) {
- $this->_criterias = json_decode($criterias, true);
- return $this;
- }
- $aListFieldsToGet = array(
- 'criteriaColumn',
- 'criteriaSort',
- 'criteriaShow',
- 'criteria',
- 'criteriaAndOrRow',
- 'criteriaAndOrColumn',
- 'rows',
- 'TableList'
- );
- $data = array();
- $data['criteriaColumnCount'] = count($criterias['criteriaColumn']);
- foreach ($aListFieldsToGet as $field) {
- if (isset($criterias[$field])) {
- $data[$field] = $criterias[$field];
- }
- }
- /* Limit amount of rows */
- if (!isset($data['rows'])) {
- $data['rows'] = 0;
- } else {
- $data['rows'] = min(
- max(0, intval($data['rows'])),
- 100
- );
- }
- for ($i = 0; $i <= $data['rows']; $i++) {
- $data['Or' . $i] = $criterias['Or' . $i];
- }
- $this->_criterias = $data;
- return $this;
- }
- /**
- * Getter for criterias
- *
- * @return array
- */
- public function getCriterias()
- {
- return $this->_criterias;
- }
- /**
- * Setter for username
- *
- * @param string $username Username
- *
- * @return static
- */
- public function setUsername($username)
- {
- $this->_username = $username;
- return $this;
- }
- /**
- * Getter for username
- *
- * @return string
- */
- public function getUsername()
- {
- return $this->_username;
- }
- /**
- * Setter for DB name
- *
- * @param string $dbname DB name
- *
- * @return static
- */
- public function setDbname($dbname)
- {
- $this->_dbname = $dbname;
- return $this;
- }
- /**
- * Getter for DB name
- *
- * @return string
- */
- public function getDbname()
- {
- return $this->_dbname;
- }
- /**
- * Save the search
- *
- * @return boolean
- */
- public function save()
- {
- if (null == $this->getSearchName()) {
- $message = Message::error(
- __('Please provide a name for this bookmarked search.')
- );
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('fieldWithError', 'searchName');
- $response->addJSON('message', $message);
- exit;
- }
- if (null == $this->getUsername()
- || null == $this->getDbname()
- || null == $this->getSearchName()
- || null == $this->getCriterias()
- ) {
- $message = Message::error(
- __('Missing information to save the bookmarked search.')
- );
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('message', $message);
- exit;
- }
- $savedSearchesTbl
- = Util::backquote($this->_config['cfgRelation']['db']) . "."
- . Util::backquote($this->_config['cfgRelation']['savedsearches']);
- //If it's an insert.
- if (null === $this->getId()) {
- $wheres = array(
- "search_name = '" . $GLOBALS['dbi']->escapeString($this->getSearchName())
- . "'"
- );
- $existingSearches = $this->getList($wheres);
- if (!empty($existingSearches)) {
- $message = Message::error(
- __('An entry with this name already exists.')
- );
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('fieldWithError', 'searchName');
- $response->addJSON('message', $message);
- exit;
- }
- $sqlQuery = "INSERT INTO " . $savedSearchesTbl
- . "(`username`, `db_name`, `search_name`, `search_data`)"
- . " VALUES ("
- . "'" . $GLOBALS['dbi']->escapeString($this->getUsername()) . "',"
- . "'" . $GLOBALS['dbi']->escapeString($this->getDbname()) . "',"
- . "'" . $GLOBALS['dbi']->escapeString($this->getSearchName()) . "',"
- . "'" . $GLOBALS['dbi']->escapeString(json_encode($this->getCriterias()))
- . "')";
- $result = (bool) $this->relation->queryAsControlUser($sqlQuery);
- if (!$result) {
- return false;
- }
- $this->setId($GLOBALS['dbi']->insertId());
- return true;
- }
- //Else, it's an update.
- $wheres = array(
- "id != " . $this->getId(),
- "search_name = '" . $GLOBALS['dbi']->escapeString($this->getSearchName()) . "'"
- );
- $existingSearches = $this->getList($wheres);
- if (!empty($existingSearches)) {
- $message = Message::error(
- __('An entry with this name already exists.')
- );
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('fieldWithError', 'searchName');
- $response->addJSON('message', $message);
- exit;
- }
- $sqlQuery = "UPDATE " . $savedSearchesTbl
- . "SET `search_name` = '"
- . $GLOBALS['dbi']->escapeString($this->getSearchName()) . "', "
- . "`search_data` = '"
- . $GLOBALS['dbi']->escapeString(json_encode($this->getCriterias())) . "' "
- . "WHERE id = " . $this->getId();
- return (bool) $this->relation->queryAsControlUser($sqlQuery);
- }
- /**
- * Delete the search
- *
- * @return boolean
- */
- public function delete()
- {
- if (null == $this->getId()) {
- $message = Message::error(
- __('Missing information to delete the search.')
- );
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('fieldWithError', 'searchId');
- $response->addJSON('message', $message);
- exit;
- }
- $savedSearchesTbl
- = Util::backquote($this->_config['cfgRelation']['db']) . "."
- . Util::backquote($this->_config['cfgRelation']['savedsearches']);
- $sqlQuery = "DELETE FROM " . $savedSearchesTbl
- . "WHERE id = '" . $GLOBALS['dbi']->escapeString($this->getId()) . "'";
- return (bool) $this->relation->queryAsControlUser($sqlQuery);
- }
- /**
- * Load the current search from an id.
- *
- * @return bool Success
- */
- public function load()
- {
- if (null == $this->getId()) {
- $message = Message::error(
- __('Missing information to load the search.')
- );
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('fieldWithError', 'searchId');
- $response->addJSON('message', $message);
- exit;
- }
- $savedSearchesTbl = Util::backquote($this->_config['cfgRelation']['db'])
- . "."
- . Util::backquote($this->_config['cfgRelation']['savedsearches']);
- $sqlQuery = "SELECT id, search_name, search_data "
- . "FROM " . $savedSearchesTbl . " "
- . "WHERE id = '" . $GLOBALS['dbi']->escapeString($this->getId()) . "' ";
- $resList = $this->relation->queryAsControlUser($sqlQuery);
- if (false === ($oneResult = $GLOBALS['dbi']->fetchArray($resList))) {
- $message = Message::error(__('Error while loading the search.'));
- $response = Response::getInstance();
- $response->setRequestStatus($message->isSuccess());
- $response->addJSON('fieldWithError', 'searchId');
- $response->addJSON('message', $message);
- exit;
- }
- $this->setSearchName($oneResult['search_name'])
- ->setCriterias($oneResult['search_data'], true);
- return true;
- }
- /**
- * Get the list of saved searches of a user on a DB
- *
- * @param string[] $wheres List of filters
- *
- * @return array List of saved searches or empty array on failure
- */
- public function getList(array $wheres = array())
- {
- if (null == $this->getUsername()
- || null == $this->getDbname()
- ) {
- return array();
- }
- $savedSearchesTbl = Util::backquote($this->_config['cfgRelation']['db'])
- . "."
- . Util::backquote($this->_config['cfgRelation']['savedsearches']);
- $sqlQuery = "SELECT id, search_name "
- . "FROM " . $savedSearchesTbl . " "
- . "WHERE "
- . "username = '" . $GLOBALS['dbi']->escapeString($this->getUsername()) . "' "
- . "AND db_name = '" . $GLOBALS['dbi']->escapeString($this->getDbname()) . "' ";
- foreach ($wheres as $where) {
- $sqlQuery .= "AND " . $where . " ";
- }
- $sqlQuery .= "order by search_name ASC ";
- $resList = $this->relation->queryAsControlUser($sqlQuery);
- $list = array();
- while ($oneResult = $GLOBALS['dbi']->fetchArray($resList)) {
- $list[$oneResult['id']] = $oneResult['search_name'];
- }
- return $list;
- }
- }
|