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接口(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python画烟花的代码_电脑怎么用代码
- 下一篇: select事件有哪些_Android