python封装c接口_用C为python3.1封装mysql接口(一)

/*main.cpp 指定编译为C代码,工程设置为dll,编译后得到的模块名.dll 修改为模块名.pyd*/#include#include

structmy_sqldata

{

MYSQL mysql_conn;//用于连接mysql的

MYSQL_RES *mysql_result;//查询后的结果

MYSQL_ROW curren_row; //当前行

unsignedint num_row; //查询的结果集的行数

unsigned int num_col; //此次查询的行的列数

unsignedint cur_row; //当前行

unsigned int cur_col; //当前列

unsignedint affected_rownum; //受影响的行数

int m_isconnect; //是否连接上 1则连上

int m_isfree; //是否被释放 1表示释放

};//连接数据库

static int my_sql_connect(void *temp, char *host, char *user, char *passwd, char *db, unsigned int port, char *unix_socket, unsigned longclientflag)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)(temp);if(!mysql_conn)return -1;if((mysql_conn->m_isfree == 1) || (mysql_conn->m_isconnect == 1))//已释放或者已连接上。则返回

return -1;if(mysql_real_connect(&mysql_conn->mysql_conn, host, user, passwd, db, port, unix_socket, clientflag) != NULL)//非NULL表示成功

{

mysql_conn->m_isconnect = 1;//已连接上

return 0;

}else

return -1;

}//返回初始化成功的用于连接mysql的handle//成功返回指针。失败返回NULL

static void *my_sql_init()

{struct my_sqldata *mycon = (struct my_sqldata*)malloc(sizeof(structmy_sqldata));if(!mycon)returnNULL;

memset(mycon,0, sizeof(structmy_sqldata));if(mysql_init(&mycon->mysql_conn) != NULL)//初始化成功

{return (void*)mycon;

}else{free(mycon);//先释放

returnNULL;

}

}//关闭用于mysql数据库连接的handle

static int my_sql_close(void *temp)

{int closeresult = 0;struct my_sqldata *mycon = (struct my_sqldata*)temp;if(!mycon)return -1;if(mycon->m_isfree == 1)//释放过了。

return -1;if(mycon->mysql_result != NULL)//如果结果集非空。则释放他

{

mysql_free_result(mycon->mysql_result);

}

mysql_close(&mycon->mysql_conn); //关闭

memset(mycon, 0, sizeof(struct my_sqldata));//清空

mycon->m_isfree = 1; //表示已释放

free(mycon);//释放

return 0;

}//设置字符编码

static int my_sql_set_coding(void *temp, char *coding)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if((!mysql_conn)||(!coding))return -1;if((mysql_conn->m_isfree == 1) ||(mysql_conn->m_isconnect != 1))//释放过了或者未连接上

return -1;if(mysql_set_character_set(&mysql_conn->mysql_conn, coding) == 0)//成功

return 0;else

return -1;

}//返回在此数据库连接上查询的结果//参数mysql_conn为已经建立的合法的连接//query为以字符'\0'为结尾的字串//查询/更新/插入成功返回受影响的行数,失败返回-1

static int my_sql_query(void *temp, char *query)

{

unsignedint len =strlen(query);struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if((!mysql_conn)||(!query))//任一为NULL。则返回NULL

return -1;if(len == 0)return -1;if((mysql_conn->m_isfree == 1) ||(mysql_conn->m_isconnect != 1))//释放过了或者未连接上

return -1;if(mysql_real_query(&mysql_conn->mysql_conn, query, len) != 0)//非0则查询失败

return -1;

mysql_conn->mysql_result = mysql_store_result(&mysql_conn->mysql_conn);if(!mysql_conn->mysql_result)//装入查询结果,如果是update,insert等。可能会走到这块

{

mysql_conn->affected_rownum = mysql_affected_rows(&mysql_conn->mysql_conn);return mysql_conn->affected_rownum;

}

mysql_conn->cur_col = 0;//当前列

mysql_conn->cur_row = 0;//当前行

mysql_conn->num_row = mysql_num_rows(mysql_conn->mysql_result); //获取此次查询结果的行数

mysql_conn->num_col = mysql_num_fields(mysql_conn->mysql_result);//获取列数

mysql_conn->affected_rownum = mysql_affected_rows(&mysql_conn->mysql_conn);return mysql_conn->affected_rownum;

}//获取受影响的行数

static int my_sql_get_affectedrows(void *temp)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!temp)return -1;if((mysql_conn->m_isfree == 1) ||(mysql_conn->m_isconnect != 1))//释放过或者未连接上

{return -1;

}return mysql_conn->affected_rownum;

}//获取下一个字段,最早返回第0字段

static char *my_sql_get_field(void *temp, intindex)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;

unsignedintnumcol;if(!mysql_conn)returnNULL;if((mysql_conn->m_isfree == 1) ||(mysql_conn->m_isconnect != 1))//释放过了或者未连接上

returnNULL;if(mysql_conn->curren_row == NULL)//当前行为NULL,则返回NULL

{returnNULL;

}if(mysql_conn->cur_col >= mysql_conn->num_col)//当前列大于等于总列数

returnNULL;if(index != -1)//要获取指定的列

{if((index >= 0)&&(index < mysql_conn->num_col))//指定的列号在合法范围内

{

mysql_conn->cur_col = index; //重置当前列号

return mysql_conn->curren_row[index];//返回所需的列

}

}if(index == -1)//获取下一列

{

numcol= mysql_conn->cur_col;

mysql_conn->cur_col++;return mysql_conn->curren_row[numcol];

}returnNULL;

}//返回当前列序号

static int my_sql_get_curcol(void *temp)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!mysql_conn)return -1;if(mysql_conn->m_isfree == 1)//释放过了

return -1;if(mysql_conn->cur_col > 0)//获取过行中的字段

return mysql_conn->cur_col - 1;else

return mysql_conn->cur_col;

}//返回当前行序号

static int my_sql_get_currow(void *temp)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!mysql_conn)return -1;if(mysql_conn->m_isfree == 1)//释放过了

return -1;if(mysql_conn->cur_row > 0)//从结果集中装入过行

return mysql_conn->cur_row - 1;else

return mysql_conn->cur_row;

}//接入新的一行,第一次调用的时候。获取第0行//返回当前行

static int my_sql_fetch_row(void *temp)

{

unsignedintnumrow;struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!mysql_conn)return -1;if((mysql_conn->m_isfree == 1) ||(mysql_conn->m_isconnect != 1))//释放过了或者未连接上

return -1;if(mysql_conn->cur_row >= mysql_conn->num_row)//当前行大于等于总行数

return -1;

mysql_conn->curren_row = mysql_fetch_row(mysql_conn->mysql_result);if(mysql_conn->curren_row ==NULL)return -1;

mysql_conn->cur_col = 0;

numrow= mysql_conn->cur_row;

mysql_conn->cur_row++;returnnumrow;

}//获取总行数

static unsigned int my_sql_get_numrow(void *temp)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!mysql_conn)return 0;if(mysql_conn->m_isfree == 1)//释放过了

return 0;return mysql_conn->num_row;

}//获取总列数

static unsigned int my_sql_get_numcol(void *temp)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!mysql_conn)return 0;if(mysql_conn->m_isfree == 1)//释放过了

return 0;return mysql_conn->num_col;

}//获取错误信息

static char *my_sql_error(void *temp)

{struct my_sqldata *mysql_conn = (struct my_sqldata*)temp;if(!mysql_conn)returnNULL;if((mysql_conn->m_isfree == 1) ||(mysql_conn->m_isconnect != 1))//释放过了或者未连接上

returnNULL;return (char*)mysql_error(&mysql_conn->mysql_conn);

}static PyObject *_my_sql_connect(PyObject *self, PyObject *args)

{

unsignedint temp = 0;char *host =NULL;char *user =NULL;char *passwd =NULL;char *db =NULL;

unsignedint port = 0;char *unix_socket =NULL;

unsignedlong clientflag = 0;int result = 0;if(!PyArg_ParseTuple(args, "issssisl", &temp, &host, &user, &passwd, &db, &port, &unix_socket, &clientflag))returnNULL;

result= my_sql_connect((void*)temp, host, user, passwd, db, port, unix_socket, clientflag);return Py_BuildValue("i", result);

}static PyObject *_my_sql_init(PyObject *self, PyObject *args)

{

unsignedint temp = 0;

temp= (unsigned int)my_sql_init();return Py_BuildValue("i", temp);

}static PyObject *_my_sql_close(PyObject *self, PyObject *args)

{

unsignedint temp = 0;int result = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

result= my_sql_close((void*)temp);return Py_BuildValue("i", result);

}static PyObject *_my_sql_set_coding(PyObject *self, PyObject *args)

{

unsignedint temp = 0;int result = 0;char *coding =NULL;if(!PyArg_ParseTuple(args, "is", &temp, &coding))returnNULL;

result= my_sql_set_coding((void*)temp, coding);return Py_BuildValue("i", result);

}static PyObject *_my_sql_query(PyObject *self, PyObject *args)

{

unsignedint temp = 0;char *query =NULL;int result = 0;if(!PyArg_ParseTuple(args, "is", &temp, &query))returnNULL;

result= my_sql_query((void*)temp, query);return Py_BuildValue("i", result);

}static PyObject *_my_sql_get_affectedrows(PyObject *self, PyObject *args)

{

unsignedint temp = 0;int affects = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

affects= my_sql_get_affectedrows((void*)temp);return Py_BuildValue("i", affects);

}static PyObject *_my_sql_fetch_row(PyObject *self, PyObject *args)

{

unsignedint temp = 0;int result = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

result= my_sql_fetch_row((void*)temp);return Py_BuildValue("i", result);

}static PyObject *_my_sql_get_field(PyObject *self, PyObject *args)

{

unsignedint temp = 0;int index = 0;char *nextfield =NULL;if(!PyArg_ParseTuple(args, "ii", &temp, &index))returnNULL;

nextfield= my_sql_get_field((void*)temp, index);return Py_BuildValue("s", nextfield);

}static PyObject *_my_sql_get_currow(PyObject *self, PyObject *args)

{

unsignedint temp = 0;

unsignedint currowid = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

currowid= my_sql_get_currow((void*)temp);return Py_BuildValue("i", currowid);

}static PyObject *_my_sql_get_curcol(PyObject *self, PyObject *args)

{

unsignedint temp = 0;

unsignedint curcolid = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

curcolid= my_sql_get_curcol((void*)temp);return Py_BuildValue("i", curcolid);

}static PyObject *_my_sql_get_numrow(PyObject *self, PyObject *args)

{

unsignedint temp = 0;

unsignedint rowscount = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

rowscount= my_sql_get_numrow((void*)temp);return Py_BuildValue("i", rowscount);

}static PyObject *_my_sql_get_numcol(PyObject *self, PyObject *args)

{

unsignedint temp = 0;

unsignedint colscount = 0;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

colscount= my_sql_get_numcol((void*)temp);return Py_BuildValue("i", colscount);

}static PyObject *_my_sql_error(PyObject *self, PyObject *args)

{

unsignedint temp = 0;char *error =NULL;if(!PyArg_ParseTuple(args, "i", &temp))returnNULL;

error= my_sql_error((void*)temp);return Py_BuildValue("s", error);

}static PyMethodDef mytestMethods[] ={//{"mystrlen", my_strlen, METH_VARARGS, "We test strlen of C"},//{"mystrcat", my_strcat, METH_VARARGS, "We test strcat of C"},

{"connect", _my_sql_connect, METH_VARARGS, "We test connect of C"},

{"creat", _my_sql_init, METH_VARARGS, "We test creat of C"},

{"close", _my_sql_close, METH_VARARGS, "We test close of C"},

{"setcoding", _my_sql_set_coding, METH_VARARGS, "We test setcoding of C"},

{"query", _my_sql_query, METH_VARARGS, "We test query of C"},

{"affects", _my_sql_get_affectedrows, METH_VARARGS, "We test affectedrowsnum of C"},

{"fetchnextrow", _my_sql_fetch_row, METH_VARARGS, "We test fetchrow of C"},

{"nextfield", _my_sql_get_field, METH_VARARGS, "We test nextfield of C"},

{"currowid", _my_sql_get_currow, METH_VARARGS, "We test currowid of C"},

{"curcolid", _my_sql_get_curcol, METH_VARARGS, "We test curcolid of C"},

{"rowscount", _my_sql_get_numrow, METH_VARARGS, "We test getrowscount of C"},

{"colscount", _my_sql_get_numcol, METH_VARARGS, "We test getcolscount of C"},

{"error", _my_sql_error, METH_VARARGS, "We test error of C"},

{NULL, NULL,0, NULL}

};char name[] = "mytest";staticPyModuleDef mytestModule;

_declspec(dllexport)voidPyInit__mytest()

{

memset(&mytestModule, 0, sizeof(PyModuleDef));

mytestModule.m_methods=mytestMethods;

mytestModule.m_name=name;

PyModule_Create2(&mytestModule, PYTHON_API_VERSION);

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

组装台式电脑配置清单_攒机必备!各种价位的台式电脑配置清单!

点击上方「软件分享云」关注我们台式机&#xff0c;是一种独立相分离的计算机&#xff0c;完完全全跟其它部件无联系&#xff0c;相对于笔记本和上网本体积较大&#xff0c;主机、显示器等设备一般都是相对独立的&#xff0c;一般需要放置在电脑桌或者专门的工作台上。因此命名…

python nonetype报错_python 查询数据库数据 NoneType报错

python调试mysql数据库时&#xff0c;在测试单条查询语句的时候是没有问题的。执行过程如下&#xff1a;1、由连接对象conn获取到一个cursor。 cur conn.cursor()2、执行sql语句。 count cur.execute(sql)3、读取数据。 result cur.fetchone() #获取一条4、关闭游标、连接。…

达摩院重要科技突破!空天数据库引擎Ganos解读

简介&#xff1a; Ganos空天数据库引擎是李飞飞带领的达摩院数据库与存储实验室研发的新一代位置智能引擎&#xff0c;采用了平台即服务、多模融合、计算下推和云原生全新处理架构&#xff0c;为政府、企事业单位、泛互联网客户提供移动对象、空间/时空、遥感多模态数据混合存储…

brainfuck 在线_酒店在线声誉持久战 重视社媒舆论 保持品牌一致性

维护品牌或酒店声誉是一场持久战&#xff0c;这对塑造积极的品牌认知和提升客户满意度至关重要。声誉管理包括两个关键部分&#xff1a;引导客人评价和公众舆论&#xff0c;并以适当的方式进行反馈。就在线声誉管理而言&#xff0c;品牌还需要注意另外一点&#xff0c;公众会在…

2021天猫双11:阿里巴巴业务已全部跑在阿里云上

“今年天猫双11是首个100%的云上双11&#xff0c;成功扛住了全球规模最大的流量洪峰。”11月11日&#xff0c;阿里巴巴首席技术官程立表示&#xff0c;阿里巴巴业务已全部跑在阿里云上&#xff0c;体验如丝般顺滑。经过历年双11的“大考”&#xff0c;阿里技术实现了多级跳跃。…

python3怎么定义long_python3 整数类型PyLongObject 和PyObject源码分析

python3 整数类型PyLongObject 和PyObject源码分析一 测试环境介绍和准备测试环境&#xff1a;操作系统&#xff1a;windows10Python版本&#xff1a;3.7.0 下载地址VS版本&#xff1a;vs2015社区版(免费) 下载地址win10SDK(安装vs2015是可以选择&#xff0c;如果没有安装则需要…

从“嵌入式”到“物联网”有哪些变化?

简介&#xff1a; 经过几十年发展&#xff0c;嵌入式技术已经用在了我们生活中的方方面面&#xff0c;但是嵌入式始终都带有小众&#xff0c;专业性强的属性&#xff0c;让很多非嵌入式领域的同学望而却步。近十几年的发展&#xff0c;物联网覆盖了越来越多领域&#xff0c;包括…

java 接口 详解_Java 接口详解

接口接口是功能的集合&#xff0c;同样可看做是一种数据类型&#xff0c;是比抽象类更为抽象的”类”。接口只描述所应该具备的方法&#xff0c;并没有具体实现&#xff0c;具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离&#xff0c;优化了程…

Serverless Devs 的官网是如何通过 Serverless Devs 部署的

简介&#xff1a; 只有自己吃自己的狗粮&#xff0c;自己做的东西才不“&#x1f436;”。Serverless Devs 自发展之处到现在&#xff0c;已经经历了几个月的时间&#xff0c;在这几个月&#xff0c;Serverless Devs 的成长是迅速的&#xff0c;这很大一部分的原因是“我们在吃…

crontab 改成只读模式_以“三合一”模式推动提质增效 助力公司高质量发展

近日&#xff0c;模块制造厂圆满完成位于原化机西部院内的吉林制造基地新老厂区的资源整合、机械设备修理以及厂区内设备土建基础施工、功能配套设备购置等工作&#xff0c;积极推进新厂区环评、厂区注册地址变更&#xff0c;使制造基地继承了老厂区所拥有的压力容器、超限设备…

5G 落地进入爆发期,是时候让毫米波登场了

作者 | 小枣君来源 | 鲜枣课堂2021年&#xff0c;全球5G网络建设和发展取得了不俗的成绩。根据GSA于8月发布的数据&#xff0c;已有70多个国家及地区的超过175家运营商&#xff0c;推出了5G商用服务。还有285家运营商&#xff0c;正在投资部署5G。中国的5G建设步伐&#xff0c;…

新型DDoS来袭 | 基于STUN协议的DDoS反射攻击分析

简介&#xff1a; 作为新型反射类型&#xff0c;目前仍存绕过防御可能性。 阿里云安全近期发现利用STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT会话穿越应用程序&#xff09;服务发起的DDoS反射攻击。阿里云DDoS防护系统在秒级识别到攻击&#xff0c…

ssh是什么_【科普】SSH都不懂,还搞什么网络

关注我&#xff0c;你的眼睛会怀孕今天小编为大家分享一篇关于SSH 的介绍和使用方法的文章。本文从SSH是什么出发&#xff0c;讲述了SSH的基本用法&#xff0c;之后在远程登录、端口转发等多种场景下进行独立的讲述&#xff0c;希望能对大家有所帮助。1. 什么是SSH&#xff1f;…

java restful中文乱码_restful服务接口访问乱码 和 505错误

标签&#xff1a;用cxf 发部个rest服务&#xff0c;用浏览器访问和 HttpURLConnection 访问。1. URL中有中文&#xff0c;浏览器访问正常&#xff0c;HttpURLConnection 失败。解决&#xff1a; HttpURLConnection 方式需要做兼容处理。queryParam 传入参数&#xff0c;服务实现…

10问10答:你真的了解线程池吗?

简介&#xff1a; 《Java开发手册》中强调&#xff0c;线程资源必须通过线程池提供&#xff0c;而创建线程池必须使用ThreadPoolExecutor。手册主要强调利用线程池避免两个问题&#xff0c;一是线程过渡切换&#xff0c;二是避免请求过多时造成OOM。但是如果参数配置错误&#…

浪潮K1 Power通过ISO/IEC 20243标准认证

日前&#xff0c;浪潮K1 Power服务器通过ISO/IEC 20243标准认证&#xff0c;成为中国第一个通过该认证的服务器产品线。 ISO/IEC 20243标准&#xff0c;也被称为O-TTPS&#xff08;Open Trusted Technology Provider Standards&#xff0c;开放可信技术供应商标准&#xff09;…

「技术人生」第3篇:解决问题的规律总结

简介&#xff1a; 本文将介绍问题研究背景及解决问题的一般规律和特殊规律及二者之间的辩证关系。 作者&#xff1a;贺科学 往期技术一号位方法论系列文章&#xff1a; 「技术人生」专题第1篇&#xff1a;什么是技术一号位&#xff1f; 「技术人生」第2篇&#xff1a;学会分…

python canny优化_python实现canny边缘检测

canny边缘检测原理canny边缘检测共有5部分组成&#xff0c;下边我会分别来介绍。1 高斯模糊(略)2 计算梯度幅值和方向。可选用的模板&#xff1a;soble算子、Prewitt算子、Roberts模板等等;一般采用soble算子&#xff0c;OpenCV也是如此&#xff0c;利用soble水平和垂直算子与输…

java变位词_GoLang 字符串变位词

GoLang 实现func solution(s , t string)bool{if s t {return true}length : len(s)if length ! len(t) {return false}// 32 --> ~ 126const MAX_ASCII int 94const SPACE_INDEX rune 32numbers : [MAX_ASCII]int{}sRune : []rune(s)tRune :[]rune(t)for i : 0 ; i <…

CENTOS 7 踢用户_CentOS服务器及MySQL数据库性能测试-乐搏软件测试

这期小编和大家分享使用Sysbench&#xff0c;进行CentOS服务器及MySQL数据库的性能测试。Sysbench是一个跨平台的基准测试工具。基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑更加简单…