SF.net SVN: phpwiki:[11071] trunk

vargenau--- via phpwiki-checkins <[email protected]> Fri, 12 Jan 2024 18:43:34 +0000
Newsgroups gmane.comp.web.wiki.phpwiki.checkins
Message-ID <[email protected]>
Revision: 11071
          http://sourceforge.net/p/phpwiki/code/11071
Author:   vargenau
Date:     2024-01-12 18:43:33 +0000 (Fri, 12 Jan 2024)
Log Message:
-----------
PDO sqlite backend patches by Christof Meerwald

Modified Paths:
--------------
    trunk/lib/DbSession/PDO.php
    trunk/lib/DbSession/SQL.php
    trunk/lib/DbSession/dba.php
    trunk/lib/DbSession.php
    trunk/lib/WikiDB/backend/PDO.php
    trunk/schemas/sqlite-initialize.sql

Added Paths:
-----------
    trunk/lib/WikiDB/backend/PDO_sqlite.php

Modified: trunk/lib/DbSession/PDO.php
===================================================================
--- trunk/lib/DbSession/PDO.php	2023-11-20 16:31:08 UTC (rev 11070)
+++ trunk/lib/DbSession/PDO.php	2024-01-12 18:43:33 UTC (rev 11071)
@@ -32,9 +32,9 @@
 {
     public $_backend_type = "PDO";
 
-    public function __construct($dbh, $table)
+    public function __construct($backend, $table)
     {
-        $this->_dbh = $dbh;
+        $this->_backend = $backend;
         $this->_table = $table;
 
         session_set_save_handler(
@@ -49,11 +49,7 @@
 
     public function & _connect()
     {
-        $dbh = &$this->_dbh;
-        global $DBParams;
-        $db = new WikiDB_backend_PDO($DBParams);
-        $this->_dbh =& $db->_dbh;
-        $this->_backend =& $db;
+        $dbh = &$this->_backend->_dbh;
         return $dbh;
     }
 
@@ -70,9 +66,6 @@
 
     public function _disconnect()
     {
-        if (0 and $this->_dbh) {
-            unset($this->_dbh);
-        }
     }
 
     /**
@@ -118,6 +111,9 @@
         $sth->bindParam(1, $id, PDO::PARAM_STR, 32);
         if ($sth->execute()) {
             $res = $sth->fetchColumn();
+            if (empty($res)) {
+                $res = '';
+            }
         } else {
             $res = '';
         }
@@ -165,10 +161,19 @@
         $remote_addr = $request->get('REMOTE_ADDR');
 
         $this->_backend->beginTransaction();
-        $delete = $dbh->prepare("DELETE FROM $table WHERE sess_id=?");
-        $delete->bindParam(1, $id, PDO::PARAM_STR, 32);
-        $delete->execute();
-        $sth = $dbh->prepare("INSERT INTO $table"
+        $backend_type = $this->_backend->backendType();
+        if (substr($backend_type, 0, 5) == 'mysql' or
+            $backend_type == 'sqlite') {
+            // mysql/sqlite can do it as a single replace command
+            $insert = "REPLACE INTO";
+        } else {
+            // otherwise need to do it as a delete/insert
+            $delete = $dbh->prepare("DELETE FROM $table WHERE sess_id=?");
+            $delete->bindParam(1, $id, PDO::PARAM_STR, 32);
+            $delete->execute();
+            $insert = "INSERT INTO";
+        }
+        $sth = $dbh->prepare("$insert $table"
             . " (sess_id, sess_data, sess_date, sess_ip)"
             . " VALUES (?, ?, ?, ?)");
         $sth->bindParam(1, $id, PDO::PARAM_STR, 32);
@@ -239,7 +244,7 @@
             if (preg_match('|^[a-zA-Z0-9/+=]+$|', $data)) {
                 $data = base64_decode($data);
             }
-            if ($date < 908437560 or $date > 1588437560) {
+            if ($date < 908437560) {
                 $date = 0;
             }
             // session_data contains the <variable name> + "|" + <packed string>

Modified: trunk/lib/DbSession/SQL.php
===================================================================
--- trunk/lib/DbSession/SQL.php	2023-11-20 16:31:08 UTC (rev 11070)
+++ trunk/lib/DbSession/SQL.php	2024-01-12 18:43:33 UTC (rev 11071)
@@ -36,9 +36,9 @@
 {
     public $_backend_type = "SQL";
 
-    public function __construct($dbh, $table)
+    public function __construct($backend, $table)
     {
-        $this->_dbh = $dbh;
+        $this->_dbh = $backend->_dbh;
         $this->_table = $table;
 
         session_set_save_handler(
@@ -248,7 +248,7 @@
             if (preg_match('|^[a-zA-Z0-9/+=]+$|', $data)) {
                 $data = base64_decode($data);
             }
-            if ($date < 908437560 or $date > 1588437560) {
+            if ($date < 908437560) {
                 $date = 0;
             }
             // session_data contains the <variable name> + "|" + <packed string>

Modified: trunk/lib/DbSession/dba.php
===================================================================
--- trunk/lib/DbSession/dba.php	2023-11-20 16:31:08 UTC (rev 11070)
+++ trunk/lib/DbSession/dba.php	2024-01-12 18:43:33 UTC (rev 11071)
@@ -37,9 +37,9 @@
 {
     public $_backend_type = "dba";
 
-    public function __construct($dbh, $table)
+    public function __construct($backend, $table)
     {
-        $this->_dbh = $dbh;
+        $this->_dbh = $backend->_dbh;
         session_set_save_handler(
             array(&$this, 'open'),
             array(&$this, 'close'),
@@ -221,7 +221,7 @@
             }
             // session_data contains the <variable name> + "|" + <packed string>
             // we need just the wiki_user object (might be array as well)
-            if ($date < 908437560 or $date > 1588437560) {
+            if ($date < 908437560) {
                 $date = 0;
             }
             $user = strstr($packed, "wiki_user|");

Modified: trunk/lib/DbSession.php
===================================================================
--- trunk/lib/DbSession.php	2023-11-20 16:31:08 UTC (rev 11070)
+++ trunk/lib/DbSession.php	2024-01-12 18:43:33 UTC (rev 11071)
@@ -52,8 +52,7 @@
 
             $class = "DbSession_" . $db_type;
             if (class_exists($class)) {
-                // dba has no ->_dbh, so this is used for the session link
-                $this->_backend = new $class($dbh->_backend->_dbh, $table);
+                $this->_backend = new $class($dbh->_backend, $table);
                 return;
             }
         }

Modified: trunk/lib/WikiDB/backend/PDO.php
===================================================================
--- trunk/lib/WikiDB/backend/PDO.php	2023-11-20 16:31:08 UTC (rev 11070)
+++ trunk/lib/WikiDB/backend/PDO.php	2024-01-12 18:43:33 UTC (rev 11071)
@@ -82,16 +82,11 @@
             }
         } else {
             list($driver, $dsn) = explode(":", $dbparams['dsn'], 2);
-            foreach (explode(";", trim($dsn)) as $pair) {
-                if ($pair) {
-                    list($option, $value) = explode("=", $pair, 2);
-                    $this->_parsedDSN[$option] = $value;
-                }
-            }
-            $this->_dbh->database = isset($this->_parsedDSN['database'])
-                ? $this->_parsedDSN['database']
-                : $this->_parsedDSN['dbname'];
+            $this->_parsedDSN = array();
         }
+        if (empty($this->_parsedDSN['username'])) {
+            $this->_parsedDSN['username'] = '';
+        }
         if (empty($this->_parsedDSN['password'])) {
             $this->_parsedDSN['password'] = '';
         }
@@ -129,7 +124,7 @@
         $this->_hasTransactions = true;
         try {
             $this->_dbh->beginTransaction();
-            $this->commit();
+            $this->_dbh->commit();
         } catch (PDOException $e) {
             $this->_hasTransactions = false;
         }
@@ -404,7 +399,8 @@
         }
         if (empty($id)) {
             //mysql, mysqli or mysqlt
-            if (substr($dbh->databaseType, 0, 5) == 'mysql') {
+            if (substr($dbh->databaseType, 0, 5) == 'mysql' or
+                $dbh->databaseType == 'sqlite') {
                 // have auto-incrementing, atomic version
                 $sth = $dbh->prepare("INSERT INTO $page_tbl"
                     . " (id,pagename)"
@@ -576,7 +572,8 @@
         $id = $this->_get_pageid($pagename, true);
         $backend_type = $this->backendType();
         // optimize: mysql can do this with one REPLACE INTO.
-        if (substr($backend_type, 0, 5) == 'mysql') {
+        if (substr($backend_type, 0, 5) == 'mysql' or
+            $backend_type == 'sqlite') {
             $sth = $dbh->prepare("REPLACE INTO $version_tbl"
                 . " (id,version,mtime,minor_edit,content,versiondata)"
                 . " VALUES(?,?,?,?,?,?)");
@@ -715,7 +712,7 @@
             if ($sth->fetchColumn()) {
                 // We're still in the link table (dangling link) so we can't delete this
                 // altogether.
-                $dbh->query("UPDATE $page_tbl SET hits=0, pagedata='' WHERE id=$id");
+                $dbh->query("UPDATE $page_tbl SET hits=0, pagedata='', cached_html=NULL WHERE id=$id");
                 $result = 0;
             } else {
                 $dbh->query("DELETE FROM $page_tbl WHERE id=$id");
@@ -1186,7 +1183,8 @@
 
         // optimize: mysql can do this with one REPLACE INTO.
         $backend_type = $this->backendType();
-        if (substr($backend_type, 0, 5) == 'mysql') {
+        if (substr($backend_type, 0, 5) == 'mysql' or
+            $backend_type == 'sqlite') {
             $sth = $dbh->prepare("REPLACE INTO $recent_tbl"
                 . " (id, latestversion, latestmajor, latestminor)"
                 . " SELECT id, $maxversion, $maxmajor, $maxminor"

Added: trunk/lib/WikiDB/backend/PDO_sqlite.php
===================================================================
--- trunk/lib/WikiDB/backend/PDO_sqlite.php	                        (rev 0)
+++ trunk/lib/WikiDB/backend/PDO_sqlite.php	2024-01-12 18:43:33 UTC (rev 11071)
@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © 2023 $ThePhpWikiProgrammingTeam
+ *
+ * This file is part of PhpWiki.
+ *
+ * PhpWiki is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * PhpWiki is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ */
+
+/**
+ * @author: Christof Meerwald
+ */
+require_once 'lib/WikiDB/backend/PDO.php';
+
+class WikiDB_backend_PDO_sqlite extends WikiDB_backend_PDO
+{
+    public function __construct($dbparams)
+    {
+        parent::__construct($dbparams);
+    }
+
+    public function backendType()
+    {
+        return 'sqlite';
+    }
+
+    /*
+     * offset specific syntax within sqlite
+     * convert from,count to SQL "LIMIT $count OFFSET $from"
+     */
+    public function _limit_sql($limit = false)
+    {
+        if ($limit) {
+            list($from, $count) = $this->limit($limit);
+            if ($from) {
+                $limit = " LIMIT $count OFFSET $from";
+            } else {
+                $limit = " LIMIT $count";
+            }
+        } else {
+            $limit = '';
+        }
+        return $limit;
+    }
+}

Modified: trunk/schemas/sqlite-initialize.sql
===================================================================
--- trunk/schemas/sqlite-initialize.sql	2023-11-20 16:31:08 UTC (rev 11070)
+++ trunk/schemas/sqlite-initialize.sql	2024-01-12 18:43:33 UTC (rev 11071)
@@ -34,7 +34,8 @@
 
 CREATE TABLE link (
 	linkfrom        INTEGER NOT NULL,
-	linkto          INTEGER NOT NULL
+	linkto          INTEGER NOT NULL,
+	relation        INTEGER
 );
 CREATE INDEX linkfrom_index ON link (linkfrom);
 CREATE INDEX linkto_index ON link (linkto);

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



_______________________________________________
phpwiki-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/phpwiki-checkins