Also for UPDATE
[core.git] / inc / classes / main / database / databases / class_LocalFileDatabase.php
index 6a6dd559aa848bc01ac4a69b38d7bf9bc61e6cb1..b6db990441dabd37cd30dadffd8336042725f7cc 100644 (file)
@@ -6,7 +6,7 @@
  *
  * @author             Roland Haeder <webmaster@ship-simu.org>
  * @version            0.0.0
- * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team
+ * @copyright  Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
  * @license            GNU GPL 3.0 or any newer version
  * @link               http://www.ship-simu.org
  *
@@ -48,20 +48,10 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
        private $lastContents = array();
 
        /**
-        * Wether the "connection is already up
+        * Whether the "connection is already up
         */
        private $alreadyConnected = false;
 
-       /**
-        * Last error message
-        */
-       private $lastError = '';
-
-       /**
-        * Last exception
-        */
-       private $lastException = NULL;
-
        /**
         * Table information array
         */
@@ -106,24 +96,6 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                return $databaseInstance;
        }
 
-       /**
-        * Getter for last error message
-        *
-        * @return      $lastError      Last error message
-        */
-       public final function getLastError () {
-               return $this->lastError;
-       }
-
-       /**
-        * Getter for last exception
-        *
-        * @return      $lastException  Last thrown exception
-        */
-       public final function getLastException () {
-               return $this->lastException;
-       }
-
        /**
         * Setter for the last read file
         *
@@ -135,17 +107,6 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                $this->lastFile = (string) $fqfn;
        }
 
-       /**
-        * Reset the last error and exception instance. This should be done after
-        * a successfull "query"
-        *
-        * @return      void
-        */
-       private final function resetLastError () {
-               $this->lastError = '';
-               $this->lastException = NULL;
-       }
-
        /**
         * Getter for last read file
         *
@@ -200,6 +161,9 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
         * @return      $dataArray
         */
        private function getDataArrayFromFile ($fqfn) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Reading elements from database file ' . $fqfn . ' ...');
+
                // Get a file pointer
                $fileInstance = FrameworkFileInputPointer::createFrameworkFileInputPointer($fqfn);
 
@@ -216,6 +180,9 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                // Unserialize it
                $dataArray = unserialize($serializedData);
 
+               // Debug message
+               //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Read ' . count($dataArray) . ' elements from database file ' . $fqfn . '.');
+
                // Finally return it
                return $dataArray;
        }
@@ -228,6 +195,9 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
         * @return      void
         */
        private function writeDataArrayToFqfn ($fqfn, array $dataArray) {
+               // Debug message
+               //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Flushing ' . count($dataArray) . ' elements to database file ' . $fqfn . ' ...');
+
                // Get a file pointer instance
                $fileInstance = FrameworkFileOutputPointer::createFrameworkFileOutputPointer($fqfn, 'w');
 
@@ -239,6 +209,9 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
 
                // Close the file pointer
                $fileInstance->closeFile();
+
+               // Debug message
+               //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Flushing ' . count($dataArray) . ' elements to database file completed.');
        }
 
        /**
@@ -385,9 +358,9 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                                                // Get criteria element
                                                $criteria = $criteriaInstance->getCriteriaElemnent($key);
 
-                                               // Is the criteria met?
-                                               //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: criteria[' . gettype($criteria) . ']=' . $criteria . ',()=' . strlen($criteria) . ',value=' . $value . ',()=' . strlen($value));
-                                               if ((!is_null($criteria)) && ($criteria == $value))  {
+                                               // Is the criteria met or none set?
+                                               //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: criteria[' . gettype($criteria) . ']=' . $criteria . ';()=' . strlen($criteria) . ',criteriaInstance()=' . $criteriaInstance->count() . ',value(' . strlen($value) . ')=' . $value);
+                                               if (((!is_null($criteria)) && ($criteria == $value)) || ($criteriaInstance->count() == 0))  {
                                                        // Shall we skip this entry?
                                                        if ($criteriaInstance->getSkip() > 0) {
                                                                // We shall skip some entries
@@ -423,19 +396,17 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                        $directoryInstance->closeDirectory();
                        unset($directoryInstance);
 
-                       // Reset last error message and exception
-                       $this->resetLastError();
+                       // Reset last exception
+                       $this->resetLastException();
                } catch (PathIsNoDirectoryException $e) {
                        // Path not found means "table not found" for real databases...
-                       $this->lastException = $e;
-                       $this->lastError     = $e->getMessage();
+                       $this->setLastException($e);
 
                        // So throw an SqlException here with faked error message
                        throw new SqlException (array($this, sprintf("Table &#39;%s&#39; not found", $tableName), self::DB_CODE_TABLE_MISSING), self::EXCEPTION_SQL_QUERY);
                } catch (FrameworkException $e) {
                        // Catch all exceptions and store them in last error
-                       $this->lastException = $e;
-                       $this->lastError     = $e->getMessage();
+                       $this->setLastException($e);
                }
 
                // Return the gathered result
@@ -461,12 +432,11 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                        // Update the primary key
                        $this->updatePrimaryKey($dataSetInstance);
 
-                       // Reset last error message and exception
-                       $this->resetLastError();
+                       // Reset last exception
+                       $this->resetLastException();
                } catch (FrameworkException $e) {
                        // Catch all exceptions and store them in last error
-                       $this->lastException = $e;
-                       $this->lastError     = $e->getMessage();
+                       $this->setLastException($e);
 
                        // Throw an SQL exception
                        throw new SqlException(array($this, sprintf("Cannot write data to table &#39;%s&#39;, is the table created?", $dataSetInstance->getTableName()), self::DB_CODE_TABLE_UNWRITEABLE), self::EXCEPTION_SQL_QUERY);
@@ -500,12 +470,14 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                        $searchInstance = $dataSetInstance->getSearchInstance();
 
                        // Read the directory with some exceptions
-                       while (($dataFile = $directoryInstance->readDirectoryExcept(array('.', '..', '.htaccess', '.svn', "info." . $this->getFileExtension()))) && ($limitFound < $searchInstance->getLimit())) {
+                       while (($dataFile = $directoryInstance->readDirectoryExcept(array('.', '..', '.htaccess', '.svn', 'info.' . $this->getFileExtension()))) && ($limitFound < $searchInstance->getLimit())) {
                                // Does the extension match?
                                if (substr($dataFile, -(strlen($this->getFileExtension()))) !== $this->getFileExtension()) {
+                                       // Debug message
+                                       /* NOISY-DEBUG: */ $this->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension());
                                        // Skip this file!
                                        continue;
-                               }
+                               } // END - if
 
                                // Open this file for reading
                                $dataArray = $this->getDataArrayFromFile($pathName . $dataFile);
@@ -518,8 +490,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                                                $criteria = $searchInstance->getCriteriaElemnent($key);
 
                                                // Is the criteria met?
-                                               if ((!is_null($criteria)) && ($criteria == $value))  {
-
+                                               if (((!is_null($criteria)) && ($criteria == $value)) || ($searchInstance->count() == 0))  {
                                                        // Shall we skip this entry?
                                                        if ($searchInstance->getSkip() > 0) {
                                                                // We shall skip some entries
@@ -552,12 +523,11 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend
                        // Update the primary key
                        $this->updatePrimaryKey($dataSetInstance);
 
-                       // Reset last error message and exception
-                       $this->resetLastError();
+                       // Reset last exception
+                       $this->resetLastException();
                } catch (FrameworkException $e) {
                        // Catch all exceptions and store them in last error
-                       $this->lastException = $e;
-                       $this->lastError = $e->getMessage();
+                       $this->setLastException($e);
 
                        // Throw an SQL exception
                        throw new SqlException(array($this, sprintf("Cannot write data to table &#39;%s&#39;, is the table created?", $dataSetInstance->getTableName()), self::DB_CODE_TABLE_UNWRITEABLE), self::EXCEPTION_SQL_QUERY);