数据库接口使用说明

 

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

连接失败或文件打开失败

数据库接口使用说明,布布扣,bubuko.com

数据库接口使用说明

上一篇:《MySQL必知必会》读书笔记_3


下一篇:FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中