日期:2014-05-16 浏览次数:20818 次
继续介绍本人的python学习过程。本节介绍如何利用python调用c代码。内容还是基于音乐信息提取的过程,架构如图一。Python调用c实现的功能是利用python访问c语言完成mysql数据库操作。

在利用python调用c语言之前,我们需要首先完成c语言功能代码,然后再考虑语言的转换问题,所以我们先介绍c语言实现的数据库访问代码。数据库操作主要包括DDL和DML,DDL在创建数据库和表时完成,c语言完成的是DML。在具体的实现中,c语言主要完成了:连接数据库,insert和select三个操作。可以认为音乐信息数据库是一个read-only数据库,只允许添加和检索,不允许删除(删除可以通过直接操作数据库完成)。
关于音乐信息的数据库只有一个表格:all_music,创建表的SQL语句如下:
create table all_music(
id integer auto_increment not null primary key,
original_name varchar(100),
name varchar(500) not null,
artist varchar(500),
genre varchar(30),
album varchar(500),
release_date date,
directory varchar(300),
size integer
);
由于音乐没有很好的主键,所以我们采用surrogate key,并设定其为自动增长的字段。其他信息主要包括音乐名,歌手,专辑,类型和发行时间等。
定义完数据库表格,我们就可以实现访问该表格的c代码,相关代码如下:
#include <mysql.h>
typedef struct
{
char original_name[100];
char name[500];
char artist[500];
char genre[30];
char album[500];
char date[20];
char directory[300];
int size;
}music;
typedef struct
{
char id[20];
char original_name[100];
char directory[300];
}row_result;
char* column_name[8]={"original_name","name","artist","genre","album","release_date","directory","size"};
MYSQL * connect_to(char* host,char* database,char* user,char* password)
{
MYSQL* con_ptr;
con_ptr=mysql_init(NULL);
if((con_ptr=mysql_real_connect(con_ptr,host,user,password,database,3306,NULL,0))==NULL)
{
fprintf(stderr,"connect failed:%s\n",mysql_error(con_ptr));
exit(-1);
}
return con_ptr;
}
void close_connect(MYSQL * con_ptr)
{
mysql_close(con_ptr);
}
void insert(MYSQL * con_ptr,char* table,music* m)
{
int res;
char sql[2000];
sprintf(sql,"insert into %s(%s,%s,%s,%s,%s,%s,%s,%s) values ('%s','%s','%s','%s','%s','%s','%s','%d')",table,column_name[0],column_name[1],column_name[2],column_name[3],column_name[4],column_name[5],column_name[6],column_name[7],m->original_name,m->name,m->artist,m->genre,m->album,m->date,m->directory,m->size);
res=mysql_query((MYSQL*)con_ptr,sql);
if(res)
{
fprintf(stderr,"insert failed:%s",mysql_error(con_ptr));
return;
}
}
MYSQL_RES * select_music(MYSQL * con_ptr,char* table)
{
int res;
char sql[100];
sprintf(sql,"select id,original_name,directory from %s ",table);
res=mysql_query((MYSQL*)con_ptr,sql);
if(res)
{
fprintf(stderr,"select failed:%s",mysql_error(con_ptr));
return NULL;
}
else
{
MYSQL_RES* result=mysql_store_result((MYSQL*)con_ptr);
if(result) return result;
else return NULL;
}
}
row_result * fetch_row(MYSQL_RES * result)
{
MYSQL_ROW mysql_row;
if(result==NULL)
return NULL;
mysql_row=mysql_fetch_row((MYSQL_RES*)result);
if(mysql_row)
{
row_result* row=(row_result*)malloc(sizeof(row_result));
strcpy(row->id,mysql_row[0]);
strcpy(row->original_name,mysql_row[1]);
strcpy(row->directory,mysql_row[2]);
return row;
}
else
{
fprintf(stderr,"no rows to return!\n");
return NULL;
}
}
void free_row(row_result * row)
{
free(row);
}
void free_result(MYSQL_RES * result)
{
mysql_free_re