diff --git a/code/PostgreSQLDatabase.php b/code/PostgreSQLDatabase.php index 9cd6f52..7a6befc 100644 --- a/code/PostgreSQLDatabase.php +++ b/code/PostgreSQLDatabase.php @@ -872,7 +872,7 @@ class PostgreSQLDatabase extends SS_Database { * * @return boolean */ - function clear_cached_fieldlist($tableName=false){ + function clearCachedFieldlist($tableName=false){ if($tableName!=false){ unset(self::$cached_fieldlists[$tableName]); } else @@ -1554,15 +1554,13 @@ class PostgreSQLDatabase extends SS_Database { * helper function in Database? */ public function sqlQueryToString(SQLQuery $sqlQuery) { - if (!$sqlQuery->from) return ''; $distinct = $sqlQuery->distinct ? "DISTINCT " : ""; if($sqlQuery->delete) { $text = "DELETE "; } else if($sqlQuery->select) { $text = "SELECT $distinct" . implode(", ", $sqlQuery->select); } - $text .= " FROM " . implode(" ", $sqlQuery->from); - + if($sqlQuery->from) $text .= " FROM " . implode(" ", $sqlQuery->from); if($sqlQuery->where) $text .= " WHERE (" . $sqlQuery->getFilter(). ")"; if($sqlQuery->groupby) $text .= " GROUP BY " . implode(", ", $sqlQuery->groupby); if($sqlQuery->having) $text .= " HAVING ( " . implode(" ) AND ( ", $sqlQuery->having) . " )"; @@ -1683,10 +1681,17 @@ class PostgreSQLDatabase extends SS_Database { ); foreach($result as $row){ - if($row['table_name']=='SiteTree') + if($row['table_name']=='SiteTree') { $showInSearch="AND \"ShowInSearch\"=1 "; - else + } elseif($row['table_name']=='File') { + // File.ShowInSearch was added later, keep the database driver backwards compatible + // by checking for its existence first + $fields = $this->fieldList($row['table_name']); + if(array_key_exists('ShowInSearch', $fields)) $showInSearch="AND \"ShowInSearch\"=1 "; + else $showInSearch=''; + } else { $showInSearch=''; + } //public function extendedSQL($filter = "", $sort = "", $limit = "", $join = "", $having = ""){ $query=singleton($row['table_name'])->extendedSql("\"" . $row['table_name'] . "\".\"" . $row['column_name'] . "\" " . $this->default_fts_search_method . ' q ' . $showInSearch, ''); @@ -1749,6 +1754,13 @@ class PostgreSQLDatabase extends SS_Database { else return false; } + + /** + * @deprecated 1.0 Use transactionStart() (method required for 2.4.x) + */ + public function startTransaction($transaction_mode=false, $session_characteristics=false){ + $this->transactionStart($transaction_mode, $session_characteristics); + } /* * Start a prepared transaction @@ -1784,6 +1796,13 @@ class PostgreSQLDatabase extends SS_Database { DB::query('ROLLBACK;'); } + + /** + * @deprecated 1.0 Use transactionEnd() (method required for 2.4.x) + */ + public function endTransaction(){ + $this->transactionEnd(); + } /* * Commit everything inside this transaction so far diff --git a/tests/PostgreSQLDatabaseTest.php b/tests/PostgreSQLDatabaseTest.php new file mode 100644 index 0000000..6c65184 --- /dev/null +++ b/tests/PostgreSQLDatabaseTest.php @@ -0,0 +1,48 @@ +supportsTransactions() == true + && DB::getConn() instanceof PostgreSQLDatabase + ){ + + $page=new Page(); + $page->Title='Read only success'; + $page->write(); + + DB::getConn()->transactionStart('READ ONLY'); + + try { + $page=new Page(); + $page->Title='Read only page failed'; + $page->write(); + } catch (Exception $e) { + //could not write this record + //We need to do a rollback or a commit otherwise we'll get error messages + DB::getConn()->transactionRollback(); + } + + DB::getConn()->transactionEnd(); + + DataObject::flush_and_destroy_cache(); + + $success=DataObject::get('Page', "\"Title\"='Read only success'"); + $fail=DataObject::get('Page', "\"Title\"='Read only page failed'"); + + //This page should be in the system + $this->assertTrue(is_object($success) && $success->exists()); + + //This page should NOT exist, we had 'read only' permissions + $this->assertFalse(is_object($fail) && $fail->exists()); + + } else { + $this->markTestSkipped('Current database is not PostgreSQL'); + } + + } +} \ No newline at end of file