/**
* Database backend class for storing objects in locally created files.
*
- * This class serializes objects and saves them to local files.
+ * This class serializes arrays stored in the dataset instance and saves them
+ * to local files. Every file (except 'info') represents a single line. Every
+ * directory within the 'db' (base) directory represents a table.
+ *
+ * A configurable 'file_io_class' is being used as "storage backend".
*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
* 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 BaseDatabaseFrontend implements DatabaseFrontendInterface {
- // Constants for MySQL backward-compatiblity (PLEASE FIX THEM!)
- const DB_CODE_TABLE_MISSING = 0x100;
- const DB_CODE_TABLE_UNWRITEABLE = 0x101;
- const DB_CODE_DATA_FILE_CORRUPT = 0x102;
-
- // Status results
- const RESULT_OKAY = 'ok';
-
+class LocalFileDatabase extends BaseDatabaseBackend implements DatabaseBackendInterface {
/**
* The file's extension
*/
// Set the compressor channel
$databaseInstance->setCompressorChannel($compressorInstance);
+ // Get a file IO handler
+ $fileIoInstance = ObjectFactory::createObjectByConfiguredName('file_io_class');
+
+ // ... and set it
+ $databaseInstance->setFileIoInstance($fileIoInstance);
+
// "Connect" to the database
$databaseInstance->connectToDatabase();
/**
* Getter for last read file
*
- * @return $lastFile The last read file's name with full path
+ * @return $lastFile The last read file's name with full path
*/
public final function getLastFile () {
return $this->lastFile;
/**
* Setter for contents of the last read file
*
- * @param $contents An array with header and data elements
+ * @param $contents An array with header and data elements
* @return void
*/
private final function setLastFileContents (array $contents) {
*/
private function getDataArrayFromFile ($fqfn) {
// Debug message
- //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Reading elements from database file ' . $fqfn . ' ...');
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Reading elements from database file ' . $fqfn . ' ...');
- // Get a file pointer
- $fileInstance = FrameworkFileInputPointer::createFrameworkFileInputPointer($fqfn);
-
- // Get the raw data and BASE64-decode it
- $compressedData = base64_decode($fileInstance->readLinesFromFile());
+ // Init compressed data
+ $compressedData = $this->getFileIoInstance()->loadFileContents($fqfn);
+ $compressedData = $compressedData['data'];
// Close the file and throw the instance away
- $fileInstance->closeFile();
unset($fileInstance);
// Decompress it
$dataArray = unserialize($serializedData);
// Debug message
- //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Read ' . count($dataArray) . ' elements from database file ' . $fqfn . '.');
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Read ' . count($dataArray) . ' elements from database file ' . $fqfn . '.');
// Finally return it
return $dataArray;
*/
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');
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Flushing ' . count($dataArray) . ' elements to database file ' . $fqfn . ' ...');
// Serialize and compress it
$compressedData = $this->getCompressorChannel()->getCompressor()->compressStream(serialize($dataArray));
- // Write this data BASE64 encoded to the file
- $fileInstance->writeToFile(base64_encode($compressedData));
+ // Write data
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Writing ' . strlen($compressedData) . ' bytes ...');
- // Close the file pointer
- $fileInstance->closeFile();
+ // Write this data BASE64 encoded to the file
+ $this->getFileIoInstance()->saveFile($fqfn, $compressedData);
// Debug message
- //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: Flushing ' . count($dataArray) . ' elements to database file completed.');
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: Flushing ' . count($dataArray) . ' elements to database file completed.');
}
/**
// Initialize the result data, this need to be rewritten e.g. if a local file cannot be read
$resultData = array(
- BaseDatabaseFrontend::RESULT_INDEX_STATUS => LocalfileDatabase::RESULT_OKAY,
- BaseDatabaseFrontend::RESULT_INDEX_ROWS => array()
+ BaseDatabaseBackend::RESULT_INDEX_STATUS => self::RESULT_OKAY,
+ BaseDatabaseBackend::RESULT_INDEX_ROWS => array()
);
// Initialize limit/skip
// Read the file
$dataArray = $this->getDataArrayFromFile($pathName . $dataFile);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',dataArray='.print_r($dataArray,true));
// Is this an array?
if (is_array($dataArray)) {
$criteria = $criteriaInstance->getCriteriaElemnent($key);
// 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);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->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) {
$dataArray[$this->getIndexKey()] = $idx;
// Entry found!
- //* NOISY-DEBUG: */ $this->debugOutput('DATABASE: indexKey=' . $this->getIndexKey() . ',idx=' . $idx . ',dataArray=' . print_r($dataArray, true));
- $resultData[BaseDatabaseFrontend::RESULT_INDEX_ROWS][] = $dataArray;
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: indexKey=' . $this->getIndexKey() . ',idx=' . $idx . ',dataArray=' . print_r($dataArray, true));
+ $resultData[BaseDatabaseBackend::RESULT_INDEX_ROWS][] = $dataArray;
// Count found entries up
$limitFound++;
// Does the extension match?
if (substr($dataFile, -(strlen($this->getFileExtension()))) !== $this->getFileExtension()) {
// Debug message
- /* NOISY-DEBUG: */ $this->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension());
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension() . ' - SKIPPED!');
// Skip this file!
continue;
} // END - if
// Open this file for reading
$dataArray = $this->getDataArrayFromFile($pathName . $dataFile);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',dataArray='.print_r($dataArray,true));
// Is this an array?
if (is_array($dataArray)) {
foreach ($dataArray as $key => $value) {
// Get criteria element
$criteria = $searchInstance->getCriteriaElemnent($key);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',key=' . $key . ',criteria=' . $criteria);
// Is the criteria met?
if (((!is_null($criteria)) && ($criteria == $value)) || ($searchInstance->count() == 0)) {
// Entry found, so update it
foreach ($criteriaArray as $criteriaKey => $criteriaValue) {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: criteriaKey=' . $criteriaKey . ',criteriaValue=' . $criteriaValue);
$dataArray[$criteriaKey] = $criteriaValue;
} // END - foreach