Hi all !

I would like to insert a Blob ( a picture exactly ), here is a small
source code to test my insert.
You can find 2 sources code, the first is to insert a blob in a table of
a database ( this database exists in my MySQL server )

And the second code is to read this blob from the database.

I think there are a lot of mistakes, could you help me ? because i did
not find the solution.

thanks


#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <glib.h>

int main(int argc, char **argv)
{
MYSQL *mysql = NULL;
struct stat statbuf;
int file;
unsigned long size, ssize;
gchar *data = NULL, *query = NULL, *end = NULL;
int i;
        mysql = (MYSQL *) g_malloc0(sizeof(MYSQL));
        mysql_init(mysql);
        mysql = mysql_real_connect(mysql, "localhost","test", "XXXX",
"test_stef", 0, NULL, 0);
    file = open("photo.png", O_RDONLY);
        //file = open("test_mozilla.c", O_RDONLY);
    if ( !file )
                g_error("Impossible d'ouvrir le fichier photo.png");
    fstat(file, &statbuf);                
    fprintf(stdout, "Size of photo.png : %ld\n", statbuf.st_size);
    size = statbuf.st_size;
        
        data = (gchar *) g_malloc0(size);
        if ( !data )
                g_error("Impossible de charger la mémoire requise");
        ssize = read(file, data, size);
        if ( ssize == size )
                g_message("Fichier correctement lu");
        query = (gchar *) g_malloc0(2*size);
        strcpy(query, "INSERT INTO test VALUES(");
        end = query + strlen(query);
        *end++ = '\'';
        gchar * debut, *fin;
        debut = end;
        end += mysql_real_escape_string(mysql, end, data, size);
        fin = end;
        fprintf(stdout, "Difference : %lu\n",(unsigned long) (fin - debut));
        *end++ = '\'';
        *end++ = ')';

        /*for ( i = 0 ; i < 30 ; i++ )
                fprintf(stdout, "%c", query[i]);*/
        if ( mysql_real_query(mysql, query, (unsigned long) ( end - query )) )
        {
                g_error("Erreur lors de la requete d'insertion dans la DB");
        }
        g_free(data);   
        g_free(query);
        mysql_close(mysql);
        return 0;
}

But when i edit the mysql database with mysqlcc utility, i don't the
complete file.

now, when i read the Blob from the database, i use this source code.

#include <glib.h>
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
MYSQL *mysql = NULL;
MYSQL_RES *mysql_res = NULL;
MYSQL_FIELD *mysql_field = NULL;
MYSQL_ROW *mysql_row = NULL;
gchar query[] = "SELECT photo FROM test";
        mysql = (MYSQL *) g_malloc(sizeof(MYSQL));
        mysql_init(mysql);

        if( !mysql_real_connect(mysql, "localhost", "test",     "XXXX",
"test_stef",    0, NULL, 0) )
                g_error("Failed to connect to database : Error : %s\n",
mysql_error(mysql));
        if (mysql_real_query(mysql, query, strlen(query)))
                g_error("Failed query to database : Error : %s\n",
mysql_error(mysql));

        if ( !(mysql_res = mysql_store_result(mysql)) )
                g_error("Failed Store Result : Error : %s\n", mysql_error(mysql));
        
        mysql_field = mysql_fetch_field(mysql_res);
        g_print("Field name : %s\n", mysql_field->name);

        mysql_row = mysql_fetch_row(mysql_res);
FILE *fichier;
        fichier = fopen("photo_2.png", "wb");
        fwrite(mysql_row[0], strlen(mysql_row[0]), 1, fichier);
        fclose(fichier);
        mysql_close(mysql);
        g_free(mysql);
        return 0;
}

Thanks

Stephane Wirtel


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to