C++ 通过SQLite实现命令行工具

本文介绍了一个基于 C++、SQLite 和 Boost 库的简单交互式数据库操作 Shell。该 Shell 允许用户通过命令行输入执行各种数据库操作,包括添加、删除主机信息,设置主机到特定主机组,以及显示主机和主机组列表。通过调用 SQLite3 库实现数据库连接和操作,以及使用 Boost 库进行字符串解析和格式化。该交互式 Shell 提供了一些基本的命令,使用户能够方便地管理主机信息和组织结构。代码结构清晰,易于理解,可根据需要扩展和定制功能。

数据库的基本使用方法请看《C/C++ 通过SQLiteSDK增删改查》这篇文章,针对如何使用Boost解析命令行参数请看《4.9 C++ Boost 命令行解析库》这篇文章,此处只给出实现代码,如下所示;

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <time.h>
#include "sqlite3.h"

#include <boost/format.hpp>
#include <boost/tokenizer.hpp>
#include <boost/lexical_cast.hpp>

using namespace std;
using namespace boost;

sqlite3* open_database(std::string database_name)
{
	int ref = -1;
	sqlite3 *db = 0;

	ref = sqlite3_open(database_name.c_str(), &db);
	if (ref == SQLITE_OK)
		return db;
	return false;
}
bool close_database(sqlite3 *db)
{
	int ref = sqlite3_close(db);
	if (ref == SQLITE_OK)
		return true;
	return false;
}
bool exec_sql(sqlite3 *db, char *sql)
{
	char *error_code = 0;
	int ref = sqlite3_exec(db, sql, 0, 0, &error_code);
	if (ref == SQLITE_OK)
	{
		return true;
	}
	return false;
}

// 初始化创建表结构
void Init_Database()
{
	sqlite3* open_db = open_database("./database.db");
	if (open_db != false)
	{
		std::string sql =
			"create table HostDB("
			"uid primary key,"
			"host_address char(128) not null,"
			"host_username char(128) not null,"
			"host_password char(128) not null,"
			"host_port char(128) not null,"
			"host_group char(128) not null default 'DefaultGroup'"
			");";
		char run_sql[1024] = { 0 };
		strcpy(run_sql, sql.c_str());
		exec_sql(open_db, run_sql);
	}
	close_database(open_db);
}

// 增加一条主机记录
void AddHost_DB(sqlite3* open_db, std::string address, std::string username, std::string password, std::string port)
{
	std::string format_string = boost::str(boost::format("insert into HostDB(host_address,host_username,host_password,host_port) values('%s','%s','%s','%s');") % address %username %password %port);
	char run_sql[2048] = { 0 };
	strcpy(run_sql, format_string.c_str());
	bool ref = exec_sql(open_db, run_sql);
	if (ref == true)
	{
		std::cout << "[+] 增加主机: " << address << " 完成" << std::endl;
	}
}

// 删除特定主机记录
void DeleteHost_DB(sqlite3 *open_db, std::string address)
{
	std::string format_string = boost::str(boost::format("delete from HostDB where host_address = '%s';") % address);
	char run_sql[2048] = { 0 };
	strcpy(run_sql, format_string.c_str());
	bool ref = exec_sql(open_db, run_sql);
	if (ref == true)
	{
		std::cout << "[-] 删除主机: " << address << " 完成" << std::endl;
	}
}

// 将特定主机加入到特定主机组
void SetHostGroup_DB(sqlite3* open_db, std::string address, std::string group_name)
{
	std::string format_string = boost::str(boost::format("update HostDB set host_group='%s' where host_address = '%s';") % group_name %address);
	char run_sql[2048] = { 0 };
	strcpy(run_sql, format_string.c_str());
	bool ref = exec_sql(open_db, run_sql);
	if (ref == true)
	{
		std::cout << "[+] 主机: " << address << " 已加入到: " << group_name << " 组" << std::endl;
	}
}

// 输出所有主机组
void ShowHostGroup_DB(sqlite3 *open_db)
{
	sqlite3_stmt *stmt = 0;
	// std::string format_string = "SELECT distinct(host_group) FROM 'HostDB';";
	std::string format_string = "SELECT host_group,count(*) FROM HostDB GROUP BY host_group;";

	char run_sql[1024] = { 0 };
	strcpy(run_sql, format_string.c_str());

	int ref = sqlite3_prepare_v2(open_db, run_sql, -1, &stmt, 0);
	if (ref == SQLITE_OK)
	{
		while (sqlite3_step(stmt) == SQLITE_ROW)
		{
			const unsigned char *host_group = sqlite3_column_text(stmt, 0);
			int host_group_count = sqlite3_column_int(stmt, 1);

			std::cout << host_group << "                    " << host_group_count << std::endl;
		}
	}
	sqlite3_finalize(stmt);
}

// 输出所有主机
void ShowHost_DB(sqlite3 *open_db)
{
	sqlite3_stmt *stmt = 0;
	std::string format_string = "select * from HostDB;";

	char run_sql[1024] = { 0 };
	strcpy(run_sql, format_string.c_str());

	int ref = sqlite3_prepare_v2(open_db, run_sql, -1, &stmt, 0);
	if (ref == SQLITE_OK)
	{
		while (sqlite3_step(stmt) == SQLITE_ROW)
		{
			const unsigned char *host_address = sqlite3_column_text(stmt, 1);
			const unsigned char *host_username = sqlite3_column_text(stmt, 2);
			const unsigned char *host_paddword = sqlite3_column_text(stmt, 3);
			const unsigned char *host_port = sqlite3_column_text(stmt, 4);
			const unsigned char *host_group = sqlite3_column_text(stmt, 5);

			std::cout << host_address << "     "
				<< host_username << "     "
				<< host_paddword << "     "
				<< host_port << "     "
				<< host_group << std::endl;
		}
	}
	sqlite3_finalize(stmt);
}

// 输出特定主机组中的主机
void ShowGroupHostList(sqlite3 *open_db, std::string group_name)
{
	sqlite3_stmt *stmt = 0;
	std::string format_string = boost::str(boost::format("select * from HostDB where host_group = '%s';") % group_name);
	char run_sql[2048] = { 0 };
	strcpy(run_sql, format_string.c_str());

	int ref = sqlite3_prepare_v2(open_db, run_sql, -1, &stmt, 0);
	if (ref == SQLITE_OK)
	{
		std::cout << "----------------------------------------------------------" << std::endl;
		std::cout << "主机组: " << group_name << std::endl;
		std::cout << "----------------------------------------------------------" << std::endl;
		while (sqlite3_step(stmt) == SQLITE_ROW)
		{
			const unsigned char *host_address = sqlite3_column_text(stmt, 1);
			const unsigned char *host_username = sqlite3_column_text(stmt, 2);
			const unsigned char *host_port = sqlite3_column_text(stmt, 4);

			std::cout << host_address << "     "
				<< host_username << "     "
				<< host_port << std::endl;
		}
	}
	sqlite3_finalize(stmt);
}

int main(int argc, char const *argv[])
{
	sqlite3* open_db = open_database("./database.db");
	Init_Database();
	std::string command;

	while (1)
	{
		std::cout << "[ LyShark Shell ] # ";
		std::getline(std::cin, command);

		if (command.length() == 0)
		{
			continue;
		}
		else if (command == "help")
		{
			std::cout << "帮助菜单" << std::endl;
		}
		else
		{
			boost::char_separator<char> sep(", --");
			typedef boost::tokenizer<boost::char_separator<char>> CustonTokenizer;
			CustonTokenizer tok(command, sep);
			std::vector<std::string> vecSegTag;
			for (CustonTokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg)
			{
				vecSegTag.push_back(*beg);
			}
			if (vecSegTag.size() == 9 && vecSegTag[0] == "AddHost")
			{
				if (vecSegTag[1] == "address" && vecSegTag[3] == "username" && vecSegTag[5] == "password" && vecSegTag[7] == "port")
				{
					std::string set_address = vecSegTag[2];
					std::string set_username = vecSegTag[4];
					std::string set_password = vecSegTag[6];
					std::string set_port = vecSegTag[8];
					AddHost_DB(open_db, set_address, set_username, set_password, set_port);
				}
			}
			else if (vecSegTag.size() == 3 && vecSegTag[0] == "DeleteHost")
			{
				if (vecSegTag[1] == "address")
				{
					std::string set_address = vecSegTag[2];
					DeleteHost_DB(open_db, set_address);
				}
			}
			else if (vecSegTag.size() == 5 && vecSegTag[0] == "SetHostGroup")
			{
				if (vecSegTag[1] == "address" && vecSegTag[3] == "group")
				{
					std::string set_address = vecSegTag[2];
					std::string set_group = vecSegTag[4];
					SetHostGroup_DB(open_db, set_address, set_group);
				}
			}
			else if (vecSegTag.size() == 1 && vecSegTag[0] == "ShowHost")
			{
				std::cout << "-----------------------------------------------------------------------------" << std::endl;
				std::cout << "IP地址     " << "用户名     " << "密码     " << "端口号     " << "默认组     " << std::endl;
				std::cout << "-----------------------------------------------------------------------------" << std::endl;
				ShowHost_DB(open_db);
			}
			else if (vecSegTag.size() == 1 && vecSegTag[0] == "ShowHostGroup")
			{
				std::cout << "-----------------------------------------------------------------------------" << std::endl;
				std::cout << "主机组名     " << "主机数量     " << std::endl;
				std::cout << "-----------------------------------------------------------------------------" << std::endl;
				ShowHostGroup_DB(open_db);
			}
			else if (vecSegTag.size() == 3 && vecSegTag[0] == "ShowGroupHostList")
			{
				if (vecSegTag[1] == "group")
				{
					std::string set_group = vecSegTag[2];
					ShowGroupHostList(open_db, set_group);
				}
			}
		}
	}

	close_database(open_db);
	return 0;
}

添加主机记录: AddHost --address 192.168.1.1 --username root --password 1233 --port 22

删除主机记录: DeleteHost --address 192.168.1.1

将特定主机设置到主机组: SetHostGroup --address 192.168.1.1 --group WebServer

输出所有主机列表: ShowHost

输出所有主机组: ShowHostGroup

输出特定主机组中的主机: ShowGroupHostList --group DefaultGroup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189395.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

适用于 Mac 和 Windows 的顶级U 盘数据恢复软件

由于意外删除或设备故障而丢失 USB 驱动器中的数据始终是一件令人压力很大的事情&#xff0c;检索该信息的最佳选择是使用优质数据恢复软件。为了让事情变得更容易&#xff0c;我们已经为您完成了所有研究并测试了工具&#xff0c;并且我们列出了最好的 USB 记忆棒恢复软件&…

elasticsearc DSL查询文档

文章目录 DSL查询文档DSL查询分类全文检索查询使用场景基本语法示例 精准查询term查询range查询总结 地理坐标查询矩形范围查询附近查询 复合查询相关性算分算分函数查询1&#xff09;语法说明2&#xff09;示例3&#xff09;小结 布尔查询1&#xff09;语法示例&#xff1a;2&…

基于C#实现Kruskal算法

这篇我们看看第二种生成树的 Kruskal 算法&#xff0c;这个算法的魅力在于我们可以打一下算法和数据结构的组合拳&#xff0c;很有意思的。 一、思想 若存在 M{0,1,2,3,4,5}这样 6 个节点&#xff0c;我们知道 Prim 算法构建生成树是从”顶点”这个角度来思考的&#xff0c;然…

车载电子电器架构 ——电子电气架构设计方案概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 注:本文1万多字,认证码字,认真看!!! 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证…

机器学习探索计划——KNN算法流程的简易了解

文章目录 数据准备阶段KNN预测的过程1.计算新样本与已知样本点的距离2.按照举例排序3.确定k值4.距离最近的k个点投票 scikit-learn中的KNN算法 数据准备阶段 import matplotlib.pyplot as plt import numpy as np# 样本特征 data_X [[0.5, 2],[1.8, 3],[3.9, 1],[4.7, 4],[6.…

FreeRTOS入门教程(任务通知)

文章目录 前言一、什么是任务通知二、任务通知和队列&#xff0c;信号量的区别三、任务通知的优点和缺点1.优点2.缺点 四、任务状态和通知值五、任务通知相关的函数发出通知取出通知 六、任务通知具体使用1.实现轻量级信号量二进制信号量计数型信号量 2.实现轻量级队列 总结 前…

数仓中数据清洗的方法

在数据采集的过程中&#xff0c;需要从不同渠道获取数据并汇集在数仓中&#xff0c;采集的原始数据首先需要进行解析&#xff0c;然后对不准确、不完整、不合理、格式、字符等不规范数据进行过滤清洗&#xff0c;清洗过的数据才能更加符合需求&#xff0c;从而使后续的数据分析…

【数据库】执行计划中二元操作对一趟扫描算法的应用,理解代价评估的应用和优化,除了磁盘代价还有CPU计算代价不容忽略

二元操作的一趟算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

Java中的异常语法知识居然这么好玩!后悔没有早点学习

学习异常后&#xff0c;发现异常的知识是多么的吸引人&#xff01;不仅可以用来标记错误&#xff0c;还可以自己定义一个异常&#xff0c;用来实现自己想完成的业务逻辑&#xff0c;接下来一起去学习吧 目录 一、异常的概念及体系结构 1.异常的概念 2.异常的体系结构 3.异常…

【数据处理】 -- 【两分钟】了解【最好】的方式 -- 【正则表达式】

直接匹配&#xff1b; 普通字符 元匹配&#xff1a; . 任意单字符 r’表示单引号里字符为其特殊含义&#xff0c;比如.不是句号是匹配符的意思 *任意次数&#xff08;换行结束&#xff09; 一次及以上 {3,4}指定次数,至少3次&#xff0c;最多4次|{3}固定4次 [\d.]单个任意…

软件工程简明教程

软件工程简明教程 何为软件工程&#xff1f; 1968 年 NATO&#xff08;北大西洋公约组织&#xff09;提出了软件危机&#xff08;Software crisis&#xff09;一词。同年&#xff0c;为了解决软件危机问题&#xff0c;“软件工程”的概念诞生了。一门叫做软件工程的学科也就应…

redis运维(二十)redis 的扩展应用 lua(二)

一 redis 的扩展应用 lua redis lua脚本语法 ① 什么是脚本缓存 redis 缓存lua脚本 说明&#xff1a; 重启redis,脚本缓存会丢失 下面讲解 SCRIPT ... 系列 SCRIPT ② LOAD 语法&#xff1a;SCRIPT LOAD lua代码 -->载入一个脚本,只是预加载,不执行思考1&#xff1…

吴恩达《机器学习》10-4-10-5:诊断偏差和方差、正则化和偏差/方差

一、诊断偏差和方差 在机器学习中&#xff0c;诊断偏差和方差是改进模型性能的关键步骤。通过了解这两个概念&#xff0c;能够判断算法的问题究竟是欠拟合还是过拟合&#xff0c;从而有针对性地调整模型。 1. 概念理解 偏差&#xff08;Bias&#xff09;&#xff1a; 表示模…

《微信小程序开发从入门到实战》学习三十一

3.4 开发参与投票页面 3.4.9 显示投票结果 在实际使用中&#xff0c;一个用户不能对同一个投票进行重复提交&#xff0c;因此需要向服务器端提交投票结果和提交用户ID。另外页面&#xff0c;需要完善。用户提交完投票后 &#xff0c;还需要显示投票目前的结果&#xff0c;提交…

C#,《小白学程序》第二十课:大数的加法(BigInteger Add)

大数的&#xff08;加减乘除&#xff09;四则运算、阶乘运算。 乘法计算包括小学生算法、Karatsuba和Toom-Cook3算法。 重复了部分 19 课的代码。 1 文本格式 using System; using System.Linq; using System.Text; using System.Collections.Generic; /// <summary>…

字符串函数

目录 读取字符串的函数 1.gets()函数 2.fgets()函数&#xff08;不是所有的编译器都支持例如CodeBlocks&#xff09; 3.scanf()函数 4.getchar()函数 输出字符串的函数 1.puts()函数 2.fputs()函数&#xff08;编译器不一定支持&#xff09; 3.printf()函数 4.putchar…

【开源】基于Vue.js的陕西非物质文化遗产网站

文末获取源码&#xff0c;项目编号&#xff1a; S 065 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S065。} 文末获取源码&#xff0c;项目编号&#xff1a;S065。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于多尺度分量特征学习的用户级超短期负荷预测》

这篇文章的标题表明研究的主题是用户级超短期负荷预测&#xff0c;并且该预测方法基于多尺度分量特征学习。让我们逐步解读这个标题&#xff1a; 用户级&#xff1a; 这表示研究的焦点是在个体用户层面上进行的。负荷预测可能是指电力系统中的负荷&#xff0c;即电力需求。用户…

大模型能否生成搜索引擎的未来?

文&#xff5c;郝 鑫 编&#xff5c;刘雨琦 ChatGPT火爆之前&#xff0c;水面下&#xff0c;也有中国公司也在朝着智能助手的方向努力。夸克便是其中之一。在GPT风靡科技圈后&#xff0c;国内就开始陆续冒出一些大模型厂商。对当时夸克而言&#xff0c;做大模型毋庸置疑&am…

五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度(MATLAB)

一、多目标优化算法简介 &#xff08;1&#xff09;多目标粒子群优化算法MOPSO 多目标应用&#xff1a;基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度&#xff08;MATLAB代码&#xff09;-CSDN博客 &#xff08;2&#xff09;多目标人工蜂鸟算法&#xff08;MOAHA…