X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fdatabase%2Fdatabases%2Fclass_LocalFileDatabase.php;h=efe6951b3f63fea0e9c0ba283ed77defd7416da3;hp=38e67f1061b405c4654fb51c5f26b22e80752e77;hb=41ed04ff39300a5df138caa692b4d816ea2d48a0;hpb=6966c5ab4eaf26294d9dffb48037ed51d6ac8f46 diff --git a/inc/classes/main/database/databases/class_LocalFileDatabase.php b/inc/classes/main/database/databases/class_LocalFileDatabase.php index 38e67f10..efe6951b 100644 --- a/inc/classes/main/database/databases/class_LocalFileDatabase.php +++ b/inc/classes/main/database/databases/class_LocalFileDatabase.php @@ -2,7 +2,11 @@ /** * 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 * @version 0.0.0 @@ -23,15 +27,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -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 */ @@ -89,6 +85,12 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // 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(); @@ -110,7 +112,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend /** * 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; @@ -119,7 +121,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend /** * 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) { @@ -162,16 +164,13 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend */ 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 @@ -181,7 +180,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend $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; @@ -196,22 +195,19 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend */ 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.'); } /** @@ -331,8 +327,8 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // 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 @@ -350,6 +346,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // 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)) { @@ -359,7 +356,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend $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) { @@ -375,8 +372,8 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend $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++; @@ -474,13 +471,14 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // 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)) { @@ -488,9 +486,10 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend 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)) { + if (((!is_null($criteria)) && ($criteria == $value)) || ($searchInstance->count() == 0)) { // Shall we skip this entry? if ($searchInstance->getSkip() > 0) { // We shall skip some entries @@ -503,6 +502,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // 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