C语言实现mysql中存取二进制文件

时间:2007-01-04 09:48:36   来源:  作者:whsong  点击:次  出处:技术无忧
关键字:C语言

最近搞mysql,这两天想用C把二进制文件(<64k,大的就存储路径了)存储到数据库里,经过我‘不懈’的搜索,发现NET上有且只有一个版本(php为例的),根本在C里行不通,我吐了一口血(之后又吐了好几次)!最后还是在mysql手册里找到了方向,是 mysql_real_escape_string给了我光明,好了,不罗嗦了,不然要有矿泉水瓶砸过来了!为了不让其它初学者吐血,我把我的code共享一下,希望大侠们指正,也欢迎鸡蛋和西红柿
#include <stdio.h>
#include <mysql/mysql.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define host           "localhost"         //mysql server
#define username     "root"
#define password     "cipher"
#define database       "www"
 
int get_file_size(char *path, off_t *size)
{
     struct stat file_stats;

     if(stat(path, &file_stats))
           return -1;

    *size = file_stats.st_size;
     return 0;
}
int main(int argc, char *argv[])
{
     char *filename;
     off_t *size;

     MYSQL       *conn;
     MYSQL_RES   *res_set;
     MYSQL_ROW    row;
     MYSQL_FIELD *field;
     int              i, flag;
     char           *sql;
     FILE           *fp;
     char           *buf;
     int              n=0;
     char           *end;
     unsigned long *length;    
   
     if (argc != 2) {
           printf("Usage: %s srcfile/n", argv[0]);
           exit(1);
    }

     filename = argv[1];
     if ((get_file_size(filename, size)) == -1) {
           perror("get file size" );
           exit(1);
    }
   
     if ((buf = (char *)malloc(sizeof(char)*(*size+1))) == NULL) {
           perror("malloc buf" );
           exit(1);
    }

     if ((fp = fopen(filename, "rb" )) == NULL) {
           perror("fopen file" );
           exit(1);
    }

     if ((n = fread(buf, 1, *size, fp)) < 0) {     //n=*size
           perror("fread file" );
           exit(1);
    }

     sql = (char *)malloc(sizeof(char)*n*2+256);     //2n+1+strlen(other sql)
     if (sql == NULL) {
           perror("malloc sql" );
           exit(1);
    }

     conn = mysql_init(NULL);
     if (conn == NULL) {
           printf("init mysql, %s/n", mysql_error(conn));
           exit(1);
    }

     if ((mysql_real_connect(conn, host, username, password, database, 0, NULL, 0)) == NULL) {
           printf("connect mysql, %s/n", mysql_error(conn));
           exit(1);
    }

     strcpy(sql, "insert into www(id, name, file) values(5, 'peter', " );
     end = sql;
     end += strlen(sql);           //point sql tail
    //convert NUL(ASCII 0)、'/n'、'/r'、'/'’、'''、'"'和Control-Z and so on
    *end++ = '/'';
     end += mysql_real_escape_string(conn, end, buf, n);
    *end++ = '/'';
    *end++ = ')';
   
     flag = mysql_real_query(conn, sql, (unsigned int)(end-sql));
     if (flag != 0) {
           printf("insert failed, %s/n", mysql_error(conn));
           exit(1);
    }

     if ((mysql_real_query(conn, "SELECT file FROM www where id=5", 31)) != 0) {
           printf("insert failed, %s/n", mysql_error(conn));
           exit(1);
    }
     res_set = mysql_store_result(conn);

     fclose(fp);
     fp = NULL;

     fp = fopen("foo.bk", "wb" );
     while ((row = mysql_fetch_row(res_set)) != NULL) {
           length = mysql_fetch_lengths(res_set);
           for (i=0; i<mysql_num_fields(res_set); i++) {
               fwrite(row[0], 1, length[0], fp);
          }
    }

     fclose(fp);
     mysql_close(conn);
     free(sql);
     sql = NULL;
   
     return 0;
}
//gcc -o mysql_binary mysql_binary.c -lmysqlclient
//usage: ./mysql_binary filename
Makefile:
CXX = gcc
LIBS = -lmysqlclient
PRODUCT = mysql_binary
.LIBPATTERNS: lib%.so lib%.a
vpath %  .
vpath %.c src
vpath %.h include

OBJS = mysql_binary.o
$(PRODUCT): $(OBJS)
    $(CXX) $(OBJS) -o $@ $(LIBS)
.c.o:

.PHONY:clean
clean:
     -rm -f $(OBJS) $(PRODUCT)

WWW.pC51.Net


相关文章

    无相关信息

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面