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.