Skip to content

Commit

Permalink
Merge pull request #23 from open-sausages/pulls/4.0/namespace
Browse files Browse the repository at this point in the history
API Apply SilverStripe\SQLite namespace to module
  • Loading branch information
chillu committed Jul 1, 2016
2 parents 0bd2864 + e36e74a commit d09ab6b
Show file tree
Hide file tree
Showing 9 changed files with 224 additions and 145 deletions.
7 changes: 7 additions & 0 deletions .upgrade.yml
@@ -0,0 +1,7 @@
mappings:
SQLite3Connector: SilverStripe\SQLite\SQLite3Connector
SQLite3Database: SilverStripe\SQLite\SQLite3Database
SQLite3Query: SilverStripe\SQLite\SQLite3Query
SQLite3QueryBuilder: SilverStripe\SQLite\SQLite3QueryBuilder
SQLite3SchemaManager: SilverStripe\SQLite\SQLite3SchemaManager
SQLiteDatabaseConfigurationHelper: SilverStripe\SQLite\SQLiteDatabaseConfigurationHelper
15 changes: 11 additions & 4 deletions _config/connectors.yml
Expand Up @@ -3,27 +3,34 @@ name: sqlite3connectors
---
Injector:
SQLite3PDODatabase:
class: 'SQLite3Database'
class: 'SilverStripe\SQLite\SQLite3Database'
properties:
connector: %$PDOConnector
schemaManager: %$SQLite3SchemaManager
queryBuilder: %$SQLite3QueryBuilder
SQLite3Database:
class: 'SQLite3Database'
class: 'SilverStripe\SQLite\SQLite3Database'
properties:
connector: %$SQLite3Connector
schemaManager: %$SQLite3SchemaManager
queryBuilder: %$SQLite3QueryBuilder
# Legacy connector names
SQLiteDatabase:
class: 'SQLite3Database'
class: 'SilverStripe\SQLite\SQLite3Database'
properties:
connector: %$SQLite3Connector
schemaManager: %$SQLite3SchemaManager
queryBuilder: %$SQLite3QueryBuilder
SQLitePDODatabase:
class: 'SQLite3Database'
class: 'SilverStripe\SQLite\SQLite3Database'
properties:
connector: %$SQLite3Connector
schemaManager: %$SQLite3SchemaManager
queryBuilder: %$SQLite3QueryBuilder
SQLite3Connector:
class: 'SilverStripe\SQLite\SQLite3Connector'
type: prototype
SQLite3SchemaManager:
class: 'SilverStripe\SQLite\SQLite3SchemaManager'
SQLite3QueryBuilder:
class: 'SilverStripe\SQLite\SQLite3QueryBuilder'
19 changes: 12 additions & 7 deletions code/SQLite3Connector.php
@@ -1,23 +1,28 @@
<?php

namespace SilverStripe\SQLite;

use SilverStripe\ORM\Connect\DBConnector;
use SQLite3;

/**
* SQLite connector class
*
*
* @package SQLite3
*/
class SQLite3Connector extends DBConnector
{

/**
* The name of the database.
*
*
* @var string
*/
protected $databaseName;

/**
* Connection to the DBMS.
*
*
* @var SQLite3
*/
protected $dbConn;
Expand Down Expand Up @@ -66,7 +71,7 @@ public function isActive()

/**
* Prepares the list of parameters in preparation for passing to mysqli_stmt_bind_param
*
*
* @param array $parameters List of parameters
* @return array List of parameters types and values
*/
Expand Down Expand Up @@ -133,14 +138,14 @@ public function preparedQuery($sql, $parameters, $errorLevel = E_USER_ERROR)
$type = $parsedParameters[$i]['type'];
$statement->bindValue($i+1, $value, $type);
}

// Return successful result
$handle = $statement->execute();
if ($handle) {
return new SQLite3Query($this, $handle);
}
}

// Handle error
$values = $this->parameterValues($parameters);
$this->databaseError($this->getLastError(), $errorLevel, $sql, $values);
Expand All @@ -154,7 +159,7 @@ public function query($sql, $errorLevel = E_USER_ERROR)
if ($handle) {
return new SQLite3Query($this, $handle);
}

// Handle error
$this->databaseError($this->getLastError(), $errorLevel, $sql);
return null;
Expand Down
63 changes: 43 additions & 20 deletions code/SQLite3Database.php
@@ -1,38 +1,49 @@
<?php

namespace SilverStripe\SQLite;

use SilverStripe\ORM\DataList;
use SilverStripe\ORM\ArrayList;
use SilverStripe\ORM\Connect\SS_Database;
use Config;
use Deprecation;
use PaginatedList;
use SilverStripe\ORM\Queries\SQLSelect;


/**
* SQLite database controller class
*
*
* @package SQLite3
*/
class SQLite3Database extends SS_Database
{

/**
* Database schema manager object
*
*
* @var SQLite3SchemaManager
*/
protected $schemaManager = null;

/*
* This holds the parameters that the original connection was created with,
* so we can switch back to it if necessary (used for unit tests)
*
*
* @var array
*/
protected $parameters;

/*
* if we're on a In-Memory db
*
*
* @var boolean
*/
protected $livesInMemory = false;

/**
* List of default pragma values
*
*
* @todo Migrate to SS config
*
* @var array
Expand All @@ -46,7 +57,7 @@ class SQLite3Database extends SS_Database
/**
* Extension used to distinguish between sqllite database files and other files.
* Required to handle multiple databases.
*
*
* @return string
*/
public static function database_extension()
Expand All @@ -56,7 +67,7 @@ public static function database_extension()

/**
* Check if a database name has a valid extension
*
*
* @param string $name
* @return boolean
*/
Expand Down Expand Up @@ -89,7 +100,7 @@ public function connect($parameters)
unset($parameters['memory']);
$parameters['path'] = ':memory:';
}

//We will store these connection parameters for use elsewhere (ie, unit tests)
$this->parameters = $parameters;
$this->schemaManager->flushCache();
Expand Down Expand Up @@ -122,7 +133,7 @@ public function connect($parameters)
SQLiteDatabaseConfigurationHelper::secure_db_dir($parameters['path']);
}
}

// 'path' and 'database' are merged into the full file path, which
// is the format that connectors such as PDOConnector expect
$parameters['filepath'] = $file;
Expand All @@ -145,7 +156,7 @@ public function connect($parameters)

/**
* Retrieve parameters used to connect to this SQLLite database
*
*
* @return array
*/
public function getParameters()
Expand All @@ -170,9 +181,9 @@ public function supportsTimezoneOverride()

/**
* Execute PRAGMA commands.
*
* @param string pragma name
* @param string value to set
*
* @param string $pragma name
* @param string $value to set
*/
public function setPragma($pragma, $value)
{
Expand All @@ -181,8 +192,8 @@ public function setPragma($pragma, $value)

/**
* Gets pragma value.
*
* @param string pragma name
*
* @param string $pragma name
* @return string the pragma value
*/
public function getPragma($pragma)
Expand Down Expand Up @@ -236,9 +247,17 @@ public function random()
* - there must not be more than one MATCH operator per statement
* - the fts3 extension needs to be available
* for now we use the MySQL implementation with the MATCH()AGAINST() uglily replaced with LIKE
*
*
* @param array $classesToSearch
* @param string $keywords Keywords as a space separated string
* @return object DataObjectSet of result pages
* @param int $start
* @param int $pageLength
* @param string $sortBy
* @param string $extraFilter
* @param bool $booleanSearch
* @param string $alternativeFileFilter
* @param bool $invertedMatch
* @return PaginatedList DataObjectSet of result pages
*/
public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $sortBy = "Relevance DESC",
$extraFilter = "", $booleanSearch = false, $alternativeFileFilter = "", $invertedMatch = false
Expand All @@ -260,7 +279,7 @@ public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $

// Always ensure that only pages with ShowInSearch = 1 can be searched
$extraFilters['SiteTree'] .= ' AND ShowInSearch <> 0';
// File.ShowInSearch was added later, keep the database driver backwards compatible
// File.ShowInSearch was added later, keep the database driver backwards compatible
// by checking for its existence first
$fields = $this->getSchemaManager()->fieldList('File');
if (array_key_exists('ShowInSearch', $fields)) {
Expand Down Expand Up @@ -291,7 +310,10 @@ public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $
$baseClasses = array('SiteTree' => '', 'File' => '');
$queries = array();
foreach ($classesToSearch as $class) {
$queries[$class] = DataList::create($class)->where($notMatch . $match[$class] . $extraFilters[$class], "")->dataQuery()->query();
$queries[$class] = DataList::create($class)
->where($notMatch . $match[$class] . $extraFilters[$class])
->dataQuery()
->query();
$fromArr = $queries[$class]->getFrom();
$baseClasses[$class] = reset($fromArr);
}
Expand Down Expand Up @@ -348,6 +370,7 @@ public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $
$queryParameters = array();
$totalCount = 0;
foreach ($queries as $query) {
/** @var SQLSelect $query */
$querySQLs[] = $query->sql($parameters);
$queryParameters = array_merge($queryParameters, $parameters);
$totalCount += $query->unlimitedRowCount();
Expand All @@ -368,7 +391,7 @@ public function searchEngine($classesToSearch, $keywords, $start, $pageLength, $
}
$list = new PaginatedList($doSet);
$list->setPageStart($start);
$list->setPageLEngth($pageLength);
$list->setPageLength($pageLength);
$list->setTotalItems($totalCount);
return $list;
}
Expand Down
11 changes: 8 additions & 3 deletions code/SQLite3Query.php
@@ -1,23 +1,28 @@
<?php

namespace SilverStripe\SQLite;

use SilverStripe\ORM\Connect\SS_Query;
use SQLite3Result;

/**
* A result-set from a SQLite3 database.
*
*
* @package SQLite3
*/
class SQLite3Query extends SS_Query
{

/**
* The SQLite3Connector object that created this result set.
*
*
* @var SQLite3Connector
*/
protected $database;

/**
* The internal sqlite3 handle that points to the result set.
*
*
* @var SQLite3Result
*/
protected $handle;
Expand Down
21 changes: 15 additions & 6 deletions code/SQLite3QueryBuilder.php
@@ -1,13 +1,21 @@
<?php

namespace SilverStripe\SQLite;

use SilverStripe\ORM\Queries\SQLAssignmentRow;
use SilverStripe\ORM\Queries\SQLInsert;
use SilverStripe\ORM\Queries\SQLSelect;
use SilverStripe\ORM\Connect\DBQueryBuilder;
use InvalidArgumentException;

/**
* Builds a SQL query string from a SQLExpression object
*
*
* @package SQLite3
*/
class SQLite3QueryBuilder extends DBQueryBuilder
{

/**
* @param SQLInsert $query
* @param array $parameters
Expand All @@ -20,14 +28,15 @@ protected function buildInsertQuery(SQLInsert $query, array &$parameters)

$nl = $this->getSeparator();
$into = $query->getInto();

// Column identifiers
$columns = $query->getColumns();

// Build all rows
$rowParts = array();
foreach ($query->getRows() as $row) {
// Build all columns in this row
/** @var SQLAssignmentRow $row */
$assignments = $row->getAssignments();
// Join SET components together, considering parameters
$parts = array();
Expand All @@ -50,7 +59,7 @@ protected function buildInsertQuery(SQLInsert $query, array &$parameters)
}
$columnSQL = implode(', ', $columns);
$sql = "INSERT INTO {$into}{$nl}($columnSQL){$nl}SELECT " . implode("{$nl}UNION ALL SELECT ", $rowParts);

return $sql;
}

Expand Down Expand Up @@ -89,7 +98,7 @@ public function buildLimitFragment(SQLSelect $query, array &$parameters)
} else {
$clause .= "LIMIT -1 ";
}

if (isset($limit['start']) && is_numeric($limit['start']) && $limit['start'] !== 0) {
$clause .= "OFFSET {$limit['start']}";
}
Expand Down

0 comments on commit d09ab6b

Please sign in to comment.