diff --git a/inc/3rdparty/paginator.php b/inc/3rdparty/paginator.php index e880155..306756c 100644 --- a/inc/3rdparty/paginator.php +++ b/inc/3rdparty/paginator.php @@ -9,99 +9,103 @@ class Paginator{ /** - * set the number of items per page. - * - * @var numeric - */ - private $_perPage; + * set the number of items per page. + * + * @var numeric + */ + private $_perPage; - /** - * set get parameter for fetching the page number - * - * @var string - */ - private $_instance; + /** + * set get parameter for fetching the page number + * + * @var string + */ + private $_instance; - /** - * sets the page number. - * - * @var numeric - */ - private $_page; + /** + * sets the page number. + * + * @var numeric + */ + private $_page; - /** - * set the limit for the data source - * - * @var string - */ - private $_limit; + /** + * set the limit for the data source + * + * @var string + */ + private $_limit; - /** - * set the total number of records/items. - * - * @var numeric - */ - private $_totalRows = 0; + /** + * set the total number of records/items. + * + * @var numeric + */ + private $_totalRows = 0; - /** - * __construct - * - * pass values when class is istantiated - * - * @param numeric $_perPage sets the number of iteems per page - * @param numeric $_instance sets the instance for the GET parameter - */ - public function __construct($perPage,$instance){ - $this->_instance = $instance; - $this->_perPage = $perPage; - $this->set_instance(); - } + /** + * __construct + * + * pass values when class is istantiated + * + * @param numeric $_perPage sets the number of iteems per page + * @param numeric $_instance sets the instance for the GET parameter + */ + public function __construct($perPage,$instance){ + $this->_instance = $instance; + $this->_perPage = $perPage; + $this->set_instance(); + } - /** - * get_start - * - * creates the starting point for limiting the dataset - * @return numeric - */ - private function get_start(){ - return ($this->_page * $this->_perPage) - $this->_perPage; - } + /** + * get_start + * + * creates the starting point for limiting the dataset + * @return numeric + */ + private function get_start(){ + return ($this->_page * $this->_perPage) - $this->_perPage; + } - /** - * set_instance - * - * sets the instance parameter, if numeric value is 0 then set to 1 - * - * @var numeric - */ - private function set_instance(){ - $this->_page = (int) (!isset($_GET[$this->_instance]) ? 1 : $_GET[$this->_instance]); - $this->_page = ($this->_page == 0 ? 1 : $this->_page); - } + /** + * set_instance + * + * sets the instance parameter, if numeric value is 0 then set to 1 + * + * @var numeric + */ + private function set_instance(){ + $this->_page = (int) (!isset($_GET[$this->_instance]) ? 1 : $_GET[$this->_instance]); + $this->_page = ($this->_page == 0 ? 1 : $this->_page); + } - /** - * set_total - * - * collect a numberic value and assigns it to the totalRows - * - * @var numeric - */ - public function set_total($_totalRows){ - $this->_totalRows = $_totalRows; - } + /** + * set_total + * + * collect a numberic value and assigns it to the totalRows + * + * @var numeric + */ + public function set_total($_totalRows){ + $this->_totalRows = $_totalRows; + } - /** - * get_limit - * - * returns the limit for the data source, calling the get_start method and passing in the number of items perp page - * - * @return string - */ - public function get_limit(){ - return "LIMIT ".$this->get_start().",$this->_perPage"; + /** + * get_limit + * + * returns the limit for the data source, calling the get_start method and passing in the number of items perp page + * + * @return string + */ + public function get_limit(){ + if (STORAGE == 'postgres') { + return "LIMIT ".$this->_perPage." OFFSET ".$this->get_start(); + } else { + return "LIMIT ".$this->get_start().",".$this->_perPage; } + } /** * page_links @@ -112,87 +116,87 @@ class Paginator{ * @var sting $ext optionally pass in extra parameters to the GET * @return string returns the html menu */ - public function page_links($path='?',$ext=null) - { - $adjacents = "2"; - $prev = $this->_page - 1; - $next = $this->_page + 1; - $lastpage = ceil($this->_totalRows/$this->_perPage); - $lpm1 = $lastpage - 1; + public function page_links($path='?',$ext=null) + { + $adjacents = "2"; + $prev = $this->_page - 1; + $next = $this->_page + 1; + $lastpage = ceil($this->_totalRows/$this->_perPage); + $lpm1 = $lastpage - 1; - $pagination = ""; - if($lastpage > 1) - { - $pagination .= "\n"; + } - return $pagination; - } + return $pagination; + } } diff --git a/inc/store/sqlite.class.php b/inc/poche/Database.class.php similarity index 86% rename from inc/store/sqlite.class.php rename to inc/poche/Database.class.php index 4c628dc..a226b31 100644 --- a/inc/store/sqlite.class.php +++ b/inc/poche/Database.class.php @@ -8,15 +8,25 @@ * @license http://www.wtfpl.net/ see COPYING file */ -class Sqlite extends Store { +class Database { + + #postgresql + public static $db_path = 'pgsql:host=localhost;dbname=poche'; + public static $user = 'postgres'; + public static $password = 'postgres'; + #sqlite + // public static $db_path = 'sqlite:./db/poche.sqlite'; + // public static $user = ''; + // public static $password = ''; + #mysql + // public static $db_path = 'mysql:host=localhost;dbname=poche'; + // public static $user = 'root'; + // public static $password = 'root'; - public static $db_path = 'sqlite:./db/poche.sqlite'; var $handle; function __construct() { - parent::__construct(); - - $this->handle = new PDO(self::$db_path); + $this->handle = new PDO(self::$db_path, self::$user, self::$password); $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } @@ -91,6 +101,7 @@ class Sqlite extends Store { catch (Exception $e) { Tools::logm('execute query error : '.$e->getMessage()); + return FALSE; } } @@ -103,8 +114,6 @@ class Sqlite extends Store { } public function retrieveOneById($id, $user_id) { - parent::__construct(); - $entry = NULL; $sql = "SELECT * FROM entries WHERE id=? AND user_id=?"; $params = array(intval($id), $user_id); @@ -115,8 +124,6 @@ class Sqlite extends Store { } public function getEntriesByView($view, $user_id, $limit = '') { - parent::__construct(); - switch ($_SESSION['sort']) { case 'ia': @@ -140,11 +147,11 @@ class Sqlite extends Store { { case 'archive': $sql = "SELECT * FROM entries WHERE user_id=? AND is_read=? " . $order; - $params = array($user_id, -1); + $params = array($user_id, 1); break; case 'fav' : $sql = "SELECT * FROM entries WHERE user_id=? AND is_fav=? " . $order; - $params = array($user_id, -1); + $params = array($user_id, 1); break; default: $sql = "SELECT * FROM entries WHERE user_id=? AND is_read=? " . $order; @@ -161,7 +168,6 @@ class Sqlite extends Store { } public function add($url, $title, $content, $user_id) { - parent::__construct(); $sql_action = 'INSERT INTO entries ( url, title, content, user_id ) VALUES (?, ?, ?, ?)'; $params_action = array($url, $title, $content, $user_id); $query = $this->executeQuery($sql_action, $params_action); @@ -169,7 +175,6 @@ class Sqlite extends Store { } public function deleteById($id, $user_id) { - parent::__construct(); $sql_action = "DELETE FROM entries WHERE id=? AND user_id=?"; $params_action = array($id, $user_id); $query = $this->executeQuery($sql_action, $params_action); @@ -177,21 +182,18 @@ class Sqlite extends Store { } public function favoriteById($id, $user_id) { - parent::__construct(); - $sql_action = "UPDATE entries SET is_fav=~is_fav WHERE id=? AND user_id=?"; + $sql_action = "UPDATE entries SET is_fav=NOT is_fav WHERE id=? AND user_id=?"; $params_action = array($id, $user_id); $query = $this->executeQuery($sql_action, $params_action); } public function archiveById($id, $user_id) { - parent::__construct(); - $sql_action = "UPDATE entries SET is_read=~is_read WHERE id=? AND user_id=?"; + $sql_action = "UPDATE entries SET is_read=NOT is_read WHERE id=? AND user_id=?"; $params_action = array($id, $user_id); $query = $this->executeQuery($sql_action, $params_action); } public function getLastId() { - parent::__construct(); return $this->getHandle()->lastInsertId(); } } diff --git a/inc/poche/Poche.class.php b/inc/poche/Poche.class.php index ce5bb54..0a43df7 100644 --- a/inc/poche/Poche.class.php +++ b/inc/poche/Poche.class.php @@ -16,9 +16,9 @@ class Poche public $messages; public $pagination; - function __construct($storage_type) + function __construct() { - $this->store = new $storage_type(); + $this->store = new Database(); $this->init(); $this->messages = new Messages(); @@ -52,9 +52,13 @@ class Poche # template engine $loader = new Twig_Loader_Filesystem(TPL); - $this->tpl = new Twig_Environment($loader, array( - 'cache' => CACHE, - )); + if (DEBUG_POCHE) { + $twig_params = array(); + } + else { + $twig_params = array('cache' => CACHE); + } + $this->tpl = new Twig_Environment($loader, $twig_params); $this->tpl->addExtension(new Twig_Extensions_Extension_I18n()); # filter to display domain name of an url $filter = new Twig_SimpleFilter('getDomain', 'Tools::getDomain'); @@ -124,18 +128,19 @@ class Poche Tools::redirect(); break; case 'delete': + $msg = 'delete link #' . $id; if ($this->store->deleteById($id, $this->user->getId())) { if (DOWNLOAD_PICTURES) { remove_directory(ABS_PATH . $id); } $this->messages->add('s', _('the link has been deleted successfully')); - Tools::logm('delete link #' . $id); } else { $this->messages->add('e', _('the link wasn\'t deleted')); - Tools::logm('error : can\'t delete link #' . $id); + $msg = 'error : can\'t delete link #' . $id; } - Tools::redirect(); + Tools::logm($msg); + Tools::redirect('?'); break; case 'toggle_fav' : $this->store->favoriteById($id, $this->user->getId()); @@ -385,7 +390,7 @@ class Poche if (file_exists($cache_file) && (filemtime($cache_file) > (time() - 86400 ))) { $version = file_get_contents($cache_file); } else { - $version = file_get_contents('http://www.inthepoche.com/' . $which); + $version = file_get_contents('http://static.inthepoche.com/versions/' . $which); file_put_contents($cache_file, $version, LOCK_EX); } return $version; diff --git a/inc/poche/Tools.class.php b/inc/poche/Tools.class.php index 8b339ea..d0e4316 100644 --- a/inc/poche/Tools.class.php +++ b/inc/poche/Tools.class.php @@ -77,6 +77,7 @@ class Tools $url = $ref; } } + self::logm('redirect to ' . $url); header('Location: '.$url); exit(); } @@ -198,6 +199,7 @@ class Tools if (DEBUG_POCHE) { $t = strval(date('Y/m/d_H:i:s')) . ' - ' . $_SERVER["REMOTE_ADDR"] . ' - ' . strval($message) . "\n"; file_put_contents(CACHE . '/log.txt', $t, FILE_APPEND); + error_log('DEBUG POCHE : ' . $message); } } diff --git a/inc/poche/config.inc.php b/inc/poche/config.inc.php index a8a9c03..834b18e 100644 --- a/inc/poche/config.inc.php +++ b/inc/poche/config.inc.php @@ -24,7 +24,7 @@ define ('CACHE', './cache'); define ('LANG', 'en_EN.UTF8'); define ('PAGINATION', '10'); define ('THEME', 'light'); -$storage_type = 'sqlite'; # sqlite, mysql, (file, not yet) +define ('STORAGE','postgres'); # postgres, mysql, sqlite # /!\ Be careful if you change the lines below /!\ require_once './inc/poche/User.class.php'; @@ -34,8 +34,7 @@ require_once './inc/3rdparty/class.messages.php'; require_once './inc/poche/Poche.class.php'; require_once './inc/3rdparty/Readability.php'; require_once './inc/3rdparty/Encoding.php'; -require_once './inc/store/store.class.php'; -require_once './inc/store/' . $storage_type . '.class.php'; +require_once './inc/poche/Database.class.php'; require_once './vendor/autoload.php'; require_once './inc/3rdparty/simple_html_dom.php'; require_once './inc/3rdparty/paginator.php'; @@ -45,7 +44,7 @@ if (DOWNLOAD_PICTURES) { require_once './inc/poche/pochePictures.php'; } -$poche = new Poche($storage_type); +$poche = new Poche(); #XSRF protection with token // if (!empty($_POST)) { diff --git a/inc/store/file.class.php b/inc/store/file.class.php deleted file mode 100644 index c9d85dc..0000000 --- a/inc/store/file.class.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file - */ - -class File extends Store { - function __construct() { - - } - - public function add() { - - } - - public function retrieveOneById($id) { - - } - - public function retrieveOneByURL($url) { - - } - - public function deleteById($id) { - - } - - public function favoriteById($id) { - - } - - public function archiveById($id) { - - } - - public function getEntriesByView($view) { - - } - - public function getLastId() { - - } -} diff --git a/inc/store/mysql.class.php b/inc/store/mysql.class.php deleted file mode 100644 index 8b7f83d..0000000 --- a/inc/store/mysql.class.php +++ /dev/null @@ -1,195 +0,0 @@ - - * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file - */ - -class Mysql extends Store { - - public static $db_path = 'mysql:host=localhost;dbname=poche'; - public static $user = 'root'; - public static $password = 'root'; - var $handle; - - function __construct() { - parent::__construct(); - - $this->handle = new PDO(self::$db_path, self::$user, self::$password); - $this->handle->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - } - - private function getHandle() { - return $this->handle; - } - - public function isInstalled() { - // $sql = "SELECT name FROM sqlite_sequence WHERE name=?"; - // $query = $this->executeQuery($sql, array('config')); - // $hasConfig = $query->fetchAll(); - - // if (count($hasConfig) == 0) - // return FALSE; - - // if (!$this->getLogin() || !$this->getPassword()) - // return FALSE; - - return TRUE; - } - - public function install($login, $password) { - $this->getHandle()->exec('CREATE TABLE IF NOT EXISTS "config" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "name" VARCHAR UNIQUE, "value" BLOB)'); - - $this->handle->exec('CREATE TABLE IF NOT EXISTS "entries" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "title" VARCHAR, "url" VARCHAR UNIQUE , "is_read" INTEGER DEFAULT 0, "is_fav" INTEGER DEFAULT 0, "content" BLOB)'); - - if (!$this->getLogin()) { - $sql_login = 'INSERT INTO config ( name, value ) VALUES (?, ?)'; - $params_login = array('login', $login); - $query = $this->executeQuery($sql_login, $params_login); - } - - if (!$this->getPassword()) { - $sql_pass = 'INSERT INTO config ( name, value ) VALUES (?, ?)'; - $params_pass = array('password', $password); - $query = $this->executeQuery($sql_pass, $params_pass); - } - - return TRUE; - } - - public function getLogin() { - $sql = "SELECT value FROM config WHERE name=?"; - $query = $this->executeQuery($sql, array('login')); - $login = $query->fetchAll(); - - return isset($login[0]['value']) ? $login[0]['value'] : FALSE; - } - - public function getPassword() { - $sql = "SELECT value FROM config WHERE name=?"; - $query = $this->executeQuery($sql, array('password')); - $pass = $query->fetchAll(); - - return isset($pass[0]['value']) ? $pass[0]['value'] : FALSE; - } - - public function updatePassword($password) - { - $sql_update = "UPDATE config SET value=? WHERE name='password'"; - $params_update = array($password); - $query = $this->executeQuery($sql_update, $params_update); - } - - private function executeQuery($sql, $params) { - try - { - $query = $this->getHandle()->prepare($sql); - $query->execute($params); - return $query; - } - catch (Exception $e) - { - Tools::logm('execute query error : '.$e->getMessage()); - } - } - - public function retrieveAll() { - $sql = "SELECT * FROM entries ORDER BY id"; - $query = $this->executeQuery($sql, array()); - $entries = $query->fetchAll(); - - return $entries; - } - - public function retrieveOneById($id) { - parent::__construct(); - - $entry = NULL; - $sql = "SELECT * FROM entries WHERE id=?"; - $params = array(intval($id)); - $query = $this->executeQuery($sql, $params); - $entry = $query->fetchAll(); - - return $entry[0]; - } - - public function getEntriesByView($view) { - parent::__construct(); - - switch ($_SESSION['sort']) - { - case 'ia': - $order = 'ORDER BY id'; - break; - case 'id': - $order = 'ORDER BY id DESC'; - break; - case 'ta': - $order = 'ORDER BY lower(title)'; - break; - case 'td': - $order = 'ORDER BY lower(title) DESC'; - break; - default: - $order = 'ORDER BY id'; - break; - } - - switch ($view) - { - case 'archive': - $sql = "SELECT * FROM entries WHERE is_read=? " . $order; - $params = array(1); - break; - case 'fav' : - $sql = "SELECT * FROM entries WHERE is_fav=? " . $order; - $params = array(1); - break; - default: - $sql = "SELECT * FROM entries WHERE is_read=? " . $order; - $params = array(0); - break; - } - - $query = $this->executeQuery($sql, $params); - $entries = $query->fetchAll(); - - return $entries; - } - - public function add($url, $title, $content) { - parent::__construct(); - $sql_action = 'INSERT INTO entries ( url, title, content ) VALUES (?, ?, ?)'; - $params_action = array($url, $title, $content); - $query = $this->executeQuery($sql_action, $params_action); - return $query; - } - - public function deleteById($id) { - parent::__construct(); - $sql_action = "DELETE FROM entries WHERE id=?"; - $params_action = array($id); - $query = $this->executeQuery($sql_action, $params_action); - return $query; - } - - public function favoriteById($id) { - parent::__construct(); - $sql_action = "UPDATE entries SET is_fav = IF (is_fav, 0, 1)"; - $query = $this->executeQuery($sql_action, array()); - } - - public function archiveById($id) { - parent::__construct(); - $sql_action = "UPDATE entries SET is_read = IF (is_read, 0, 1)"; - $query = $this->executeQuery($sql_action, array()); - } - - public function getLastId() { - parent::__construct(); - return $this->getHandle()->lastInsertId(); - } -} diff --git a/inc/store/store.class.php b/inc/store/store.class.php deleted file mode 100644 index d6e6301..0000000 --- a/inc/store/store.class.php +++ /dev/null @@ -1,55 +0,0 @@ - - * @copyright 2013 - * @license http://www.wtfpl.net/ see COPYING file - */ - -class Store { - function __construct() { - - } - - public function login() { - - } - - public function add() { - - } - - public function retrieveAll() { - - } - - public function retrieveOneById($id) { - - } - - public function retrieveOneByURL($url) { - - } - - public function deleteById($id) { - - } - - public function favoriteById($id) { - - } - - public function archiveById($id) { - - } - - public function getEntriesByView($view) { - - } - - public function getLastId() { - - } -} diff --git a/tpl/_footer.twig b/tpl/_footer.twig index a541e6e..b74d907 100644 --- a/tpl/_footer.twig +++ b/tpl/_footer.twig @@ -1,3 +1,4 @@ \ No newline at end of file