/** * Connection options: (see driver-specific options too) * - lazy (bool) => if TRUE, connection will be established only when required * - result (array) => result set options * - formatDateTime => date-time format (if empty, DateTime objects will be returned) * - profiler (array or bool) * - run (bool) => enable profiler? * - file => file to log * - substitutes (array) => map of driver specific substitutes (under development) * @param mixed connection parameters * @param string connection name * @throws DibiException */ public function __construct($config, $name = NULL) { class_exists('dibi'); // ensure class dibi is loaded // DSN string if (is_string($config)) { parse_str($config, $config); } elseif ($config instanceof Traversable) { $tmp = array(); foreach ($config as $key => $val) { $tmp[$key] = $val instanceof Traversable ? iterator_to_array($val) : $val; } $config = $tmp; } elseif (!is_array($config)) { throw new InvalidArgumentException('Configuration must be array, string or object.'); } self::alias($config, 'username', 'user'); self::alias($config, 'password', 'pass'); self::alias($config, 'host', 'hostname'); self::alias($config, 'result|formatDate', 'resultDate'); self::alias($config, 'result|formatDateTime', 'resultDateTime'); if (!isset($config['driver'])) { $config['driver'] = dibi::$defaultDriver; } $driver = preg_replace('#[^a-z0-9_]#', '_', strtolower($config['driver'])); $class = "Dibi" . $driver . "Driver"; if (!class_exists($class, FALSE)) { include_once dirname(__FILE__) . "/../drivers/{$driver}.php"; if (!class_exists($class, FALSE)) { throw new DibiException("Unable to create instance of dibi driver '{$class}'."); } } $config['name'] = $name; $this->config = $config; $this->driver = new $class(); $this->translator = new DibiTranslator($this); // profiler $profilerCfg =& $config['profiler']; if (is_scalar($profilerCfg)) { $profilerCfg = array('run' => (bool) $profilerCfg); } if (!empty($profilerCfg['run'])) { $filter = isset($profilerCfg['filter']) ? $profilerCfg['filter'] : DibiEvent::QUERY; if (isset($profilerCfg['file'])) { $this->onEvent[] = array(new DibiFileLogger($profilerCfg['file'], $filter), 'logEvent'); } if (DibiFirePhpLogger::isAvailable()) { $this->onEvent[] = array(new DibiFirePhpLogger($filter), 'logEvent'); } if (class_exists('DibiNettePanel', FALSE)) { $panel = new DibiNettePanel(isset($profilerCfg['explain']) ? $profilerCfg['explain'] : TRUE, $filter); $panel->register($this); } } $this->substitutes = new DibiHashMap(create_function('$expr', 'return ":$expr:";')); if (!empty($config['substitutes'])) { foreach ($config['substitutes'] as $key => $value) { $this->substitutes->{$key} = $value; } } if (empty($config['lazy'])) { $this->connect(); } }
/** * Connection options: (see driver-specific options too) * - lazy (bool) => if TRUE, connection will be established only when required * - result (array) => result set options * - formatDateTime => date-time format (if empty, DateTime objects will be returned) * - profiler (array or bool) * - run (bool) => enable profiler? * - file => file to log * - substitutes (array) => map of driver specific substitutes (under development) * @param mixed connection parameters * @param string connection name * @throws DibiException */ public function __construct($config, $name = NULL) { if (is_string($config)) { parse_str($config, $config); } elseif ($config instanceof Traversable) { $tmp = array(); foreach ($config as $key => $val) { $tmp[$key] = $val instanceof Traversable ? iterator_to_array($val) : $val; } $config = $tmp; } elseif (!is_array($config)) { throw new InvalidArgumentException('Configuration must be array, string or object.'); } self::alias($config, 'username', 'user'); self::alias($config, 'password', 'pass'); self::alias($config, 'host', 'hostname'); self::alias($config, 'result|formatDate', 'resultDate'); self::alias($config, 'result|formatDateTime', 'resultDateTime'); if (!isset($config['driver'])) { $config['driver'] = dibi::$defaultDriver; } if ($config['driver'] instanceof IDibiDriver) { $this->driver = $config['driver']; $config['driver'] = get_class($this->driver); } elseif (PHP_VERSION_ID >= 50307 && is_subclass_of($config['driver'], 'IDibiDriver')) { $this->driver = new $config['driver'](); } else { $class = preg_replace(array('#\\W#', '#sql#'), array('_', 'Sql'), ucfirst(strtolower($config['driver']))); $class = "Dibi{$class}Driver"; if (!class_exists($class)) { include_once dirname(__FILE__) . "/../drivers/{$class}.php"; if (!class_exists($class, FALSE)) { throw new DibiException("Unable to create instance of dibi driver '{$class}'."); } } $this->driver = new $class(); } $config['name'] = $name; $this->config = $config; $this->translator = new DibiTranslator($this); // profiler $profilerCfg =& $config['profiler']; if (is_scalar($profilerCfg)) { $profilerCfg = array('run' => (bool) $profilerCfg); } if (!empty($profilerCfg['run'])) { $filter = isset($profilerCfg['filter']) ? $profilerCfg['filter'] : DibiEvent::QUERY; if (isset($profilerCfg['file'])) { $this->onEvent[] = array(new DibiFileLogger($profilerCfg['file'], $filter), 'logEvent'); } if (DibiFirePhpLogger::isAvailable()) { $this->onEvent[] = array(new DibiFirePhpLogger($filter), 'logEvent'); } if (!interface_exists('Tracy\\IBarPanel') && interface_exists('Nette\\Diagnostics\\IBarPanel') && class_exists('DibiNettePanel')) { $panel = new DibiNettePanel(isset($profilerCfg['explain']) ? $profilerCfg['explain'] : TRUE, $filter); $panel->register($this); } } $this->substitutes = new DibiHashMap(create_function('$expr', 'return ":$expr:";')); if (!empty($config['substitutes'])) { foreach ($config['substitutes'] as $key => $value) { $this->substitutes->{$key} = $value; } } if (empty($config['lazy'])) { $this->connect(); } }