From ddd8ad78cf1fb33d1aec6eaca3619842030c5a57 Mon Sep 17 00:00:00 2001 From: rurban Date: Sat, 23 Dec 2006 11:44:56 +0000 Subject: [PATCH] deal with strict references and the order of deletion git-svn-id: svn://svn.code.sf.net/p/phpwiki/code/trunk@5244 96ab9672-09ca-45d6-a79d-3d69d39ca109 --- lib/WikiDB/backend/ADODB.php | 26 +++++++++++++++++--------- lib/WikiDB/backend/PearDB.php | 13 ++++++++----- tests/unit/test.php | 22 +++++++++++++++++----- 3 files changed, 42 insertions(+), 19 deletions(-) diff --git a/lib/WikiDB/backend/ADODB.php b/lib/WikiDB/backend/ADODB.php index e9c5ea1d5..a935d4d61 100644 --- a/lib/WikiDB/backend/ADODB.php +++ b/lib/WikiDB/backend/ADODB.php @@ -1,5 +1,5 @@ lock(array('version','recent','nonempty','page','link')); if ( ($id = $this->_get_pageid($pagename, false)) ) { - $dbh->Execute("DELETE FROM $version_tbl WHERE id=$id"); - $dbh->Execute("DELETE FROM $recent_tbl WHERE id=$id"); $dbh->Execute("DELETE FROM $nonempty_tbl WHERE id=$id"); + $dbh->Execute("DELETE FROM $recent_tbl WHERE id=$id"); + $dbh->Execute("DELETE FROM $version_tbl WHERE id=$id"); $this->set_links($pagename, false); $row = $dbh->GetRow("SELECT COUNT(*) FROM $link_tbl WHERE linkto=$id"); if ($row and $row[0]) { @@ -617,21 +617,24 @@ extends WikiDB_backend } } // purge page table: delete all non-referenced pages - // for all previously linked pages... + // for all previously linked pages, which have no other linkto links if (DEBUG and $oldlinks) { // trigger_error("purge page table: delete all non-referenced pages...", E_USER_NOTICE); foreach ($oldlinks as $id => $name) { // ...check if the page is empty and has no version - if ($dbh->getRow("SELECT $page_tbl.id FROM $page_tbl" + $result = $dbh->getRow("SELECT $page_tbl.id FROM $page_tbl" . " LEFT JOIN $nonempty_tbl USING (id) " . " LEFT JOIN $version_tbl USING (id)" . " WHERE $nonempty_tbl.id is NULL" . " AND $version_tbl.id is NULL" - . " AND $page_tbl.id=$id")) + . " AND $page_tbl.id=$id"); + $linkto = $dbh->getRow("SELECT linkfrom FROM $link_tbl WHERE linkto=$id"); + if ($result and empty($linkto)) { - trigger_error("delete empty and non-referenced link $name ($id)", E_USER_NOTICE); - $dbh->Execute("DELETE FROM $page_tbl WHERE id=$id"); // this purges the link - $dbh->Execute("DELETE FROM $recent_tbl WHERE id=$id"); // may fail + trigger_error("delete empty and non-referenced link $name ($id)", E_USER_NOTICE); + $dbh->Execute("DELETE FROM $recent_tbl WHERE id=$id"); // may fail + $dbh->Execute("DELETE FROM $link_tbl WHERE linkto=$id"); + $dbh->Execute("DELETE FROM $page_tbl WHERE id=$id"); // this purges the link } } } @@ -1536,6 +1539,11 @@ class WikiDB_backend_ADODB_search extends WikiDB_backend_search_sql } // $Log: not supported by cvs2svn $ +// Revision 1.93 2006/12/03 16:25:20 rurban +// remove closing Smart ROLLBACK, cannot be forced if never started. +// remove postgresql user VACUUM, autovacumm must do that. (can be easily +// enabled) +// // Revision 1.92 2006/12/02 21:57:27 rurban // fix WantedPages SQL: no JOIN // clarify first condition in CASE WHEN diff --git a/lib/WikiDB/backend/PearDB.php b/lib/WikiDB/backend/PearDB.php index 27e29f0e7..c070ee603 100644 --- a/lib/WikiDB/backend/PearDB.php +++ b/lib/WikiDB/backend/PearDB.php @@ -1,5 +1,5 @@ pushErrorHandler(new WikiMethodCb($this, '_pear_notice_filter')); $this->_pearerrhandler = true; @@ -915,13 +915,13 @@ extends WikiDB_backend // Cludge Alert! // This page does not exist (already verified before), but exists in the page table. // So we delete this page. - $dbh->query("DELETE FROM $page_tbl WHERE id=$new"); - $dbh->query("DELETE FROM $version_tbl WHERE id=$new"); - $dbh->query("DELETE FROM $recent_tbl WHERE id=$new"); $dbh->query("DELETE FROM $nonempty_tbl WHERE id=$new"); + $dbh->query("DELETE FROM $recent_tbl WHERE id=$new"); + $dbh->query("DELETE FROM $version_tbl WHERE id=$new"); // We have to fix all referring tables to the old id $dbh->query("UPDATE $link_tbl SET linkfrom=$id WHERE linkfrom=$new"); $dbh->query("UPDATE $link_tbl SET linkto=$id WHERE linkto=$new"); + $dbh->query("DELETE FROM $page_tbl WHERE id=$new"); } $dbh->query(sprintf("UPDATE $page_tbl SET pagename='%s' WHERE id=$id", $dbh->escapeSimple($to))); @@ -1246,6 +1246,9 @@ class WikiDB_backend_PearDB_search extends WikiDB_backend_search_sql } // $Log: not supported by cvs2svn $ +// Revision 1.103 2006/12/03 17:11:53 rurban +// #1535832 by matt brown: Check for base 64 encoded version data +// // Revision 1.102 2006/12/02 21:57:27 rurban // fix WantedPages SQL: no JOIN // clarify first condition in CASE WHEN diff --git a/tests/unit/test.php b/tests/unit/test.php index a1dd187b8..bfc900b44 100644 --- a/tests/unit/test.php +++ b/tests/unit/test.php @@ -214,7 +214,7 @@ function purge_testbox() { case 'SQL': case 'ADODB': case 'PDO': - foreach ($dbi->_backend->_table_names as $table) { + foreach (array_reverse($dbi->_backend->_table_names) as $table) { $dbi->genericSqlQuery("DELETE FROM $table"); } break; @@ -576,22 +576,30 @@ class phpwiki_TestCase extends PHPUnit_TestCase { // Test all db backends. foreach ($run_database_backends as $dbtype) { - global $request; + global $request, $DBParams; // if (DEBUG & _DEBUG_TRACE) // printMemoryUsage("PHPUnitInitialized"); $DBParams['dbtype'] = $dbtype; if (string_starts_with($dbtype, 'PearDB_')) { $DBParams['dbtype'] = 'SQL'; - preg_replace("/^([^:]+):/", substr($dbtype, 7).":", $DBParams['dsn']); + $DBParams['dsn'] = preg_replace("/^([^:]+):/", substr($dbtype, 7).":", $DBParams['dsn']); + echo "dsn: ",$DBParams['dsn'],"\n"; } if (string_starts_with($dbtype, 'ADODB_')) { $DBParams['dbtype'] = 'ADODB'; - preg_replace("/^([^:]+):/", substr($dbtype, 6).":", $DBParams['dsn']); + $DBParams['dsn'] = preg_replace("/^([^:]+):/", substr($dbtype, 6).":", $DBParams['dsn']); + echo "dsn: ",$DBParams['dsn'],"\n"; } if (string_starts_with($dbtype, 'PDO_')) { $DBParams['dbtype'] = 'PDO'; - preg_replace("/^([^:]+):/", substr($dbtype, 4).":", $DBParams['dsn']); + $DBParams['dsn'] = preg_replace("/^([^:]+):/", substr($dbtype, 4).":", $DBParams['dsn']); + echo "dsn: ",$DBParams['dsn'],"\n"; } + // sqlite fix: + /* if (preg_match('/sqlite$/', $dbtype)) { + $DBParams['dsn'] = preg_replace("/127\.0\.0\.1/", '', $DBParams['dsn']); + echo "dsn: ",$DBParams['dsn'],"\n"; + } */ $DBParams['directory'] = $cur_dir . '/.testbox'; if ($dbtype == 'flatfile') $DBParams['directory'] = $cur_dir . '/.testbox/flatfile'; @@ -600,6 +608,7 @@ foreach ($run_database_backends as $dbtype) { //$DBParams['dba_handler'] = $database_dba_handler; echo "Testing DB Backend \"$dbtype\" ...\n"; + flush(); $request = new MockRequest($DBParams); if ( ! ENABLE_USER_NEW ) { $request->_user->_request =& $request; @@ -640,6 +649,9 @@ if (isset($HTTP_SERVER_VARS['REQUEST_METHOD'])) echo "\n"; // $Log: not supported by cvs2svn $ +// Revision 1.43 2006/06/05 09:35:02 rurban +// add experimental backend flatfile, minor fixes +// // (c-file-style: "gnu") // Local Variables: -- 2.45.0