1 阅读对象
需要操作mysql数据库的c语言开发人员。
2 lstorage功能
封装了mysql操作的主要功能,并对其进行了一定简化。
3 lstorage框架结构
3.1 组件列表
组件名称 |
组件类型 |
功能说明 |
libstorage.so |
动态库 |
|
storage.h |
头文件 |
函数声明 |
datastruct.h |
头文件 |
数据结构及相关宏定义 |
4 功能说明
4.1 数据结构
数据结构 |
原始定义 |
说明 |
_sql_result |
typedefstruct_SQL_RESULT { char **data; }* _sql_result; |
自定义查询接口使用数据结构用于保存查询结果 |
Account_t |
typedefstructSTRUCT_ACCOUNT { //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址 :等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //上线时间:小于等于0时为无效值 longlTimeB; //下线时间:小于等于0时为无效值 longlTimeE; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }Account_t; |
上网账号表数据库操作使用数据结构
|
QQAction_t |
typedefstructSTRUCT_QQACTION { //QQ号:长度为0时,为无效值 charszUserN[USERN_LEN]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //上线时间:小于等于0时为无效值 longlTimeB; //下线时间:小于等于0时为无效值 longlTimeE; //采集区域:等于0时为无效值 UINT uFromCode; //在线状态:等于0时为无效值 UINT uStatus; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }QQAction_t; |
QQ上下线表数据库操作使用数据结构 |
QQMedia_t |
typedefstructSTRUCT_QQMEDIA { //发起人QQ号:长度为0时,为无效值 charszCallN[USERN_LEN]; //接收人QQ号:长度为0时,为无效值 charszRecvN[USERN_LEN]; //发起人上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //发起人IP地址:等于0时为无效值 UINT uCallIP; //接收人IP地址:等于0时为无效值 UINT uRecvIP; //发起人Mac地址:长度为0时,为无效值 charszCallMac[MAC_LEN]; //接收人Mac地址:长度为0时,为无效值 charszRecvMac[MAC_LEN]; //是否境内:小于0时为无效值,非0正数为真,0为假 intiIsDomestic; //开始时间:小于等于0时为无效值 longlTimeB; //结束时间:小于等于0时为无效值 longlTimeE; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }QQMedia_t; |
QQ音视频表使用数据结构 |
IMAction_t |
typedefstructSTRUCT_IMACTION { //应用名:长度为0时,为无效值 charszAppName[APPNAME_LEN]; //用户帐号:长度为0时,为无效值 charszUserN[USERN_LEN]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //上线时间:小于等于0时为无效值 longlTimeB; //下线时间:小于等于0时为无效值 longlTimeE; //采集区域:等于0时为无效值 UINT uFromCode; //在线状态:等于0时为无效值 UINT uStatus; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }IMAction_t; |
其它IM上下线表使用数据结构 |
MailAction_t |
typedefstructSTRUCT_MAILACTION { //邮箱类型:长度为0时,为无效值 charszAppName[APPNAME_LEN]; //邮箱帐号:长度为0时,为无效值 charszUserN[USERN_LEN]; //登录密码:长度为0时,为无效值 charszPassword[64]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //上线时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }MailAction_t; |
邮件上下线表使用数据结构 |
MailContent_t |
typedefstructSTRUCT_MAILCONTENT { //邮箱类型:长度为0时,为无效值 charszAppName[APPNAME_LEN]; //发送人:长度为0时,为无效值 charszMailFrom[USERN_LEN]; //收件人:等于0时,为无效值 char *pszMailTo; //主题:等于0时,为无效值 char *pszSubject; //内容:等于0时,为无效值 char *pszContent; //附件路径:等于0时,为无效值 char *pszAttachFile; //邮件类型,小于0时为无效值,非0正数为收,0为发 intiType; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //采集时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }MailContent_t;
|
邮箱内容表使用上下线数据结构 |
UrlAction_t |
typedefstructSTRUCT_URLACTION { //URl地址:长度为0时,为无效值 charszUrl[URL_LEN]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //访问时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }UrlAction_t; |
网页访问url表使用数据结构 |
DnsAction_t |
typedefstructSTRUCT_DNSACTION { //dns:长度为0时,为无效值 charszDns[URL_LEN]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //访问时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }DnsAction_t; |
网页访问dns表使用数据结构 |
PostAction_t |
typedefstructSTRUCT_POSTACTION { //Url地址:长度为0时,为无效值 charszUrl[URL_LEN]; //域名:长度为0时,为无效值 charszHost[16]; //内容:等于0时,为无效值 char *pszContent; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //访问时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }PostAction_t; |
网页访问Post表使用数据结构 |
HostToken_t |
typedefstructSTRUCT_HOSTTOKEN { //应用名:长度为0时,为无效值 charszAppName[APPNAME_LEN]; //用户帐户名:长度为0时,为无效值 charszUserN[USERN_LEN]; //特征码:长度为0时,为无效值 charszToken[32]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //采集时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }HostToken_t; |
主机标识表使用书记结构 |
BrokenAction_t |
typedefstructSTRUCT_BROKENACTION { //应用名:长度为0时,为无效值 charszAppName[APPNAME_LEN]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //采集时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }BrokenAction_t; |
破网工具表使用数据结构 |
DiskAction_t |
typedefstructSTRUCT_DISKACTION { //应用名:长度为0时,为无效值 charszAppName[APPNAME_LEN]; //用户ID:长度为0时,为无效值 charszUid[USERN_LEN]; //用户名:长度为0时,为无效值 charszUserN[USERN_LEN]; //上网账号:长度为0时,为无效值 charszAccount[ACCOUNT_LEN]; //IP地址:等于0时为无效值 UINT uIP; //Mac地址:长度为0时,为无效值 charszMac[MAC_LEN]; //采集时间:小于等于0时为无效值 longlTimeB; //采集区域:等于0时为无效值 UINT uFromCode; //以下字段用于非插入时使用 //标识符:等于0时为无效值 UINT uId; //条件:起始时间:小于等于0时为无效值 longlES; //条件:结束时间:小于等于0时为无效值 longlEF; }DiskAction_t; |
网盘表使用数据结构 |
DATA_TYPE |
enum DATA_TYPE { //TAccount DATA_ACCOUNT = 0, //TBorkenAction DATA_BROKENACTION, //TDiskAction DATA_DISKACTION, //TDnsAction DATA_DNSACTION, //THostToken DATA_HOSTTOKEN, //TIMAction DATA_IMACTION, //TMailAction DATA_MAILACTION, //TMailContent DATA_MAILCONTENT, //TPostAction DATA_POSTACTION, //TQQAction DATA_QQACTION, //TQQMedia DATA_QQMEDIA, //TUrlAction DATA_URLACTION, }; |
数据表类型标识 |
4.2 方法
方法 |
参数 |
返回 |
说明 |
int Insert( constvoid *data, enum DATA_TYPE data_type, int file_type); |
constvoid *data 相关数据结构指针 enum DATA_TYPE 数据类型标识 int file_type 设备类型 |
>=0受影响的函数 DO_MEMOR(-1) 数据缓存中 DO_OK(-2) 操作成功 < -2 错误信息,详见附表 |
插入一条数据到数据库中,数据可能缓存到一定程度后,统一提交数据库 |
int Select( void **data, unsignedint *rows, constvoid *con, enum DATA_TYPE data_type, int file_type); |
void **data 相关数据结构指针,查询结果集 unsignedint *rows 查询结果集行数 constvoid *con 相关数据结构指针,查询条件 enum DATA_TYPE 数据类型标识 int file_type 设备类型 |
>=0受影响的函数 DO_MEMOR(-1) 数据缓存中 DO_OK(-2) 操作成功 < -2 错误信息,详见附表 |
预定义结构的查询 |
int Update( constvoid *data, constvoid *con, enum DATA_TYPE data_type, int file_type); |
void *data 相关数据结构指针,更新值 constvoid *con 相关数据结构指针,更新条件 enum DATA_TYPE 数据类型标识 int file_type 设备类型 |
>=0受影响的函数 DO_MEMOR(-1) 数据缓存中 DO_OK(-2) 操作成功 < -2 错误信息,详见附表 |
预定义结构的更新 |
int Delete( constvoid *con, enum DATA_TYPE data_type, int file_type); |
constvoid *con 相关数据结构指针,删除条件 enum DATA_TYPE 数据类型标识 int file_type 设备类型 |
>=0受影响的函数 DO_MEMOR(-1) 数据缓存中 DO_OK(-2) 操作成功 < -2 错误信息,详见附表 |
预定义结构的删除 |
int Query( constchar *sql, _sql_result *res, unsignedint *cols, unsignedint *rows); |
constchar *sql, 自定义数据库查询语句 _sql_result *res 数据库查询结果 unsignedint *cols 查询数据集列数,SQL为非查询语句时,请传入NULL指针 unsignedint *rows 查询数据集行数,SQL为非查询语句时,请传入NULL指针 |
>=0受影响的函数 DO_MEMOR(-1) 数据缓存中 DO_OK(-2) 操作成功 < -2 错误信息,详见附表 |
用户自定义数据查询接口 |
void Recover( void **data, unsignedint rows, enum DATA_TYPE data_type); |
void **data, Select函数返回数据集 unsignedint rows 数据集行数 enum DATA_TYPE 数据类型标识 |
无 |
回收由Select函数分配的内存 |
void Recover_Result( _sql_result *res, unsignedint cols, unsignedint rows); |
_sql_result *res, Query函数返回数据集 unsignedint cols, 数据集列数 unsignedint rows 数据集行数 |
无 |
回收由Query函数分配的内存 |
int QuickAccount( char Account[64], unsignedint ip); |
char Account[64] 上网用户账号 unsignedint ip 上网用户账号对应IP地址 |
>=0受影响的函数 DO_MEMOR(-1) 数据缓存中 DO_OK(-2) 操作成功 < -2 错误信息,详见附表 |
快速用户上网账号查询 当Account长度为0时,表示为查到对应账号 |
voidUpdateTimeE( void *data, enum DATA_TYPE data_type); |
void *data 相关数据结构指针,更新值即条件 enum DATA_TYPE data_type 数据类型标识 |
无 |
批量更新TimeE域部分表同时更新Status域 |
5 编译
若编译时报错/usr/bin/ld: warning: libmysql.so.16, needed by ./libstorage.so, not found (try using -rpath or -rpath-link),请手动添加mysql库路径,编译选项如下:
-L $MYSQL_HOME/lib -lmysql -Wl,-rpath=. -Wl,-rpath=$MYSQL_HOME /lib
6 示例
以上网账号表为例,涉及数据结构如下:
Account_t ins, con, value;
strcpy(ins.szAccount, "cpscpscps");
ins.uIP = 123456;
strcpy(ins.szMac, "dd:dd:dd:dd:dd");
ins.lTimeB = 102343214;
ins.lTimeE = 0;
ins.uFromCode = 3;
strcpy(con.szAccount, "cpscpscps");
con.uIP = 0;
con.szMac[0] = 0;
con.lTimeB = 0;
con.lTimeE = 0;
con.uFromCode = 3;
con.uId = 0;
con.lES = 345454343;
con.lEF = 456789023;
value.szAccount[0] = 0;
value.uIP = 0;
value.szMac[0] = 0;
value.lTimeB = 0;
value.lTimeE = 122343214;
value.uFromCode = 0;
//插入
int lines = Insert(&ins, DATA_ACCOUNT, DEVICE_MYSQL);
if (lines < DO_OK)
{
//出错处理
}
生成SQL: INSERT IGNORE INTO TAccount VALUSE(null,’cpscpscps’,123456, ’dd:dd:dd:dd:dd’,FROM_UNIXTIME(102343214),null,3)
//查询
Account_t *data = NULL;
unsigned int rows = 0;
Int lines = Select(&data, &rows, &con, DATA_ACCOUNT, DEVICE_MYSQL);
if (lines < DO_OK)
{
//出错处理
}
//生成SQL:SELECT Id,Account,IPaddress,Mac,FROM_TIMESTAMP(TimeB),FROM_TIMESTAMP(TimeE),FromCode FROM TAccount WHERE Account=’ cpscpscps’ AND FromCode=3 AND TimeB BETWEEN FROM_UNIXTIME(345454343) AND FROM_UNIXTIME(456789023)
//若lES = 0,生成SQL如下: SELECT Id,Account,IPaddress,Mac,FROM_TIMESTAMP(TimeB),FROM_TIMESTAMP(TimeE),FromCode FROM TAccount WHERE Account=’ cpscpscps’ AND FromCode=3 AND TimeB <= FROM_UNIXTIME(456789023)
//若lEF = 0,生成SQL如下: SELECT Id,Account,IPaddress,Mac,FROM_TIMESTAMP(TimeB),FROM_TIMESTAMP(TimeE),FromCode FROM TAccount WHERE Account=’ cpscpscps’ AND FromCode=3 AND TimeB >= FROM_UNIXTIME(345454343)
//若lES = LEF = 0,生成SQL如下: SELECT Id,Account,IPaddress,Mac,FROM_TIMESTAMP(TimeB),FROM_TIMESTAMP(TimeE),FromCode FROM TAccount WHERE Account=’ cpscpscps’ AND FromCode=3
//数据处理
//内存回收
Recover(&data, rows, DATA_ACCOUNT);
//更新
int lines = Update(&value, &con, DATA_ACCOUNT, DEVICE_MYSQL);
if (lines < DO_OK)
{
//出错处理
}
//生成SQL如下:UPDATETAccount SET TimeE=FROM_UNIXTIME(122343214) WHERE Account=’ cpscpscps’ AND FromCode=3 AND TimeB BETWEEN FROM_UNIXTIME(345454343) AND FROM_UNIXTIME(456789023)
//删除
int lines = Delete(&con, DATA_ACCOUNT, DEVICE_MYSQL);
if (lines < DO_OK)
{
//出错处理
}
//生成SQL如下:DELETE FROM TAccount WHERE Account=’ cpscpscps’ AND FromCode=3 AND TimeB BETWEEN FROM_UNIXTIME(345454343) AND FROM_UNIXTIME(456789023)
//自定义查询
Char *sql = “SELECT Account FROM TAccount”;
_sql_result res = 0;
unsignedint cols = 0, rows = 0;
int lines = Query(sql, &res, &cols,&rows);
if (lines < DO_OK)
{
//出错处理
}
//数据处理
//回收内存
Recover(&res, cols, rows);
//快速Account查询
char Account[64];
unsignedint ip = 1232435435;
Int lines = QuickAccount(Account, ip);
if (liens < DO_OK)
{
//出错处理
}
if (Account[0] == 0)
{
//未找到ip所对应的Account
}
//TimeE域批量更新
value.szAccount[0] = “cpscpscps”;
value.uIP = 123213213;
value.szMac[0] = 0;
value.lTimeB = 0;
value.lTimeE = 122343214;
value.uFromCode = 0;
UpdateTimeE(&data, DATA_ACCOUNT);
//生成SQL类似: UPDATE TAccount SET TimeE=FROM_UNIXTIME(122343214) WHERE Account=’cpscpscps’ AND IP=‘123213213’ AND TimeE is null ORDER BY Id ASC LIMIT 1
附表.操作代码及对应信息
代码 |
值 |
信息 |
DO_MEMORY |
-1 |
数据缓存中 |
DO_OK |
-2 |
操作成功 |
DO_ERROR_SQL |
-3 |
SQL语句错误 |
DO_ERROR_KEY |
-4 |
无对应关键字 |
DO_ERROR_INVALID |
-5 |
无效的数据类型 |
DO_ERROR_REPAIR |
-6 |
自动修复失败 |
DO_ERROR_RKEY |
-7 |
重复的关键字 |
DO_ERROR_UN |
-8 |
未知错误 |
DO_ERROR_OPEN |
-9 |
连接失败或文件打开失败 |