首页 > 代码库 > 数据库接口使用说明
数据库接口使用说明
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 = http://www.mamicode.com/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 | 连接失败或文件打开失败 |