*/
interface DatabaseBackend extends FrameworkDatabase {
/**
- * Makes sure that the database connection is up and alive
+ * Getter for last read file
+ *
+ * @return $lastFile The last read file's name with full path
+ */
+ function getLastFile ();
+
+ /**
+ * Getter for last read file's content as an array
+ *
+ * @return $lastContent The array with elements 'header' and 'data'.
+ */
+ function getLastContents ();
+
+ /**
+ * Getter for file extension
+ *
+ * @return $fileExtension The array with elements 'header' and 'data'.
+ */
+ function getFileExtension ();
+
+ /**
+ * Getter for index key
+ *
+ * @return $indexKey Index key
+ */
+ function getIndexKey ();
+
+ /**
+ * Makes sure that the database connection is alive
*
* @return void
+ * @todo Do some checks on the database directory and files here
*/
function connectToDatabase ();
* Starts a SELECT query on the database by given return type, table name
* and search criteria
*
- * @param $tableName Name of the database table
- * @param $criteria Search criteria class
- * @return $resultData Result data of the query
+ * @param $tableName Name of the database table
+ * @param $searchInstance Local search criteria class
+ * @return $resultData Result data of the query
* @throws UnsupportedCriteriaException If the criteria is unsupported
- * @throws SqlException If an SQL error occurs
+ * @throws SqlException If an 'SQL error' occurs
*/
- function querySelect ($tableName, LocalSearchCriteria $criteriaInstance);
+ function querySelect ($tableName, LocalSearchCriteria $searchInstance);
/**
- * 'Inserts' a data set instance into a local file database folder
+ * "Inserts" a data set instance into a local file database folder
*
* @param $dataSetInstance A storeable data set
* @return void
function queryInsertDataSet (StoreableCriteria $dataSetInstance);
/**
- * 'Updates' a data set instance with a database layer
+ * "Updates" a data set instance with a database layer
*
* @param $dataSetInstance A storeable data set
* @return void
function queryUpdateDataSet (StoreableCriteria $dataSetInstance);
/**
- * Removes non-public data from given array.
+ * Getter for primary key of specified table or if not found null will be
+ * returned. This must be database-specific.
+ *
+ * @param $tableName Name of the table we need the primary key from
+ * @return $primaryKey Primary key column of the given table
+ */
+ function getPrimaryKeyOfTable ($tableName);
+
+ /**
+ * Removes non-data from given array.
*
- * @param $data An array with possible non-public data that needs to be removed.
- * @return $data A cleaned up array with only public data.
+ * @param $data An array with possible non-data that needs to be removed.
+ * @return $data A cleaned up array with only data.
+ * @todo Add more generic non-data for removal
*/
function removeNonPublicDataFromArray (array $data);
+
+ /**
+ * Counts total rows of given table
+ *
+ * @param $tableName Table name
+ * @return $count Total rows of given table
+ */
+ function countTotalRows($tableName);
}
// [EOF]
* @return $primaryKey Primary key used in wrapped table
*/
function getPrimaryKeyValue();
+
+ /**
+ * Counts total rows of this table
+ *
+ * @return $count Total rows of this table
+ */
+ function countTotalRows();
}
// [EOF]
* @return $data A cleaned up array with only public data.
*/
function removeNonPublicDataFromArray (array $data);
+
+ /**
+ * Counts total rows of given table
+ *
+ * @param $tableName Table name
+ * @return $count Total rows of given table
+ */
+ function countTotalRows($tableName);
}
// [EOF]
$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);
}
}
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: data[' . gettype($data) . ']='.print_r($data, TRUE));
return $data;
}
+
+ /**
+ * Counts total rows of given table
+ *
+ * @param $tableName Table name
+ * @return $count Total rows of given table
+ */
+ public function countTotalRows($tableName) {
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: tableName=' . $tableName . ' - CALLED!');
+
+ // Create full path name
+ $pathName = $this->getConfigInstance()->getConfigEntry('local_db_path') . $tableName . '/';
+
+ // Try all the requests
+ try {
+ // Get a file pointer instance
+ $directoryInstance = ObjectFactory::createObjectByConfiguredName('directory_class', array($pathName));
+
+ // Initialize counter
+ $count = 0;
+
+ // Read the directory with some exceptions
+ while ($dataFile = $directoryInstance->readDirectoryExcept(array('.htaccess', 'info.' . $this->getFileExtension()))) {
+ // Does the extension match?
+ if (substr($dataFile, -(strlen($this->getFileExtension()))) !== $this->getFileExtension()) {
+ // Debug message
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension() . ' - SKIPPED!');
+ // Skip this file!
+ continue;
+ } // END - if
+
+ // Count this row up
+ /* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: dataFile=' . $dataFile . ',getFileExtension()=' . $this->getFileExtension() . ' - COUNTED!');
+ $count++;
+ } // END - while
+ } catch (FrameworkException $e) {
+ // Catch all exceptions and store them in last error
+ $this->setLastException($e);
+
+ // Throw an SQL exception
+ throw new SqlException(array($this, sprintf('Cannot count on table '%s', is the table created?', $dataSetInstance->getTableName()), self::DB_CODE_TABLE_NOT_FOUND), self::EXCEPTION_SQL_QUERY);
+ }
+
+ // Return count
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DATABASE: tableName=' . $tableName . ',count=' . $count . ' - EXIT!');
+ return $count;
+ }
}
// [EOF]
* @return void
*/
private final function initCacheInstance () {
- // Set the new instance
- $this->cacheInstance = CacheFactory::getFactory()->createConfiguredCache();
+ // Is the cache enabled?
+ if ($this->getConfigInstance()->getConfigEntry('database_cache_enabled') === TRUE) {
+ // Set the new instance
+ $this->cacheInstance = CacheFactory::getFactory()->createConfiguredCache();
+ } // END - if
}
/**
// Cache the result if not null
if (!is_null($result)) {
- // A valid result has returned from the database layer
- $this->cacheInstance->offsetSet($cacheKey, $result);
+ // Is cache enabled?
+ if ($this->getConfigInstance()->getConfigEntry('database_cache_enabled') === TRUE) {
+ // A valid result has returned from the database layer
+ $this->cacheInstance->offsetSet($cacheKey, $result);
+ } // END - if
} else {
// This invalid result must be wrapped
$result = array(
return $primaryKey;
}
+ /**
+ * Count rows of this table
+ *
+ * @return $count Count of total rows in this table
+ */
+ public final function countTotalRows () {
+ // Get the table name and a database instance and ask for it
+ $count = $this->getDatabaseInstance()->countTotalRows($this->getTableName());
+
+ // Return value
+ return $count;
+ }
+
/**
* Removes non-public data from given array.
*
// Can the next entry be read?
assert($this->getDirectoryIteratorInstance()->valid());
- // Default is FALSE
- $currentEntry = FALSE;
-
// Read data from the directory pointer and return it
$currentEntry = $this->getDirectoryIteratorInstance()->current();
return $this->readRawDirectory();
} elseif (!$this->getDirectoryIteratorInstance()->valid()) {
// No more left to read
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: EOD reached.');
return NULL;
}
if (is_object($currentEntry)) {
// Get file name
$rawLine = $currentEntry->getFilename();
- //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine);
+ //* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DIRECTORY[' . __METHOD__ . ':' . __LINE__ . ']: rawLine[' . gettype($rawLine) . ']=' . $rawLine . ',isDot=' . intval($this->getDirectoryIteratorInstance()->isDot()));
- // Is it not excluded?
- if (in_array($rawLine, $except)) {
+ // Is it a dot-directory or excluded?
+ if (($this->getDirectoryIteratorInstance()->isDot()) || (in_array($rawLine, $except))) {
// To next entry
$this->getDirectoryIteratorInstance()->next();
* @return $data A cleaned up array with only public data.
*/
public function removeNonPublicDataFromArray (array $data) {
+ // Connect to the database
+ $this->dbLayer->connectToDatabase();
+
// Call database backend
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DB-CONNECTION[' . $this->__toString() . ']: Calling this->dbLayer->removeNonPublicDataFromArray(data) ...');
$data = $this->dbLayer->removeNonPublicDataFromArray($data);
//* NOISY-DEBUG: */ self::createDebugInstance(__CLASS__)->debugOutput('DB-CONNECTION[' . $this->__toString() . ']: data[]=' . gettype($data));
return $data;
}
+
+ /**
+ * Count total table rows
+ *
+ * @param $tableName Table name
+ * @return $count Total row count
+ */
+ public function countTotalRows ($tableName) {
+ // Connect to the database
+ $this->dbLayer->connectToDatabase();
+
+ // Ask the database layer
+ $count = $this->dbLayer->countTotalRows($tableName);
+
+ // Return the value
+ return $count;
+ }
}
// [EOF]