google_forms/system/database/DB.php

200 lines
7.4 KiB
PHP

<?php
/**
* CodeIgniter
*
* An open source application development framework for PHP
*
* This content is released under the MIT License (MIT)
*
* Copyright (c) 2019 - 2022, CodeIgniter Foundation
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
* @copyright Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
* @copyright Copyright (c) 2019 - 2022, CodeIgniter Foundation (https://codeigniter.com/)
* @license https://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 1.0.0
* @filesource
*/
defined('BASEPATH') or exit('No direct script access allowed');
/**
* Initialize the database
*
* @category Database
* @author EllisLab Dev Team
* @link https://codeigniter.com/userguide3/database/
*
* @param string|string[] $params
* @param bool $query_builder_override
* Determines if query builder should be used or not
*/
function &DB($params = '', $query_builder_override = null)
{
// Load the DB config file if a DSN string wasn't passed
if (is_string($params) && strpos($params, '://') === false) {
// Is the config file in the environment folder?
if (
! file_exists($file_path = APPPATH . 'config/' . ENVIRONMENT . '/database.php')
&& ! file_exists($file_path = APPPATH . 'config/database.php')
) {
show_error('The configuration file database.php does not exist.');
}
include($file_path);
// Make packages contain database config files,
// given that the controller instance already exists
if (class_exists('CI_Controller', false)) {
foreach (get_instance()->load->get_package_paths() as $path) {
if ($path !== APPPATH) {
if (file_exists($file_path = $path . 'config/' . ENVIRONMENT . '/database.php')) {
include($file_path);
} elseif (file_exists($file_path = $path . 'config/database.php')) {
include($file_path);
}
}
}
}
if (! isset($db) or count($db) === 0) {
show_error('No database connection settings were found in the database config file.');
}
if ($params !== '') {
$active_group = $params;
}
if (! isset($active_group)) {
show_error('You have not specified a database connection group via $active_group in your config/database.php file.');
} elseif (! isset($db[$active_group])) {
show_error('You have specified an invalid database connection group (' . $active_group . ') in your config/database.php file.');
}
$params = $db[$active_group];
} elseif (is_string($params)) {
/**
* Parse the URL from the DSN string
* Database settings can be passed as discreet
* parameters or as a data source name in the first
* parameter. DSNs must have this prototype:
* $dsn = 'driver://username:password@hostname/database';
*/
if (($dsn = @parse_url($params)) === false) {
show_error('Invalid DB Connection String');
}
$params = array(
'dbdriver' => $dsn['scheme'],
'hostname' => isset($dsn['host']) ? rawurldecode($dsn['host']) : '',
'port' => isset($dsn['port']) ? rawurldecode($dsn['port']) : '',
'username' => isset($dsn['user']) ? rawurldecode($dsn['user']) : '',
'password' => isset($dsn['pass']) ? rawurldecode($dsn['pass']) : '',
'database' => isset($dsn['path']) ? rawurldecode(substr($dsn['path'], 1)) : ''
);
// Were additional config items set?
if (isset($dsn['query'])) {
parse_str($dsn['query'], $extra);
foreach ($extra as $key => $val) {
if (is_string($val) && in_array(strtoupper($val), array('TRUE', 'FALSE', 'NULL'))) {
$val = var_export($val, true);
}
$params[$key] = $val;
}
}
}
// No DB specified yet? Beat them senseless...
if (empty($params['dbdriver'])) {
show_error('You have not selected a database type to connect to.');
}
// Load the DB classes. Note: Since the query builder class is optional
// we need to dynamically create a class that extends proper parent class
// based on whether we're using the query builder class or not.
if ($query_builder_override !== null) {
$query_builder = $query_builder_override;
}
// Backwards compatibility work-around for keeping the
// $active_record config variable working. Should be
// removed in v3.1
elseif (! isset($query_builder) && isset($active_record)) {
$query_builder = $active_record;
}
require_once(BASEPATH . 'database/DB_driver.php');
if (! isset($query_builder) or $query_builder === true) {
require_once(BASEPATH . 'database/DB_query_builder.php');
if (! class_exists('CI_DB', false)) {
/**
* CI_DB
*
* Acts as an alias for both CI_DB_driver and CI_DB_query_builder.
*
* @see CI_DB_query_builder
* @see CI_DB_driver
*/
class CI_DB extends CI_DB_query_builder
{
}
}
} elseif (! class_exists('CI_DB', false)) {
/**
* @ignore
*/
class CI_DB extends CI_DB_driver
{
}
}
// Load the DB driver
$driver_file = BASEPATH . 'database/drivers/' . $params['dbdriver'] . '/' . $params['dbdriver'] . '_driver.php';
file_exists($driver_file) or show_error('Invalid DB driver');
require_once($driver_file);
// Instantiate the DB adapter
$driver = 'CI_DB_' . $params['dbdriver'] . '_driver';
$DB = new $driver($params);
// Check for a subdriver
if (! empty($DB->subdriver)) {
$driver_file = BASEPATH . 'database/drivers/' . $DB->dbdriver . '/subdrivers/' . $DB->dbdriver . '_' . $DB->subdriver . '_driver.php';
if (file_exists($driver_file)) {
require_once($driver_file);
$driver = 'CI_DB_' . $DB->dbdriver . '_' . $DB->subdriver . '_driver';
$DB = new $driver($params);
}
}
$DB->initialize();
return $DB;
}