/*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);
}