function DatabaseConnection_sqlite::__construct

Overrides DatabaseConnection::__construct

File

includes/database/sqlite/database.inc, line 57

Class

DatabaseConnection_sqlite
Specific SQLite implementation of DatabaseConnection.

Code

public function __construct(array $connection_options = array()) {
    // We don't need a specific PDOStatement class here, we simulate it below.
    $this->statementClass = NULL;
    // This driver defaults to transaction support, except if explicitly passed FALSE.
    $this->transactionSupport = $this->transactionalDDLSupport = !isset($connection_options['transactions']) || $connection_options['transactions'] !== FALSE;
    $this->connectionOptions = $connection_options;
    // Allow PDO options to be overridden.
    $connection_options += array(
        'pdo' => array(),
    );
    $connection_options['pdo'] += array(
        // Convert numeric values to strings when fetching.
PDO::ATTR_STRINGIFY_FETCHES => TRUE,
    );
    parent::__construct('sqlite:' . $connection_options['database'], '', '', $connection_options['pdo']);
    // Attach one database for each registered prefix.
    $prefixes = $this->prefixes;
    foreach ($prefixes as $table => &$prefix) {
        // Empty prefix means query the main database -- no need to attach anything.
        if (!empty($prefix)) {
            // Only attach the database once.
            if (!isset($this->attachedDatabases[$prefix])) {
                $this->attachedDatabases[$prefix] = $prefix;
                $this->query('ATTACH DATABASE :database AS :prefix', array(
                    ':database' => $connection_options['database'] . '-' . $prefix,
                    ':prefix' => $prefix,
                ));
            }
            // Add a ., so queries become prefix.table, which is proper syntax for
            // querying an attached database.
            $prefix .= '.';
        }
    }
    // Regenerate the prefixes replacement table.
    $this->setPrefix($prefixes);
    // Detect support for SAVEPOINT.
    $version = $this->query('SELECT sqlite_version()')
        ->fetchField();
    $this->savepointSupport = version_compare($version, '3.6.8') >= 0;
    // Create functions needed by SQLite.
    $this->sqliteCreateFunction('if', array(
        $this,
        'sqlFunctionIf',
    ));
    $this->sqliteCreateFunction('greatest', array(
        $this,
        'sqlFunctionGreatest',
    ));
    $this->sqliteCreateFunction('pow', 'pow', 2);
    $this->sqliteCreateFunction('length', 'strlen', 1);
    $this->sqliteCreateFunction('md5', 'md5', 1);
    $this->sqliteCreateFunction('concat', array(
        $this,
        'sqlFunctionConcat',
    ));
    $this->sqliteCreateFunction('substring', array(
        $this,
        'sqlFunctionSubstring',
    ), 3);
    $this->sqliteCreateFunction('substring_index', array(
        $this,
        'sqlFunctionSubstringIndex',
    ), 3);
    $this->sqliteCreateFunction('rand', array(
        $this,
        'sqlFunctionRand',
    ));
    // Enable the Write-Ahead Logging (WAL) option for SQLite if supported.
    // @see https://www.drupal.org/node/2348137
    // @see https://sqlite.org/wal.html
    if (version_compare($version, '3.7') >= 0) {
        $connection_options += array(
            'init_commands' => array(),
        );
        $connection_options['init_commands'] += array(
            'wal' => "PRAGMA journal_mode=WAL",
        );
    }
    // Execute sqlite init_commands.
    if (isset($connection_options['init_commands'])) {
        $this->connection
            ->exec(implode('; ', $connection_options['init_commands']));
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.