• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            C語(yǔ)言實(shí)現(xiàn)myql中存取二進(jìn)制文件

            最近搞mysql,這兩天想用C把二進(jìn)制文件(<64k,大的就存儲(chǔ)路徑了)存儲(chǔ)到數(shù)據(jù)庫(kù)里,經(jīng)過我不懈的搜索,發(fā)現(xiàn)NET上有且只有一個(gè)版本(php為例的),在C里根本行不通,我先是暈倒,醒了后我再搜索,還是php版本的,我又吐了一口血(之后又吐了好幾次)!最后還是在mysql手冊(cè)里找到了方向,是mysql_real_escape_string給了我光明,好了,不羅嗦了,不然要有礦泉水瓶砸過來(lái)了!為了不讓其它初學(xué)者吐血,我把我的code共享一下,希望大俠們指正,也歡迎雞蛋和西紅柿

            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

            CODE:

            [Copy to clipboard]

            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)

            好了,擦汗!
            暈 這么多表情符號(hào),弄一下。
            生成的foo.bk文件為源文件的拷貝

            posted on 2009-08-13 11:28 肥仔 閱讀(239) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)庫(kù)

            成人国内精品久久久久影院VR| 久久强奷乱码老熟女| 天堂无码久久综合东京热| 精品久久人人做人人爽综合| 久久久久亚洲AV无码专区桃色| 思思久久99热免费精品6| 日产精品99久久久久久| 亚洲国产精品久久久久久| 女人高潮久久久叫人喷水| 99国产欧美精品久久久蜜芽| 久久精品国产亚洲AV不卡| 伊人久久精品无码二区麻豆| 国产成人精品久久一区二区三区av | 国产福利电影一区二区三区久久久久成人精品综合 | 久久青青草原精品国产软件 | yy6080久久| 久久99精品国产99久久| 偷窥少妇久久久久久久久| 久久成人国产精品二三区| 日本人妻丰满熟妇久久久久久| 人妻系列无码专区久久五月天| 国产精品美女久久久久网| 久久婷婷五月综合成人D啪 | 久久精品国产日本波多野结衣| 一本伊大人香蕉久久网手机| 久久亚洲AV无码精品色午夜 | 国产99久久久久久免费看| 久久精品无码专区免费青青| 中文字幕精品无码久久久久久3D日动漫 | 内射无码专区久久亚洲| 久久国产精品-国产精品| 漂亮人妻被黑人久久精品| 少妇被又大又粗又爽毛片久久黑人| 欧美精品一本久久男人的天堂| 亚洲狠狠婷婷综合久久久久| 大香伊人久久精品一区二区| 日本精品一区二区久久久| 亚洲国产精品无码久久久久久曰| 久久青青草原亚洲av无码| 色婷婷综合久久久久中文字幕| 久久亚洲天堂|