/** * コンストラクタ * @param string{} $def 接続情報 [type,host,name,port,user,password,sock,encode,timezone] */ public function __construct(array $def = []) { if (empty($def)) { /** * @param string{} $connection デフォルトの接続情報 [type,host,name,port,user,password,sock,encode,timezone] */ $def = \ebi\Conf::gets('connection'); } $type = isset($def['type']) ? $def['type'] : null; $host = isset($def['host']) ? $def['host'] : null; $dbname = isset($def['name']) ? $def['name'] : null; $port = isset($def['port']) ? $def['port'] : null; $user = isset($def['user']) ? $def['user'] : null; $password = isset($def['password']) ? $def['password'] : null; $sock = isset($def['sock']) ? $def['sock'] : null; $encode = isset($def['encode']) ? $def['encode'] : null; $timezone = isset($def['timezone']) ? $def['timezone'] : null; if (empty($type)) { $type = \ebi\SqliteConnector::type(); } if (empty($encode)) { $encode = 'utf8'; } try { $type = \ebi\Util::get_class_name($type); } catch (\InvalidArgumentException $e) { throw new \ebi\exception\ConnectionException('could not find connector `' . $type . '`'); } $r = new \ReflectionClass($type); $this->dbname = $dbname; $this->connector = $r->newInstanceArgs([$encode, $timezone]); if (!$this->connector instanceof \ebi\DbConnector) { throw new \ebi\exception\ConnectionException('must be an instance of \\ebi\\DbConnector'); } if (self::$autocommit === null) { /** * @param boolean $autocommit オートコミットを行うかの真偽値 */ self::$autocommit = \ebi\Conf::get('autocommit', false); } $this->connection = $this->connector->connect($this->dbname, $host, $port, $user, $password, $sock, self::$autocommit); if (empty($this->connection)) { throw new \ebi\exception\ConnectionException('connection fail ' . $this->dbname); } if (self::$autocommit !== true) { $this->connection->beginTransaction(); } }
/** * print_r * @param mixed $obj */ public function dump($obj) { $result = []; foreach ($obj as $k => $v) { if (isset($obj[$k])) { if (!is_array($obj[$k]) || !empty($obj[$k])) { $result[$k] = $v; } } if (is_bool($obj[$k])) { $result[$k] = $result[$k] ? 'true' : 'false'; } } if ($result['class'] && is_string($result['class'])) { $result['class'] = \ebi\Util::get_class_name($result['class']); } $value = print_r($result, true); $value = str_replace('=>' . PHP_EOL, ': ', trim($value)); $value = preg_replace('/\\[\\d+\\]/', ' \\0', $value); return implode(PHP_EOL, array_slice(explode(PHP_EOL, $value), 2, -1)); }
/** * Pluginに遅延セットする * @param string $class_name * @param string $obj */ public static function set_class_plugin($class_name, $obj = null) { if (is_array($class_name)) { foreach ($class_name as $c => $v) { static::set_class_plugin($c, $v); } } else { if (!empty($obj)) { $class_name = \ebi\Util::get_class_name($class_name); if (!is_array($obj)) { $obj = [$obj]; } foreach ($obj as $o) { if (is_string($o)) { $o = \ebi\Util::get_class_name($o); } self::$plugins[$class_name][] = $o; } } } }
<?php /** * Create table * @param string $model * @param boolean $drop */ $model_list = []; if (empty($model)) { foreach (\ebi\Dt::classes(\ebi\Dao::class) as $class_info) { $model_list[] = \ebi\Util::get_class_name($class_info['class']); } } else { $model_list[] = \ebi\Util::get_class_name($model); } foreach ($model_list as $m) { if ($drop === true) { call_user_func([$m, 'drop_table']); \cmdman\Std::println('dropped ' . $m); } call_user_func([$m, 'create_table']); \cmdman\Std::println('created ' . $m); }
<?php /** * Data export * @param string $file */ if (empty($file)) { $file = getcwd() . '/dao.dump'; } \ebi\Util::file_write($file, ''); foreach (\ebi\Dt::classes(\ebi\Dao::class) as $class_info) { $class_name = \ebi\Util::get_class_name($class_info['class']); $cnt = 0; foreach (call_user_func([$class_name, 'find']) as $obj) { \ebi\Util::file_append($file, json_encode(['model' => $class_name, 'data' => $obj->props()]) . PHP_EOL); $cnt++; } \cmdman\Std::println_info('Export ' . $class_name . ' (' . $cnt . ')'); } \cmdman\Std::println_success(PHP_EOL . 'Writen: ' . $file);
/** * テーブルを削除後作成する */ public static function reset_tables() { foreach (\ebi\Dt::classes(\ebi\Dao::class) as $class_info) { $class = \ebi\Util::get_class_name($class_info['class']); call_user_func([$class, 'drop_table']); call_user_func([$class, 'create_table']); } }
} catch (\ebi\exception\ConnectionException $e) { $failure['db']++; \cmdman\Std::println_danger(' ' . $class_name . ' Failure, ' . $e->getMessage()); } catch (\Exception $e) { $failure['db']++; \cmdman\Std::println_warning(' ' . $class_name . ' Failure, ' . $e->getMessage()); } } \cmdman\Std::println(); \cmdman\Std::println_info('Entry:'); foreach (\ebi\Util::ls(getcwd()) as $f) { $src = file_get_contents($f->getPathname()); if (strpos($src, '\\ebi\\Flow::app(') !== false) { $map = \ebi\Flow::get_map($f->getPathname()); $entry = str_replace(getcwd(), '', $f->getPathname()); foreach ($map['patterns'] as $p) { if (array_key_exists('action', $p) && is_string($p['action'])) { try { list($c, $m) = explode('::', $p['action']); $mr = new \ReflectionMethod(\ebi\Util::get_class_name($c), $m); \cmdman\Std::println_success($entry . ' ' . $p['name'] . ' OK'); } catch (\ReflectionException $e) { $failure['entry']++; \cmdman\Std::println_danger($entry . ' ' . $p['name'] . ' Failure'); } } } } } \cmdman\Std::println(); \cmdman\Std::println_danger('Failure: ' . (!empty($failure['db']) ? 'Database(' . $failure['db'] . ') ' : '') . (!empty($failure['entry']) ? 'Entry(' . $failure['entry'] . ') ' : ''));