summaryrefslogtreecommitdiff
path: root/classes/db
diff options
context:
space:
mode:
Diffstat (limited to 'classes/db')
-rw-r--r--classes/db/mysql.php73
-rw-r--r--classes/db/mysqli.php77
-rw-r--r--classes/db/pdo.php100
-rw-r--r--classes/db/pgsql.php82
-rw-r--r--classes/db/prefs.php190
-rw-r--r--classes/db/stmt.php32
6 files changed, 554 insertions, 0 deletions
diff --git a/classes/db/mysql.php b/classes/db/mysql.php
new file mode 100644
index 000000000..aab05aca2
--- /dev/null
+++ b/classes/db/mysql.php
@@ -0,0 +1,73 @@
+<?php
+class Db_Mysql implements IDb {
+ private $link;
+
+ function connect($host, $user, $pass, $db, $port) {
+ $this->link = mysql_connect($host, $user, $pass);
+
+ if ($this->link) {
+ $result = mysql_select_db($db, $this->link);
+ if (!$result) {
+ die("Can't select DB: " . mysql_error($this->link));
+ }
+
+ $this->init();
+
+ return $this->link;
+ } else {
+ die("Unable to connect to database (as $user to $host, database $db): " . mysql_error());
+ }
+ }
+
+ function escape_string($s, $strip_tags = true) {
+ if ($strip_tags) $s = strip_tags($s);
+
+ return mysql_real_escape_string($s, $this->link);
+ }
+
+ function query($query, $die_on_error = true) {
+ $result = mysql_query($query, $this->link);
+ if (!$result) {
+ user_error("Query $query failed: " . ($this->link ? mysql_error($this->link) : "No connection"),
+ $die_on_error ? E_USER_ERROR : E_USER_WARNING);
+ }
+ return $result;
+ }
+
+ function fetch_assoc($result) {
+ return mysql_fetch_assoc($result);
+ }
+
+
+ function num_rows($result) {
+ return mysql_num_rows($result);
+ }
+
+ function fetch_result($result, $row, $param) {
+ return mysql_result($result, $row, $param);
+ }
+
+ function close() {
+ return mysql_close($this->link);
+ }
+
+ function affected_rows($result) {
+ return mysql_affected_rows($this->link);
+ }
+
+ function last_error() {
+ return mysql_error();
+ }
+
+ function init() {
+ $this->query("SET time_zone = '+0:0'");
+
+ if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) {
+ $this->query("SET NAMES " . MYSQL_CHARSET);
+ }
+
+ return true;
+ }
+
+}
+?>
diff --git a/classes/db/mysqli.php b/classes/db/mysqli.php
new file mode 100644
index 000000000..550df6f15
--- /dev/null
+++ b/classes/db/mysqli.php
@@ -0,0 +1,77 @@
+<?php
+class Db_Mysqli implements IDb {
+ private $link;
+
+ function connect($host, $user, $pass, $db, $port) {
+ if ($port)
+ $this->link = mysqli_connect($host, $user, $pass, $db, $port);
+ else
+ $this->link = mysqli_connect($host, $user, $pass, $db);
+
+ if ($this->link) {
+ $this->init();
+
+ return $this->link;
+ } else {
+ die("Unable to connect to database (as $user to $host, database $db): " . mysqli_error());
+ }
+ }
+
+ function escape_string($s, $strip_tags = true) {
+ if ($strip_tags) $s = strip_tags($s);
+
+ return mysqli_real_escape_string($this->link, $s);
+ }
+
+ function query($query, $die_on_error = true) {
+ $result = mysqli_query($this->link, $query);
+ if (!$result) {
+ user_error("Query $query failed: " . ($this->link ? mysqli_error($this->link) : "No connection"),
+ $die_on_error ? E_USER_ERROR : E_USER_WARNING);
+ }
+
+ return $result;
+ }
+
+ function fetch_assoc($result) {
+ return mysqli_fetch_assoc($result);
+ }
+
+
+ function num_rows($result) {
+ return mysqli_num_rows($result);
+ }
+
+ function fetch_result($result, $row, $param) {
+ if (mysqli_data_seek($result, $row)) {
+ $line = mysqli_fetch_assoc($result);
+ return $line[$param];
+ } else {
+ return false;
+ }
+ }
+
+ function close() {
+ return mysqli_close($this->link);
+ }
+
+ function affected_rows($result) {
+ return mysqli_affected_rows($this->link);
+ }
+
+ function last_error() {
+ return mysqli_error();
+ }
+
+ function init() {
+ $this->query("SET time_zone = '+0:0'");
+
+ if (defined('MYSQL_CHARSET') && MYSQL_CHARSET) {
+ $this->query("SET NAMES " . MYSQL_CHARSET);
+ }
+
+ return true;
+ }
+
+}
+?>
diff --git a/classes/db/pdo.php b/classes/db/pdo.php
new file mode 100644
index 000000000..126f5150a
--- /dev/null
+++ b/classes/db/pdo.php
@@ -0,0 +1,100 @@
+<?php
+class Db_PDO implements IDb {
+ private $pdo;
+
+ function connect($host, $user, $pass, $db, $port) {
+ $connstr = DB_TYPE . ":host=$host;dbname=$db";
+
+ if (DB_TYPE == "mysql") $connstr .= ";charset=utf8";
+
+ try {
+ $this->pdo = new PDO($connstr, $user, $pass);
+ $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+ $this->init();
+ } catch (PDOException $e) {
+ die($e->getMessage());
+ }
+
+ return $this->pdo;
+ }
+
+ function escape_string($s, $strip_tags = true) {
+ if ($strip_tags) $s = strip_tags($s);
+
+ $qs = $this->pdo->quote($s);
+
+ return mb_substr($qs, 1, mb_strlen($qs)-2);
+ }
+
+ function query($query, $die_on_error = true) {
+ try {
+ return new Db_Stmt($this->pdo->query($query));
+ } catch (PDOException $e) {
+ user_error($e->getMessage(), $die_on_error ? E_USER_ERROR : E_USER_WARNING);
+ }
+ }
+
+ function fetch_assoc($result) {
+ try {
+ if ($result) {
+ return $result->fetch();
+ } else {
+ return null;
+ }
+ } catch (PDOException $e) {
+ user_error($e->getMessage(), E_USER_WARNING);
+ }
+ }
+
+ function num_rows($result) {
+ try {
+ if ($result) {
+ return $result->rowCount();
+ } else {
+ return false;
+ }
+ } catch (PDOException $e) {
+ user_error($e->getMessage(), E_USER_WARNING);
+ }
+ }
+
+ function fetch_result($result, $row, $param) {
+ return $result->fetch_result($row, $param);
+ }
+
+ function close() {
+ $this->pdo = null;
+ }
+
+ function affected_rows($result) {
+ try {
+ if ($result) {
+ return $result->rowCount();
+ } else {
+ return null;
+ }
+ } catch (PDOException $e) {
+ user_error($e->getMessage(), E_USER_WARNING);
+ }
+ }
+
+ function last_error() {
+ return join(" ", $this->pdo->errorInfo());
+ }
+
+ function init() {
+ switch (DB_TYPE) {
+ case "pgsql":
+ $this->query("set client_encoding = 'UTF-8'");
+ $this->query("set datestyle = 'ISO, european'");
+ $this->query("set TIME ZONE 0");
+ case "mysql":
+ $this->query("SET time_zone = '+0:0'");
+ return;
+ }
+
+ return true;
+ }
+
+}
+?>
diff --git a/classes/db/pgsql.php b/classes/db/pgsql.php
new file mode 100644
index 000000000..4d860790b
--- /dev/null
+++ b/classes/db/pgsql.php
@@ -0,0 +1,82 @@
+<?php
+class Db_Pgsql implements IDb {
+ private $link;
+
+ function connect($host, $user, $pass, $db, $port) {
+ $string = "dbname=$db user=$user";
+
+ if ($pass) {
+ $string .= " password=$pass";
+ }
+
+ if ($host) {
+ $string .= " host=$host";
+ }
+
+ if (is_numeric($port) && $port > 0) {
+ $string = "$string port=" . $port;
+ }
+
+ $this->link = pg_connect($string);
+
+ if (!$this->link) {
+ die("Unable to connect to database (as $user to $host, database $db):" . pg_last_error());
+ }
+
+ $this->init();
+
+ return $this->link;
+ }
+
+ function escape_string($s, $strip_tags = true) {
+ if ($strip_tags) $s = strip_tags($s);
+
+ return pg_escape_string($s);
+ }
+
+ function query($query, $die_on_error = true) {
+ $result = pg_query($query);
+
+ if (!$result) {
+ $query = htmlspecialchars($query); // just in case
+ user_error("Query $query failed: " . ($this->link ? pg_last_error($this->link) : "No connection"),
+ $die_on_error ? E_USER_ERROR : E_USER_WARNING);
+ }
+ return $result;
+ }
+
+ function fetch_assoc($result) {
+ return pg_fetch_assoc($result);
+ }
+
+
+ function num_rows($result) {
+ return pg_num_rows($result);
+ }
+
+ function fetch_result($result, $row, $param) {
+ return pg_fetch_result($result, $row, $param);
+ }
+
+ function close() {
+ return pg_close($this->link);
+ }
+
+ function affected_rows($result) {
+ return pg_affected_rows($result);
+ }
+
+ function last_error() {
+ return pg_last_error($this->link);
+ }
+
+ function init() {
+ $this->query("set client_encoding = 'UTF-8'");
+ pg_set_client_encoding("UNICODE");
+ $this->query("set datestyle = 'ISO, european'");
+ $this->query("set TIME ZONE 0");
+
+ return true;
+ }
+}
+?>
diff --git a/classes/db/prefs.php b/classes/db/prefs.php
new file mode 100644
index 000000000..26fb4666b
--- /dev/null
+++ b/classes/db/prefs.php
@@ -0,0 +1,190 @@
+<?php
+class Db_Prefs {
+ private $dbh;
+ private static $instance;
+ private $cache;
+
+ function __construct() {
+ $this->dbh = Db::get();
+ $this->cache = array();
+
+ if ($_SESSION["uid"]) $this->cache();
+ }
+
+ private function __clone() {
+ //
+ }
+
+ public static function get() {
+ if (self::$instance == null)
+ self::$instance = new self();
+
+ return self::$instance;
+ }
+
+ function cache() {
+ $profile = false;
+
+ $user_id = $_SESSION["uid"];
+ @$profile = $_SESSION["profile"];
+
+ if ($profile) {
+ $profile_qpart = "profile = '$profile' AND";
+ } else {
+ $profile_qpart = "profile IS NULL AND";
+ }
+
+ if (get_schema_version() < 63) $profile_qpart = "";
+
+ $result = db_query("SELECT
+ value,ttrss_prefs_types.type_name as type_name,ttrss_prefs.pref_name AS pref_name
+ FROM
+ ttrss_user_prefs,ttrss_prefs,ttrss_prefs_types
+ WHERE
+ $profile_qpart
+ ttrss_prefs.pref_name NOT LIKE '_MOBILE%' AND
+ ttrss_prefs_types.id = type_id AND
+ owner_uid = '$user_id' AND
+ ttrss_user_prefs.pref_name = ttrss_prefs.pref_name");
+
+ while ($line = db_fetch_assoc($result)) {
+ if ($user_id == $_SESSION["uid"]) {
+ $pref_name = $line["pref_name"];
+
+ $this->cache[$pref_name]["type"] = $line["type_name"];
+ $this->cache[$pref_name]["value"] = $line["value"];
+ }
+ }
+ }
+
+ function read($pref_name, $user_id = false, $die_on_error = false) {
+
+ $pref_name = db_escape_string($pref_name);
+ $profile = false;
+
+ if (!$user_id) {
+ $user_id = $_SESSION["uid"];
+ @$profile = $_SESSION["profile"];
+ } else {
+ $user_id = sprintf("%d", $user_id);
+ }
+
+ if (isset($this->cache[$pref_name])) {
+ $tuple = $this->cache[$pref_name];
+ return $this->convert($tuple["value"], $tuple["type"]);
+ }
+
+ if ($profile) {
+ $profile_qpart = "profile = '$profile' AND";
+ } else {
+ $profile_qpart = "profile IS NULL AND";
+ }
+
+ if (get_schema_version() < 63) $profile_qpart = "";
+
+ $result = db_query("SELECT
+ value,ttrss_prefs_types.type_name as type_name
+ FROM
+ ttrss_user_prefs,ttrss_prefs,ttrss_prefs_types
+ WHERE
+ $profile_qpart
+ ttrss_user_prefs.pref_name = '$pref_name' AND
+ ttrss_prefs_types.id = type_id AND
+ owner_uid = '$user_id' AND
+ ttrss_user_prefs.pref_name = ttrss_prefs.pref_name");
+
+ if (db_num_rows($result) > 0) {
+ $value = db_fetch_result($result, 0, "value");
+ $type_name = db_fetch_result($result, 0, "type_name");
+
+ if ($user_id == $_SESSION["uid"]) {
+ $this->cache[$pref_name]["type"] = $type_name;
+ $this->cache[$pref_name]["value"] = $value;
+ }
+
+ return $this->convert($value, $type_name);
+
+ } else {
+ user_error("Fatal error, unknown preferences key: $pref_name", $die_on_error ? E_USER_ERROR : E_USER_WARNING);
+ return null;
+ }
+ }
+
+ function convert($value, $type_name) {
+ if ($type_name == "bool") {
+ return $value == "true";
+ } else if ($type_name == "integer") {
+ return (int)$value;
+ } else {
+ return $value;
+ }
+ }
+
+ function write($pref_name, $value, $user_id = false, $strip_tags = true) {
+ $pref_name = db_escape_string($pref_name);
+ $value = db_escape_string($value, $strip_tags);
+
+ if (!$user_id) {
+ $user_id = $_SESSION["uid"];
+ @$profile = $_SESSION["profile"];
+ } else {
+ $user_id = sprintf("%d", $user_id);
+ $prefs_cache = false;
+ }
+
+ if ($profile) {
+ $profile_qpart = "AND profile = '$profile'";
+ } else {
+ $profile_qpart = "AND profile IS NULL";
+ }
+
+ if (get_schema_version() < 63) $profile_qpart = "";
+
+ $type_name = "";
+ $current_value = "";
+
+ if (isset($this->cache[$pref_name])) {
+ $type_name = $this->cache[$pref_name]["type"];
+ $current_value = $this->cache[$pref_name]["value"];
+ }
+
+ if (!$type_name) {
+ $result = db_query("SELECT type_name
+ FROM ttrss_prefs,ttrss_prefs_types
+ WHERE pref_name = '$pref_name' AND type_id = ttrss_prefs_types.id");
+
+ if (db_num_rows($result) > 0)
+ $type_name = db_fetch_result($result, 0, "type_name");
+ } else if ($current_value == $value) {
+ return;
+ }
+
+ if ($type_name) {
+ if ($type_name == "bool") {
+ if ($value == "1" || $value == "true") {
+ $value = "true";
+ } else {
+ $value = "false";
+ }
+ } else if ($type_name == "integer") {
+ $value = sprintf("%d", $value);
+ }
+
+ if ($pref_name == 'USER_TIMEZONE' && $value == '') {
+ $value = 'UTC';
+ }
+
+ db_query("UPDATE ttrss_user_prefs SET
+ value = '$value' WHERE pref_name = '$pref_name'
+ $profile_qpart
+ AND owner_uid = " . $_SESSION["uid"]);
+
+ if ($user_id == $_SESSION["uid"]) {
+ $this->cache[$pref_name]["type"] = $type_name;
+ $this->cache[$pref_name]["value"] = $value;
+ }
+ }
+ }
+
+}
+?>
diff --git a/classes/db/stmt.php b/classes/db/stmt.php
new file mode 100644
index 000000000..4d3596ef1
--- /dev/null
+++ b/classes/db/stmt.php
@@ -0,0 +1,32 @@
+<?php
+class Db_Stmt {
+ private $stmt;
+ private $cache;
+
+ function __construct($stmt) {
+ $this->stmt = $stmt;
+ $this->cache = false;
+ }
+
+ function fetch_result($row, $param) {
+ if (!$this->cache) {
+ $this->cache = $this->stmt->fetchAll();
+ }
+
+ if (isset($this->cache[$row])) {
+ return $this->cache[$row][$param];
+ } else {
+ user_error("Unable to jump to row $row", E_USER_WARNING);
+ return false;
+ }
+ }
+
+ function rowCount() {
+ return $this->stmt->rowCount();
+ }
+
+ function fetch() {
+ return $this->stmt->fetch();
+ }
+}
+?>