sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
一、功能
- 在开机启动时候,给sqlite3数据库内,添加 ’固定’ 信息的运行日志;
- 并把日志写入[.log]文件内;
- 日志信息的6个字段为:
时间time、类型type、主体subject、客体object、结果result、备注remark - 数据库显示为:
time type subject object result remark
-------------------------------------------------------------------------------------------
2019-05-28 10:49:13 系统日志 系统 硬件 成功 完成硬件自检 - 日志显示为:
2019-05-28 11:18:18 localhost :内容: '系统日志','系统','硬件','成功','系统完成硬件自检'
二、准备工作:
1、创建数据库test.db;
# cd /home/workspace/
# touch test.db
# chmod 777 test.db
# sqlite3 test.db
2、创建表testlog,保存日志的文件;
sqlite>CREATE TABLE testlog(time text,type text,subject text,object text,result text,remark text);
三、为表内添加信息----C实现【增加】:
1、代码实现
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <time.h>
#include <unistd.h>#define SUCCESS 0
#define FAILED -1
#define SQL_COMMON_LEN 1024
#define TEST_LOG_NAME "testlog"/*使用前先建立fw.db数据库,建立syslog表:create table syslog(time text,type text,subject text,object text,result text,remark text);编译时候:gcc operation_log.c -lsqlite3 -o operation_log*/int main()
{int iOpenVal = 0;char acSql[SQL_COMMON_LEN] = {0};char acTime[SQL_COMMON_LEN] = {0};char *fwdb="/home/workspace/test.db";sqlite3 *db = NULL;time_t stTime = {0};struct tm *stTmpPtr = NULL;//获取本地时间stTime = time(NULL);stTmpPtr = localtime(&stTime);sprintf(acTime, "%04d-%02d-%02d %02d:%02d:%02d",stTmpPtr->tm_year+1900, stTmpPtr->tm_mon+1, stTmpPtr->tm_mday,stTmpPtr->tm_hour, stTmpPtr->tm_min, stTmpPtr->tm_sec);//连接sqlite3数据库iOpenVal = sqlite3_open(fwdb, &db);if(iOpenVal != SQLITE_OK){return FAILED;}//拼接日志信息,并加入数据库sprintf(acSql, "insert into %s values('%s','系统日志','系统','硬件','成功','系统完成硬件自检')", TEST_LOG_NAME, acTime);iOpenVal = sqlite3_exec(db, acSql, NULL, NULL, NULL);if(iOpenVal != SQLITE_OK){printf("出错:执行插入数据出错!\n");return FAILED;}sqlite3_close(db);//找出所有日志文件sprintf(acSql, "sudo sqlite3 %s \"select * from %s\"", fwdb, TEST_LOG_NAME);//把每行的竖线变为空格strcat(acSql, "| sed -r 's/\\|/ /g'");//重新拼接strcat(acSql, "| awk '{print $1,$2,\"localhost :内容:\",\"'\\''\"$3\"'\\''\"\",\"\"'\\''\"$4\"'\\''\"\",\"\"'\\''\"$5\"'\\''\"\",\"\"'\\''\"$6\"'\\''\"\",\"\"'\\''\"$7\"'\\''\"}'");//重定向strcat(acSql, "> /home/workspace/test.log");system(acSql);return SUCCESS;
}
2、代码编译执行
# gcc test.c -lsqlite3 -o test#./test
3、查看数据库[testlog表]
# sqlite3 /home/workspace/test.dbsqlite> .du testlogPRAGMA foreign_keys=OFF;BEGIN TRANSACTION;CREATE TABLE testlog(time text,type text,subject text,object text,result text,remark text);INSERT INTO "testlog" VALUES('2019-05-28 11:18:18','系统日志','系统','硬件','成功','系统完成硬件自检');
4、查看日志文件[/home/workspace/test.log]
# cat /home/workspace/test.log2019-05-28 11:18:18 localhost :内容: '系统日志','系统','硬件','成功','系统完成硬件自检'
四、【增加】代码解释说明
《1》Linux —— 时间问题(localtime和gmtime)
- localtime是把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间;
- 而gmtime函数转换后的时间没有经过时区变换,是UTC时间;
- Gmtime获取的时间比localtime获取的时间少8个小时;
- Localtime例子点击上方的链接。。即可查看。。
《2》sqlite的语句-数据操作语言
1、INSERT(插入)
insert into testlog values('时间','系统日志','系统','硬件','成功','系统完成硬件自检')
2、SELECT(查询)
2、1 System命令,在控制台直接执行sqlite的查询select语句:
sprintf(acSql, "sudo sqlite3 test.db \"select * from %s\"", fwdb, /home/workspace/test.gb);
2、2 直接在命令行执行sqlite的查询语句:
# sudo sqlite3 /home/workspace/test.db "select * from testlog"
《3》Sed命令使得所有的’|’变为’ ’空格
3、1 控制台执行:
sed -r 's/\|/ /g' 注意:竖线前不加转义字符或者不加-r,都不能匹配中文;
3、2 代码内写为:
strcat(acSql, "| sed -r 's/\\|/ /g'"); 注意:再加一个转义字符,用来转义反斜杠;
《4》使用awk命令重新排布信息
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g'
2019-05-28 15:31:15 系统日志 系统 硬件 成功 系统完成硬件自检
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g' | awk '{print $2,$3,$1}'
15:31:15 系统日志 2019-05-28
《5》使用awk命令在输出语句中有单引号’’,有逗号
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g'
2019-05-28 15:42:48 系统日志 系统 硬件 成功 系统完成硬件自检
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g' | awk '{print $2","$3"'\''",$1}'
15:31:15,系统日志' 2019-05-28
五、删除表内内容,并删除日志文件---C实现【删除】:
1、插入代码
[root@localhost workspace]# cat sql_lite_delete.c
#include <stdio.h>
#include <unistd.h>#define SUCCESS 0
#define FAILED -1#define DATABASE_TEST_LOG_PATH "/home/workspace/test.db"
#define DATABASE_TEST_LOG_NAME "testlog"
#define TEST_LOG_PATH "/home/workspace/test.log"
#define COM_LEN 1024int main(void)
{FILE *pf = NULL;char acSql[COM_LEN] = {0};//清空数据库 popen()函数执行sql语句sprintf(acSql, "sudo sqlite3 %s \"delete from %s\"", DATABASE_TEST_LOG_PATH, DATABASE_TEST_LOG_NAME);pf = popen(acSql, "r");if(NULL == pf){printf("执行sql语句失败!\n");return FAILED;}pclose(pf);//删除日志文件 remove()函数remove(TEST_LOG_PATH);return SUCCESS;
}
2、编译执行
# gcc sql_lite_delete.c -lsqlite3 -o sql_lite_delete
3、运行结果
3、1 查看数据库
3、2 查看文件
sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息相关推荐
- mysql数据库 日志类型_MySQL中的日志类型(一)-摘要和日志的共同特征
MySQL中的日志类型(一)-摘要和日志的共同特征 发布时间:2020-07-12 19:56:15 来源:51CTO 阅读:506 作者:月饮沙 MySQL中的日志类型 MySQL具有多种日志,用来 ...
- 使用.reg文件删除暴风影视库图标和注册信息
暴风播放器安装后会自动安装一个叫暴风影音库的软件,在你的电脑资源管理器中增加了一个"暴风影视库"的图标.看着很烦,删起来还比较麻烦,于是搜索了相关资源,自己写了个注册表处理文件,方 ...
- 69. (待补) (使用sqlite3)实现简单的管理系统 MVC 将链表作为内存数据模型,将sqlite3作为数据库,将终端作为交互界面。读数据库生成 链表,修改链表写入文件。...
待补 转载于:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9571219.html
- mysql 修改库的校对集_mysql数据库的基本操作(增删改查、字符集、校对集)
MySQL数据库概述 MySQL数据库是经典的关系型数据库管理系统,MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Dat ...
- C基础——目标代码文件、可执行文件和库
目标代码文件.可执行文件和库 C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码.C分两步完成这一工作:编译和链接.编译器将源代码转换为中间代码,链接器将此中间代 ...
- sqlite库 —— 为什么要使用 SQLite 数据库?
SQLite 是一个被大家低估的数据库,但有些人认为它是一个不适合生产环境使用的玩具数据库.事实上,SQLite 是一个非常可靠的数据库,它可以处理 TB 级的数据,但它没有网络层.接下来,本文将与大 ...
- sqlite只能用于android系统,Android 数据库的使用 -- Sqlite
Sqlite介绍 SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守 ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式系统中. SQLite 数据库是无类型的, ...
- android sqlite 操作类封装,[Android] Sqlite 数据库操做 工具封装类
sqlite 数据库封装类html DatabaseUtil.java(封装的类)java packagecom.jack.androidbase.tools;importandroid.conten ...
- sqlite mysql excel_SQlite数据库信息怎么转成excel文件?
展开全部 下面的程序能将SQlite数据库信息怎么转成excel文件:package zhaoxing.android.tool; import java.io.File; import java.i ...
- mysql 给库赋权,MySQL 8.0.18给数据库添加用户和赋权问题
MySQL 8.0.18给数据库添加用户和赋权问题 1. 首选使用root用户登录数据库 mysql -uroot -p 2. 使用mysql 数据库 USE mysql; 3. 为mysql创建用户 ...
最新文章
- IE下a标签会触发window.onbeforeunload的问题
- pycharm怎么查看代码结构,看函数定义、变量定义、类定义索引、目录?(左方structure)
- Javascript进阶篇——浏览器对象—Location、Navigator、userAgent、screen对象Script
- 砂.随笔.二十.微笑
- ssh-keygen -t rsa执行后提示没有权限
- silverlight动态创建WCF服务
- 卸载centos7自带mysql_centos7完全卸载mysql
- sql 获取第10到20个记录
- 顶点计划家庭感情冲突问题讨论
- HDU操作系统课程设计实验一
- 信息系统项目管理师必背核心考点(二十六)三点估算(PERT)
- python爬取在线视频思路,用python实现多线程爬取影视网站全部视频方法【笔记】...
- 苹果iOS开发者账号从零开始申请
- 认识程序集:1. 程序集的生成
- python win32api键盘_pythonwin32api键盘输入教程
- pip 安装 sklearn 教程 ----Win10 python3.5
- 最新版chrome浏览器安装Chrome插件时出现“CRX-HEADER-INVALID“解决方法
- 计算机网络相关实验,计算机网络实验
- 网页设计常用的12中颜色
- 视频处理工具安利,要制作视频的快来
热门文章
- python 文件命令
- WHUST 2015 Summer Contest #11
- 【学习笔记】【oc】类和对象及类的三大基本特征
- 25个自适应菜单教程和脚本
- 使用 x3dom 框架及 WebGL 在浏览器上显示 3 维模型
- c语言 amp 位与 什么意思,C语言中amp;是什么意思?--龙方网络
- linux怎么增加cpu负载,Linux下的CPU平均负载
- word设置不同页脚
- WebService大讲堂之Axis2(5):会话(Session)管理
- 一句话说清楚NodeJS中module.exports和exports的区别