Fix bookmarks app to work with postgresql.

Rework the bookmark app to manage postgresql.
Add a fetchOne function into the PdoStmtWrapper
Fix a tipo in comments.
remotes/origin/stable
Brice Maron 14 years ago
parent b0127e3918
commit 1f6be85719
  1. 12
      apps/bookmarks/ajax/addBookmark.php
  2. 2
      apps/bookmarks/ajax/editBookmark.php
  3. 55
      apps/bookmarks/ajax/updateList.php
  4. 11
      lib/db.php

@ -33,6 +33,8 @@ OC_JSON::checkAppEnabled('bookmarks');
$CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" );
if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
$_ut = "strftime('%s','now')"; $_ut = "strftime('%s','now')";
} elseif($CONFIG_DBTYPE == 'pgsql') {
$_ut = 'date_part(\'epoch\',now())::integer';
} else { } else {
$_ut = "UNIX_TIMESTAMP()"; $_ut = "UNIX_TIMESTAMP()";
} }
@ -51,7 +53,15 @@ $params=array(
OC_User::getUser() OC_User::getUser()
); );
$query->execute($params); $query->execute($params);
$b_id = OC_DB::insertid();
if($CONFIG_DBTYPE == 'pgsql')
{
$query = OC_DB::prepare("SELECT currval('*PREFIX*bookmarks_id_seq')");
$b_id = $query->execute()->fetchOne();
} else {
$b_id = OC_DB::insertid();
}
if($b_id !== false) { if($b_id !== false) {
$query = OC_DB::prepare(" $query = OC_DB::prepare("

@ -33,6 +33,8 @@ OC_JSON::checkAppEnabled('bookmarks');
$CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" ); $CONFIG_DBTYPE = OC_Config::getValue( "dbtype", "sqlite" );
if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
$_ut = "strftime('%s','now')"; $_ut = "strftime('%s','now')";
} elseif($CONFIG_DBTYPE == 'pgsql') {
$_ut = 'date_part(\'epoch\',now())::integer';
} else { } else {
$_ut = "UNIX_TIMESTAMP()"; $_ut = "UNIX_TIMESTAMP()";
} }

@ -38,6 +38,9 @@ $filterTag = isset($_GET['tag']) ? '%' . htmlspecialchars_decode($_GET['tag']) .
if($filterTag){ if($filterTag){
$sqlFilterTag = 'HAVING tags LIKE ?'; $sqlFilterTag = 'HAVING tags LIKE ?';
$params[] = $filterTag; $params[] = $filterTag;
if($CONFIG_DBTYPE == 'pgsql' ) {
$sqlFilterTag = 'HAVING array_to_string(array_agg(tag), \' \') LIKE ?';
}
} else { } else {
$sqlFilterTag = ''; $sqlFilterTag = '';
} }
@ -58,26 +61,40 @@ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){
$_gc_separator = 'SEPARATOR \' \''; $_gc_separator = 'SEPARATOR \' \'';
} }
$query = OC_DB::prepare(' if($CONFIG_DBTYPE == 'pgsql' ){
SELECT id, url, title, $query = OC_DB::prepare('
CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id SELECT id, url, title, array_to_string(array_agg(tag), \' \') as tags
THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) FROM *PREFIX*bookmarks
ELSE \' \' LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
END WHERE
AS tags *PREFIX*bookmarks.user_id = ?
FROM *PREFIX*bookmarks GROUP BY id, url, title
LEFT JOIN *PREFIX*bookmarks_tags ON 1=1 '.$sqlFilterTag.'
WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id ORDER BY *PREFIX*bookmarks.'.$sqlSort.'
OR *PREFIX*bookmarks.id NOT IN ( LIMIT 10
SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags OFFSET ?');
} else {
$query = OC_DB::prepare('
SELECT id, url, title,
CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
THEN GROUP_CONCAT( tag ' .$_gc_separator. ' )
ELSE \' \'
END
AS tags
FROM *PREFIX*bookmarks
LEFT JOIN *PREFIX*bookmarks_tags ON 1=1
WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id
OR *PREFIX*bookmarks.id NOT IN (
SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags
)
) )
) AND *PREFIX*bookmarks.user_id = ?
AND *PREFIX*bookmarks.user_id = ? GROUP BY url
GROUP BY url '.$sqlFilterTag.'
'.$sqlFilterTag.' ORDER BY *PREFIX*bookmarks.'.$sqlSort.'
ORDER BY *PREFIX*bookmarks.'.$sqlSort.' LIMIT ?, 10');
LIMIT ?, 10'); }
$bookmarks = $query->execute($params)->fetchAll(); $bookmarks = $query->execute($params)->fetchAll();
OC_JSON::success(array('data' => $bookmarks)); OC_JSON::success(array('data' => $bookmarks));

@ -28,7 +28,7 @@ class OC_DB {
const BACKEND_PDO=0; const BACKEND_PDO=0;
const BACKEND_MDB2=1; const BACKEND_MDB2=1;
static private $connection; //the prefered conenction to use, either PDO or MDB2 static private $connection; //the prefered connection to use, either PDO or MDB2
static private $backend=null; static private $backend=null;
static private $MDB2=false; static private $MDB2=false;
static private $PDO=false; static private $PDO=false;
@ -480,4 +480,13 @@ class PDOStatementWrapper{
public function __call($name,$arguments){ public function __call($name,$arguments){
return call_user_func_array(array($this->statement,$name),$arguments); return call_user_func_array(array($this->statement,$name),$arguments);
} }
/**
* Provide a simple fetchOne.
* fetch single column from the next row
* @param int $colnum the column number to fetch
*/
public function fetchOne($colnum = 0){
return $this->statement->fetchColumn($colnum);
}
} }

Loading…
Cancel
Save