diff --git a/class/Api.php b/class/Api.php index 9bdcca3..3044e30 100755 --- a/class/Api.php +++ b/class/Api.php @@ -631,6 +631,76 @@ class Api { $this->err_msg(-1,'Weak password!'); } } + /** + * 获取SQL更新列表 + * 循环读取db/sql/目录下的.sql文件 + */ + public function get_sql_update_list($data) { + //待升级的数据库文件目录 + $sql_dir = 'db/sql/'; + //sql文件列表,默认为空 + $sql_files_all = []; + //打开一个目录,读取里面的文件列表 + if (is_dir($sql_dir)){ + if ($dh = opendir($sql_dir)){ + while (($file = readdir($dh)) !== false){ + //排除.和.. + if ( ($file != ".") && ($file != "..") ) { + array_push($sql_files_all,$file); + + } + } + //关闭句柄 + closedir($dh); + } + } + //判断数据库日志表是否存在 + $sql = "SELECT count(*) AS num FROM sqlite_master WHERE type='table' AND name='on_db_logs'"; + //查询结果 + $q_result = $this->db->query($sql)->fetchAll(); + //如果数量为0,则说明on_db_logs这个表不存在,需要提前导入 + $num = intval($q_result[0]['num']); + if ( $num === 0 ) { + $data = [ + "code" => 0, + "data" => ['on_db_logs'] + ]; + exit(json_encode($data)); + } + } + /** + * 执行SQL更新语句,只执行单条更新 + */ + public function exe_sql($data) { + //数据库sql目录 + $sql_dir = 'db/sql/'; + $name = $data['name']; + $sql_name = $sql_dir.$name.'.sql'; + //如果文件不存在,直接返回错误 + if ( !file_exists($sql_name) ) { + $this->err_msg(-2000,$name.'.sql不存在!'); + } + //读取需要更新的SQL内容 + try { + $sql_content = file_get_contents($sql_name); + $result = $this->db->query($sql_content); + //如果SQL执行成功,则返回 + if( $result ) { + $data = [ + "code" => 0, + "data" => $name.".sql更新完成!" + ]; + exit(json_encode($data)); + } + else{ + //如果执行失败 + $this->err_msg(-2000,$name.".sql更新失败,请人工检查!"); + } + } catch(Exception $e){ + $this->err_msg(-2000,$e->getMessage()); + } + } + } diff --git a/controller/api.php b/controller/api.php index c679692..bd5aa0b 100755 --- a/controller/api.php +++ b/controller/api.php @@ -57,6 +57,12 @@ switch ($method) { case 'get_a_link': get_a_link($api); break; + case 'get_sql_update_list': + get_sql_update_list($api); + break; + case 'exe_sql': + exe_sql($api); + break; default: # code... break; @@ -241,4 +247,16 @@ function check_weak_password($api) { //获取token $token = $_POST['token']; $api->check_weak_password($token); +} + +//获取sql更新列表 +function get_sql_update_list($api){ + $data = []; + $api->get_sql_update_list($data); +} + +//执行SQL更新 +function exe_sql($api) { + $data['name'] = htmlspecialchars(trim($_GET['name'])); + $api->exe_sql($data); } \ No newline at end of file diff --git a/data/update.log b/data/update.log index 438852b..6f905c6 100755 --- a/data/update.log +++ b/data/update.log @@ -43,3 +43,6 @@ CREATE INDEX on_options_key_IDX ON on_options ("key"); 1. 新增HttpOnly支持 2. API新增查询单个链接信息get_a_link 3. API支持查询指定分类下的链接link_list,传递参数category_id + +20220307 +1. 数据库SQL更新API(尚未写完,下班了,先提交) \ No newline at end of file diff --git a/db/sql/20220101.sql b/db/sql/20220101.sql new file mode 100644 index 0000000..e69de29 diff --git a/db/sql/20220301.sql b/db/sql/20220301.sql new file mode 100644 index 0000000..e69de29 diff --git a/db/sql/on_db_logs.sql b/db/sql/on_db_logs.sql new file mode 100644 index 0000000..99f7b58 --- /dev/null +++ b/db/sql/on_db_logs.sql @@ -0,0 +1,11 @@ +-- 2022/03/07数据库升级脚本 +-- 创建数据库升级记录表,用于新增的SQL升级成功后记录到表,方便下次比对 +CREATE TABLE on_db_logs ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + sql_name TEXT(32) NOT NULL, + update_time NUMERIC NOT NULL, + status TEXT(5) DEFAULT true NOT NULL, + extra TEXT(512), + CONSTRAINT on_db_logs_UN UNIQUE (sql_name) +); +CREATE UNIQUE INDEX on_db_logs_sql_name_IDX ON on_db_logs (sql_name);