日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2024/9/27 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);

}

總結

以上是生活随笔為你收集整理的python封装c接口_用C为python3.1封装mysql接口(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品视 | 欧美激情综合网 | 欧美成人精品二区三区99精品 | 欧美裸体女人 | 富婆如狼似虎找黑人老外 | 一级片视频免费观看 | 欧美丰满一区二区免费视频 | 最新三级网站 | 大尺度做爰呻吟舌吻网站 | 香蕉视频18 | 尹人成人网 | 色老板精品凹凸在线视频观看 | 久久99精品国产麻豆91樱花 | 少妇aa | 大尺度做爰床戏呻吟舒畅 | 51成人精品网站 | 亚洲一区二三区 | 加勒比色综合 | 38在线视频| 国产中文字幕久久 | 你懂的网站在线观看 | 永久免费不卡在线观看黄网站 | 国产一区二区h | 人妻精品久久久久中文字幕69 | 黄色羞羞网站 | 就去色综合 | 男人添女人下部高潮全视频 | 美女被草视频 | 7788色淫网站小说 | 99精品国产一区二区 | av5566| 奇米影视第四色首页 | 国产一区二区三区在线免费观看 | 日本三级免费 | 亚洲免费小视频 | 日韩av网站在线观看 | 久久这里只有精品99 | 国产无码精品在线观看 | 国产天堂视频 | 国产免费一区二区三区在线观看 | 国产91精品久久久久久久 | 久久久久亚洲av成人无码电影 | 亚洲精品五月天 | 欧美日韩一区二区区 | 欧美aaaaa| 色噜噜综合网 | 国产精品国产三级国产专区53 | 黄色欧美视频 | 欧美性做爰免费观看 | 久久久国产精品人人片 | 亚洲人xxx日本人18 | 欧美熟妇另类久久久久久多毛 | 国产色图视频 | 亚洲精品v日韩精品 | 上海贵妇尝试黑人洋吊 | 午夜影院在线看 | 欧美激情国产精品免费 | 久久久二区| 欧美精品色婷婷五月综合 | 二三区视频 | 久久久久久久久97 | 国产伦精品一区二区三区视频女 | 日韩精品一 | 少妇一级淫片免费放2 | 狠狠干干干 | 吸咬奶头狂揉60分钟视频 | 久久综合一区二区三区 | 亚洲福利一区 | 国产精品久久久久久久久久久久久久久久久久 | 久久色视频| 色呦呦国产 | xxx毛片 | 99久久久国产精品无码网爆 | 日韩免费av网站 | 在线观看亚洲专区 | 成人网免费 | 理论片毛片 | 亚洲黄色成人网 | 国产有码在线 | 精品中文字幕在线观看 | 91夜色| 顶弄h校园1v1 | 一级特黄a大片免费 | 免费观看成人在线视频 | 日韩黄色一区二区 | 蜜臀99久久精品久久久久小说 | 丁香花完整视频在线观看 | 国产男人的天堂 | 亚州av网| 精品人伦一区二区三区蜜桃网站 | 国产肥熟 | 国产男女在线 | 一本色道久久综合精品婷婷 | 少妇激情视频 | 天天综合干 | 国产免费又粗又猛又爽 | 免费在线激情视频 | 色综合久久中文字幕无码 | 一卡二卡在线观看 |