diff --git a/DBV.php b/DBV.php index c1ede13..8ec45cf 100644 --- a/DBV.php +++ b/DBV.php @@ -36,431 +36,495 @@ class DBV_Exception extends Exception class DBV { - protected $_action = "index"; - protected $_adapter; - protected $_log = array(); - - public function authenticate() - { - if (isset($_SERVER['HTTP_AUTHORIZATION'])) { - $authorization = $_SERVER['HTTP_AUTHORIZATION']; - } else { - if (function_exists('apache_request_headers')) { - $headers = apache_request_headers(); - $authorization = array_key_exists('HTTP_AUTHORIZATION', $headers) - ? $headers['HTTP_AUTHORIZATION'] - : ''; - } - } - - if ($authorization) { - list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($authorization, 6))); - } - if (strlen(DBV_USERNAME) && strlen(DBV_PASSWORD) && (!isset($_SERVER['PHP_AUTH_USER']) || !($_SERVER['PHP_AUTH_USER'] == DBV_USERNAME && $_SERVER['PHP_AUTH_PW'] == DBV_PASSWORD))) { - header('WWW-Authenticate: Basic realm="DBV interface"'); - header('HTTP/1.0 401 Unauthorized'); - echo __('Access denied'); - exit(); - } - } - - /** - * @return DBV_Adapter_Interface - */ - protected function _getAdapter() - { - if (!$this->_adapter) { - $file = DBV_ROOT_PATH . DS . 'lib' . DS . 'adapters' . DS . DB_ADAPTER . '.php'; - if (file_exists($file)) { - require_once $file; - - $class = 'DBV_Adapter_' . DB_ADAPTER; - if (class_exists($class)) { - $adapter = new $class; - try { - $adapter->connect(DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME); - $this->_adapter = $adapter; - } catch (DBV_Exception $e) { - $this->error("[{$e->getCode()}] " . $e->getMessage()); - } - } - } - } - - return $this->_adapter; - } - - public function dispatch() - { - $action = $this->_getAction() . "Action"; - $this->$action(); - } - - public function indexAction() - { - if ($this->_getAdapter()) { - $this->schema = $this->_getSchema(); - $this->revisions = $this->_getRevisions(); - $this->revision = $this->_getCurrentRevision(); - } - - $this->_view("index"); - } - - public function schemaAction() - { - $items = isset($_POST['schema']) ? $_POST['schema'] : array(); - - if ($this->_isXMLHttpRequest()) { - if (!count($items)) { - return $this->_json(array('error' => __("You didn't select any objects"))); - } - - foreach ($items as $item) { - switch ($_POST['action']) { - case 'create': - $this->_createSchemaObject($item); - break; - case 'export': - $this->_exportSchemaObject($item); - break; - } - } - - $return = array('messages' => array()); - foreach ($this->_log as $message) { - $return['messages'][$message['type']][] = $message['message']; - } - - $return['items'] = $this->_getSchema(); - - $this->_json($return); - } - } - - public function revisionsAction() - { - $revisions = isset($_POST['revisions']) ? array_filter($_POST['revisions'], 'is_numeric') : array(); - $current_revision = $this->_getCurrentRevision(); - - if (count($revisions)) { - sort($revisions); - - foreach ($revisions as $revision) { - $files = $this->_getRevisionFiles($revision); - - if (count($files)) { - foreach ($files as $file) { - $file = DBV_REVISIONS_PATH . DS . $revision . DS . $file; - if (!$this->_runFile($file)) { - break 2; - } - } - } - - if ($revision > $current_revision) { - $this->_setCurrentRevision($revision); - } - $this->confirm(__("Executed revision #{revision}", array('revision' => "$revision"))); - } - } - - if ($this->_isXMLHttpRequest()) { - $return = array( + protected $_action = "index"; + protected $_adapter; + protected $_log = array(); + + public function authenticate() + { + if (isset($_SERVER['HTTP_AUTHORIZATION'])) { + $authorization = $_SERVER['HTTP_AUTHORIZATION']; + } else { + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + $authorization = array_key_exists('HTTP_AUTHORIZATION', $headers) + ? $headers['HTTP_AUTHORIZATION'] + : ''; + } + } + + if ($authorization) { + list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($authorization, 6))); + } + if (strlen(DBV_USERNAME) && strlen(DBV_PASSWORD) && (!isset($_SERVER['PHP_AUTH_USER']) || !($_SERVER['PHP_AUTH_USER'] == DBV_USERNAME && $_SERVER['PHP_AUTH_PW'] == DBV_PASSWORD))) { + header('WWW-Authenticate: Basic realm="DBV interface"'); + header('HTTP/1.0 401 Unauthorized'); + echo __('Access denied'); + exit(); + } + } + + /** + * @return DBV_Adapter_Interface + */ + protected function _getAdapter() + { + if (!$this->_adapter) { + $file = DBV_ROOT_PATH . DS . 'lib' . DS . 'adapters' . DS . DB_ADAPTER . '.php'; + if (file_exists($file)) { + require_once $file; + + $class = 'DBV_Adapter_' . DB_ADAPTER; + if (class_exists($class)) { + $adapter = new $class; + try { + $adapter->connect(DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_NAME); + $this->_adapter = $adapter; + } catch (DBV_Exception $e) { + $this->error("[{$e->getCode()}] " . $e->getMessage()); + } + } + } + } + + return $this->_adapter; + } + + public function dispatch() + { + $action = $this->_getAction() . "Action"; + $this->$action(); + } + + public function indexAction() + { + if ($this->_getAdapter()) { + $this->schema = $this->_getSchema(); + $this->revisions = $this->_getRevisions(); + $this->revision = $this->_getCurrentRevision(); + } + + $this->_view("index"); + } + + public function schemaAction() + { + $items = isset($_POST['schema']) ? $_POST['schema'] : array(); + + if ($this->_isXMLHttpRequest()) { + if (!count($items)) { + return $this->_json(array('error' => __("You didn't select any objects"))); + } + + foreach ($items as $item) { + switch ($_POST['action']) { + case 'create': + $this->_createSchemaObject($item); + break; + case 'export': + $this->_exportSchemaObject($item); + break; + } + } + + $return = array('messages' => array()); + foreach ($this->_log as $message) { + $return['messages'][$message['type']][] = $message['message']; + } + + $return['items'] = $this->_getSchema(); + + $this->_json($return); + } + } + + public function revisionsAction() + { + $revisions = isset($_POST['revisions']) ? array_filter($_POST['revisions'], 'is_numeric') : array(); + $current_revision = $this->_getCurrentRevision(); + + if (count($revisions)) { + sort($revisions); + + foreach ($revisions as $revision) { + $files = $this->_getRevisionFiles($revision); + + if (count($files)) { + foreach ($files as $file) { + $file = DBV_REVISIONS_PATH . DS . $revision . DS . $file; + if (!$this->_runFile($file)) { + break 2; + } + } + } + + if ($revision > $current_revision) { + $this->_setCurrentRevision($revision); + } + $this->confirm(__("Executed revision #{revision}", array('revision' => "$revision"))); + } + } + + if ($this->_isXMLHttpRequest()) { + $return = array( 'messages' => array(), 'revision' => $this->_getCurrentRevision() - ); - foreach ($this->_log as $message) { - $return['messages'][$message['type']][] = $message['message']; - } - $this->_json($return); - - } else { - $this->indexAction(); - } - } - - - public function saveRevisionFileAction() - { - $revision = intval($_POST['revision']); - if (preg_match('/^[a-z0-9\._]+$/i', $_POST['file'])) { - $file = $_POST['file']; - } else { - $this->_json(array( + ); + foreach ($this->_log as $message) { + $return['messages'][$message['type']][] = $message['message']; + } + $this->_json($return); + + } else { + $this->indexAction(); + } + } + + public function saveRevisionFileAction() + { + $revision = intval($_POST['revision']); + if (preg_match('/^[a-z0-9\._]+$/i', $_POST['file'])) { + $file = $_POST['file']; + } else { + $this->_json(array( 'error' => __("Filename #{file} contains illegal characters. Please contact the developer.", array('file' => $_POST['file'])) - )); - } + )); + } - $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file; - if (!file_exists($path)) { - $this->_404(); - } + $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file; + if (!file_exists($path)) { + $this->_404(); + } - $content = $_POST['content']; + $content = $_POST['content']; - if (!@file_put_contents($path, $content)) { - $this->_json(array( + if (!@file_put_contents($path, $content)) { + $this->_json(array( 'error' => __("Couldn't write file: #{path}
Make sure the user running DBV has adequate permissions.", array('path' => "$path")) - )); - } - - $this->_json(array('ok' => true, 'message' => __("File #{path} successfully saved!", array('path' => "$path")))); - } - - protected function _createSchemaObject($item) - { - $file = DBV_SCHEMA_PATH . DS . "$item.sql"; - - if (file_exists($file)) { - if ($this->_runFile($file)) { - $this->confirm(__("Created schema object #{item}", array('item' => "$item"))); - } - } else { - $this->error(__("Cannot find file for schema object #{item} (looked in #{schema_path})", array( + )); + } + + $this->_json(array('ok' => true, 'message' => __("File #{path} successfully saved!", array('path' => "$path")))); + } + + + public function addRevisionFileAction() + { + + + $revisions_dir = DBV_REVISIONS_PATH; + + $file_exceptions = array(".", "..",".gitkeep", ".DS_Store", "_notes", "Thumbs.db"); + + $next_rev_id = 1; + + if(file_exists(DBV_REVISIONS_PATH)){ + + $arr_of_revisions = scandir(DBV_REVISIONS_PATH); + + $arr_of_revisions = array_diff($arr_of_revisions, $file_exceptions); + if (count($arr_of_revisions)>0){ + $next_rev_id = max($arr_of_revisions); + $next_rev_id++; + } + + } + + // create revision dir + try { + + if(mkdir(DBV_REVISIONS_PATH. DS .$next_rev_id)){ + $this->confirm(__("Wrote Revision Directory: #{dir}", array('dir' => "" .$next_rev_id.""))); + } + + } catch (DBV_Exception $e) { + $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage()); + } + + + // Agregar alter.sql file + try { + + $file = DBV_REVISIONS_PATH . DS . $next_rev_id . DS ."alter.sql"; + + if (@file_put_contents($file, ' ')) { + $this->confirm(__("Wrote file: #{file}", array('file' => "$file"))); + } else { + $this->error(__("Cannot write file: #{file}", array('file' => "$file"))); + } + } catch (DBV_Exception $e) { + $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage()); + } + + // Reloading message + $this->confirm(__("Reloading page in 5 seconds...")); + + // send result + $return = array('messages' => array()); + foreach ($this->_log as $message) { + $return['messages'][$message['type']][] = $message['message']; + } + + $return['items'] = $this->_getSchema(); + + $this->_json($return); + + + } + + protected function _createSchemaObject($item) + { + $file = DBV_SCHEMA_PATH . DS . "$item.sql"; + + if (file_exists($file)) { + if ($this->_runFile($file)) { + $this->confirm(__("Created schema object #{item}", array('item' => "$item"))); + } + } else { + $this->error(__("Cannot find file for schema object #{item} (looked in #{schema_path})", array( 'item' => "$item", 'schema_path' => DBV_SCHEMA_PATH - ))); - } - } - - protected function _exportSchemaObject($item) - { - try { - $sql = $this->_getAdapter()->getSchemaObject($item); - - $file = DBV_SCHEMA_PATH . DS . "$item.sql"; - - if (@file_put_contents($file, $sql)) { - $this->confirm(__("Wrote file: #{file}", array('file' => "$file"))); - } else { - $this->error(__("Cannot write file: #{file}", array('file' => "$file"))); - } - } catch (DBV_Exception $e) { - $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage()); - } - } - - protected function _runFile($file) - { - $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - - switch ($extension) { - case 'sql': - $content = file_get_contents($file); - if ($content === false) { - $this->error(__("Cannot open file #{file}", array('file' => "$file"))); - return false; - } - - try { - $this->_getAdapter()->query($content); - return true; - } catch (DBV_Exception $e) { - $this->error("[{$e->getCode()}] {$e->getMessage()} in $file"); - } - break; - } - - return false; - } - - protected function _getAction() - { - if (isset($_GET['a'])) { - $action = $_GET['a']; - if (in_array("{$action}Action", get_class_methods(get_class($this)))) { - $this->_action = $action; - } - } - return $this->_action; - } - - protected function _view($view) - { - $file = DBV_ROOT_PATH . DS . 'templates' . DS . "$view.php"; - if (file_exists($file)) { - include($file); - } - } - - protected function _getSchema() - { - $return = array(); - $database = $this->_getAdapter()->getSchema(); - $disk = $this->_getDiskSchema(); - - if (count($database)) { - foreach ($database as $item) { - $return[$item]['database'] = true; - } - } - - if (count($disk)) { - foreach ($disk as $item) { - $return[$item]['disk'] = true; - } - } - - ksort($return); - return $return; - } - - protected function _getDiskSchema() - { - $return = array(); - - foreach (new DirectoryIterator(DBV_SCHEMA_PATH) as $file) { - if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') { - $return[] = pathinfo($file->getFilename(), PATHINFO_FILENAME); - } - } - - return $return; - } - - protected function _getRevisions() - { - $return = array(); - - foreach (new DirectoryIterator(DBV_REVISIONS_PATH) as $file) { - if ($file->isDir() && !$file->isDot() && is_numeric($file->getBasename())) { - $return[] = $file->getBasename(); - } - } - - rsort($return, SORT_NUMERIC); - - return $return; - } - - protected function _getCurrentRevision() - { - switch (DBV_REVISION_STORAGE) { - case 'FILE': - $file = DBV_META_PATH . DS . 'revision'; - if (file_exists($file)) { - return intval(file_get_contents($file)); - } - return 0; - break; - case 'ADAPTER': - return $this->_getAdapter()->getCurrentRevision(); - break; - default: - $this->error("Incorrect revision storage specified"); - break; - } - } - - protected function _setCurrentRevision($revision) - { - switch (DBV_REVISION_STORAGE) { - case 'FILE': - $file = DBV_META_PATH . DS . 'revision'; - if (!@file_put_contents($file, $revision)) { - $this->error("Cannot write revision file"); - } - break; - case 'ADAPTER': - if (!$this->_getAdapter()->setCurrentRevision($revision)){ - $this->error("Cannot save revision to DB"); - } - break; - default: - $this->error("Incorrect revision storage specified"); - break; - } - } - - protected function _getRevisionFiles($revision) - { - $dir = DBV_REVISIONS_PATH . DS . $revision; - $return = array(); - - foreach (new DirectoryIterator($dir) as $file) { - if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') { - $return[] = $file->getBasename(); - } - } - - sort($return, SORT_REGULAR); - return $return; - } - - protected function _getRevisionFileContents($revision, $file) - { - $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file; - if (file_exists($path)) { - return file_get_contents($path); - } - - return false; - } - - public function log($item) - { - $this->_log[] = $item; - } - - public function error($message) - { - $item = array( + ))); + } + } + + protected function _exportSchemaObject($item) + { + try { + $sql = $this->_getAdapter()->getSchemaObject($item); + + $file = DBV_SCHEMA_PATH . DS . "$item.sql"; + + if (@file_put_contents($file, $sql)) { + $this->confirm(__("Wrote file: #{file}", array('file' => "$file"))); + } else { + $this->error(__("Cannot write file: #{file}", array('file' => "$file"))); + } + } catch (DBV_Exception $e) { + $this->error(($e->getCode() ? "[{$e->getCode()}] " : '') . $e->getMessage()); + } + } + + protected function _runFile($file) + { + $extension = strtolower(pathinfo($file, PATHINFO_EXTENSION)); + + switch ($extension) { + case 'sql': + $content = file_get_contents($file); + if ($content === false) { + $this->error(__("Cannot open file #{file}", array('file' => "$file"))); + return false; + } + + try { + $this->_getAdapter()->query($content); + return true; + } catch (DBV_Exception $e) { + $this->error("[{$e->getCode()}] {$e->getMessage()} in $file"); + } + break; + } + + return false; + } + + protected function _getAction() + { + if (isset($_GET['a'])) { + $action = $_GET['a']; + if (in_array("{$action}Action", get_class_methods(get_class($this)))) { + $this->_action = $action; + } + } + return $this->_action; + } + + protected function _view($view) + { + $file = DBV_ROOT_PATH . DS . 'templates' . DS . "$view.php"; + if (file_exists($file)) { + include($file); + } + } + + protected function _getSchema() + { + $return = array(); + $database = $this->_getAdapter()->getSchema(); + $disk = $this->_getDiskSchema(); + + if (count($database)) { + foreach ($database as $item) { + $return[$item]['database'] = true; + } + } + + if (count($disk)) { + foreach ($disk as $item) { + $return[$item]['disk'] = true; + } + } + + ksort($return); + return $return; + } + + protected function _getDiskSchema() + { + $return = array(); + + foreach (new DirectoryIterator(DBV_SCHEMA_PATH) as $file) { + if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') { + $return[] = pathinfo($file->getFilename(), PATHINFO_FILENAME); + } + } + + return $return; + } + + protected function _getRevisions() + { + $return = array(); + + foreach (new DirectoryIterator(DBV_REVISIONS_PATH) as $file) { + if ($file->isDir() && !$file->isDot() && is_numeric($file->getBasename())) { + $return[] = $file->getBasename(); + } + } + + rsort($return, SORT_NUMERIC); + + return $return; + } + + protected function _getCurrentRevision() + { + switch (DBV_REVISION_STORAGE) { + case 'FILE': + $file = DBV_META_PATH . DS . 'revision'; + if (file_exists($file)) { + return intval(file_get_contents($file)); + } + return 0; + break; + case 'ADAPTER': + return $this->_getAdapter()->getCurrentRevision(); + break; + default: + $this->error("Incorrect revision storage specified"); + break; + } + } + + protected function _setCurrentRevision($revision) + { + switch (DBV_REVISION_STORAGE) { + case 'FILE': + $file = DBV_META_PATH . DS . 'revision'; + if (!@file_put_contents($file, $revision)) { + $this->error("Cannot write revision file"); + } + break; + case 'ADAPTER': + if (!$this->_getAdapter()->setCurrentRevision($revision)){ + $this->error("Cannot save revision to DB"); + } + break; + default: + $this->error("Incorrect revision storage specified"); + break; + } + } + + protected function _getRevisionFiles($revision) + { + $dir = DBV_REVISIONS_PATH . DS . $revision; + $return = array(); + + foreach (new DirectoryIterator($dir) as $file) { + if ($file->isFile() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) == 'sql') { + $return[] = $file->getBasename(); + } + } + + sort($return, SORT_REGULAR); + return $return; + } + + protected function _getRevisionFileContents($revision, $file) + { + $path = DBV_REVISIONS_PATH . DS . $revision . DS . $file; + if (file_exists($path)) { + return file_get_contents($path); + } + + return false; + } + + public function log($item) + { + $this->_log[] = $item; + } + + public function error($message) + { + $item = array( "type" => "error", "message" => $message - ); - $this->log($item); - } + ); + $this->log($item); + } - public function confirm($message) - { - $item = array( + public function confirm($message) + { + $item = array( "type" => "success", "message" => $message - ); - $this->log($item); - } - - protected function _404() - { - header('HTTP/1.0 404 Not Found', true); - exit('404 Not Found'); - } - - protected function _json($data = array()) - { - header("Content-type: application/json"); - echo (is_string($data) ? $data : json_encode($data)); - exit(); - } - - protected function _isXMLHttpRequest() - { - if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { - return true; - } - - if (function_exists('apache_request_headers')) { - $headers = apache_request_headers(); - if ($headers['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { - return true; - } - } - - return false; - } - - /** - * Singleton - * @return DBV - */ - static public function instance() - { - static $instance; - if (!($instance instanceof self)) { - $instance = new self(); - } - return $instance; - } + ); + $this->log($item); + } + + protected function _404() + { + header('HTTP/1.0 404 Not Found', true); + exit('404 Not Found'); + } + + protected function _json($data = array()) + { + header("Content-type: application/json"); + echo (is_string($data) ? $data : json_encode($data)); + exit(); + } + + protected function _isXMLHttpRequest() + { + if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { + return true; + } + + if (function_exists('apache_request_headers')) { + $headers = apache_request_headers(); + if ($headers['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { + return true; + } + } + + return false; + } + + /** + * Singleton + * @return DBV + */ + static public function instance() + { + static $instance; + if (!($instance instanceof self)) { + $instance = new self(); + } + return $instance; + } } diff --git a/data/meta/.gitkeep b/data/meta/.gitkeep old mode 100644 new mode 100755 diff --git a/data/revisions/.gitkeep b/data/revisions/.gitkeep old mode 100644 new mode 100755 diff --git a/data/schema/.gitkeep b/data/schema/.gitkeep old mode 100644 new mode 100755 diff --git a/templates/revisions.php b/templates/revisions.php index 077e79b..789232c 100644 --- a/templates/revisions.php +++ b/templates/revisions.php @@ -1,7 +1,10 @@

+
+ +
revisions) && count($this->revisions)) { ?>
-
+ @@ -64,6 +67,30 @@ diff --git a/templates/schema.php b/templates/schema.php index 54486f8..c0e09d4 100644 --- a/templates/schema.php +++ b/templates/schema.php @@ -4,7 +4,6 @@ $selected = $this->_action; } ?> -