*
* A configurable 'file_io_class' is being used as "storage backend".
*
- * @author Roland Haeder <webmaster@ship-simu.org>
+ * @author Roland Haeder <webmaster@shipsimu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2012 Core Developer Team
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2013 Core Developer Team
* @license GNU GPL 3.0 or any newer version
- * @link http://www.ship-simu.org
+ * @link http://www.shipsimu.org
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-class LocalFileDatabase extends BaseDatabaseBackend implements DatabaseBackendInterface {
+class LocalFileDatabase extends BaseDatabaseBackend implements DatabaseBackend {
/**
* The file's extension
*/
/**
* Whether the "connection is already up
*/
- private $alreadyConnected = false;
+ private $alreadyConnected = FALSE;
/**
* Table information array
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Writing ' . strlen($compressedData) . ' bytes ...');
// Write this data BASE64 encoded to the file
- $this->getFileIoInstance()->saveFile($fqfn, $compressedData);
+ $this->getFileIoInstance()->saveFile($fqfn, $compressedData, $this);
// Debug message
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Flushing ' . count($dataArray) . ' elements to database file completed.');
$this->writeDataArrayToFqfn($fqfn, $this->tableInfo[$dataSetInstance->getTableName()]);
}
+ /**
+ * Updates the table info file from given dataset instance
+ *
+ * @param $dataSetInstance An instance of a database set class
+ * @return void
+ */
+ private function updateTableInfoFile (StoreableCriteria $dataSetInstance) {
+ // "Cache" table name
+ $tableName = $dataSetInstance->getTableName();
+
+ // Create FQFN for creating the table information file
+ $fqfn = $this->generateFqfnFromDataSet($dataSetInstance, 'info');
+
+ // Get the data out from dataset in a local array
+ $this->tableInfo[$tableName]['primary'] = $dataSetInstance->getPrimaryKey();
+ $this->tableInfo[$tableName]['last_updated'] = time();
+
+ // Write the data to the file
+ $this->writeDataArrayToFqfn($fqfn, $this->tableInfo[$tableName]);
+ }
+
/**
* Updates the primary key information or creates the table info file if not found
*
* @return void
*/
private function updatePrimaryKey (StoreableCriteria $dataSetInstance) {
+ // "Cache" table name
+ $tableName = $dataSetInstance->getTableName();
+
// Get the information array from lower method
$infoArray = $this->getContentsFromTableInfoFile($dataSetInstance);
// Is the primary key there?
- if (!isset($this->tableInfo['primary'])) {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: tableInfo=' . print_r($this->tableInfo, TRUE));
+ if (!isset($this->tableInfo[$tableName]['primary'])) {
// Then create the info file
$this->createTableInfoFile($dataSetInstance);
- } elseif (($this->getConfigInstance()->getConfigEntry('db_update_primary_forced') == 'Y') && ($dataSetInstance->getPrimaryKey() != $this->tableInfo['primary'])) {
+ } elseif (($this->getConfigInstance()->getConfigEntry('db_update_primary_forced') == 'Y') && ($dataSetInstance->getPrimaryKey() != $this->tableInfo[$tableName]['primary'])) {
// Set the array element
- $this->tableInfo[$dataSetInstance->getTableName()]['primary'] = $dataSetInstance->getPrimaryKey();
+ $this->tableInfo[$tableName]['primary'] = $dataSetInstance->getPrimaryKey();
// Update the entry
$this->updateTableInfoFile($dataSetInstance);
// Read the file
$dataArray = $this->getDataArrayFromFile($pathName . $dataFile);
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',dataArray='.print_r($dataArray,true));
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',dataArray='.print_r($dataArray, TRUE));
// Is this an array?
if (is_array($dataArray)) {
+ // Default is nothing found
+ $isFound = TRUE;
+
// Search in the criteria with FMFW (First Matches, First Wins)
foreach ($dataArray as $key => $value) {
- // Is the criteria met or none set?
- if ($searchInstance->isCriteriaMatching($key, $value)) {
- // Shall we skip this entry?
- if ($searchInstance->getSkip() > 0) {
- // We shall skip some entries
- if ($skipFound < $searchInstance->getSkip()) {
- // Skip this entry
- $skipFound++;
- break;
- } // END - if
+ // Make sure value is not bool
+ assert(!is_bool($value));
+
+ // Found one entry?
+ $isFound = (($isFound === TRUE) && ($searchInstance->isCriteriaMatching($key, $value)));
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: key=' . $key . ',value=' . $value . ',isFound=' . intval($isFound));
+ } // END - foreach
+
+ // Is all found?
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: isFound=' . intval($isFound) . ',limitFound=' . $limitFound . ',limit=' . $searchInstance->getLimit());
+ if ($isFound === TRUE) {
+ // Shall we skip this entry?
+ if ($searchInstance->getSkip() > 0) {
+ // We shall skip some entries
+ if ($skipFound < $searchInstance->getSkip()) {
+ // Skip this entry
+ $skipFound++;
+ break;
} // END - if
+ } // END - if
- // Set id number
- $dataArray[$this->getIndexKey()] = $idx;
+ // Set id number
+ $dataArray[$this->getIndexKey()] = $idx;
- // Entry found!
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: indexKey=' . $this->getIndexKey() . ',idx=' . $idx . ',dataArray=' . print_r($dataArray, true));
- $resultData[BaseDatabaseBackend::RESULT_INDEX_ROWS][] = $dataArray;
+ // Entry found!
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: indexKey=' . $this->getIndexKey() . ',idx=' . $idx . ',dataArray=' . print_r($dataArray, TRUE));
+ array_push($resultData[BaseDatabaseBackend::RESULT_INDEX_ROWS], $dataArray);
- // Count found entries up
- $limitFound++;
- break;
- } // END - if
- } // END - foreach
+ // Count found entries up
+ $limitFound++;
+ } // END - if
} else {
// Throw an exception here
- throw new SqlException(array($this, sprintf("File '%s' contains invalid data.", $dataFile), self::DB_CODE_DATA_FILE_CORRUPT), self::EXCEPTION_SQL_QUERY);
+ throw new SqlException(array($this, sprintf('File '%s' contains invalid data.', $dataFile), self::DB_CODE_DATA_FILE_CORRUPT), self::EXCEPTION_SQL_QUERY);
}
// Count entry up
$this->setLastException($e);
// So throw an SqlException here with faked error message
- throw new SqlException (array($this, sprintf("Table '%s' not found", $tableName), self::DB_CODE_TABLE_MISSING), self::EXCEPTION_SQL_QUERY);
+ throw new SqlException (array($this, sprintf('Table '%s' 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->setLastException($e);
$this->setLastException($e);
// Throw an SQL exception
- throw new SqlException(array($this, sprintf("Cannot write data to table '%s', is the table created?", $dataSetInstance->getTableName()), self::DB_CODE_TABLE_UNWRITEABLE), self::EXCEPTION_SQL_QUERY);
+ throw new SqlException(array($this, sprintf('Cannot write data to table '%s', is the table created?', $dataSetInstance->getTableName()), self::DB_CODE_TABLE_UNWRITEABLE), self::EXCEPTION_SQL_QUERY);
}
}
// Open this file for reading
$dataArray = $this->getDataArrayFromFile($pathName . $dataFile);
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',dataArray='.print_r($dataArray,true));
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',dataArray='.print_r($dataArray, TRUE));
// Is this an array?
if (is_array($dataArray)) {
+ // Default is nothing found
+ $isFound = TRUE;
+
// Search in the criteria with FMFW (First Matches, First Wins)
foreach ($dataArray as $key => $value) {
- // Is the criteria met?
- if ($searchInstance->isCriteriaMatching($key, $value)) {
- // Shall we skip this entry?
- if ($searchInstance->getSkip() > 0) {
- // We shall skip some entries
- if ($skipFound < $searchInstance->getSkip()) {
- // Skip this entry
- $skipFound++;
- break;
- } // END - if
+ // Make sure value is not bool
+ assert(!is_bool($value));
+
+ // Found one entry?
+ $isFound = (($isFound === TRUE) && ($searchInstance->isCriteriaMatching($key, $value)));
+ } // END - foreach
+
+ // Is all found?
+ if ($isFound === TRUE) {
+ // Shall we skip this entry?
+ if ($searchInstance->getSkip() > 0) {
+ // We shall skip some entries
+ if ($skipFound < $searchInstance->getSkip()) {
+ // Skip this entry
+ $skipFound++;
+ break;
} // END - if
+ } // END - if
- // Entry found, so update it
- foreach ($searchArray as $searchKey => $searchValue) {
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: criteriaKey=' . $searchKey . ',criteriaValue=' . $searchValue);
- $dataArray[$searchKey] = $searchValue;
- } // END - foreach
+ // Entry found, so update it
+ foreach ($searchArray as $searchKey => $searchValue) {
+ // Make sure the value is not bool again
+ assert(!is_bool($searchValue));
+ assert($searchKey != $this->indexKey);
- // Write the data to a local file
- $this->writeDataArrayToFqfn($pathName . $dataFile, $dataArray);
+ // Debug message + add/update it
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: criteriaKey=' . $searchKey . ',criteriaValue=' . $searchValue);
+ $dataArray[$searchKey] = $searchValue;
+ } // END - foreach
- // Count it
- $limitFound++;
- break;
- } // END - if
- } // END - foreach
+ // Write the data to a local file
+ $this->writeDataArrayToFqfn($pathName . $dataFile, $dataArray);
+
+ // Count found entries up
+ $limitFound++;
+ } // END - if
} // END - if
} // END - while