I had posted the following code in the plusplus mailing list but it was suggested I post this question in this list instead.

I've been writing a test program using the MySQL C API to test the reading and writing of BLOB data in and out of the database. The file I read into the database is a small binary program. I then write out this BLOB to disk as another file. There is obviously something wrong as the newly written out file does not execute when run:

"./a.out: Exec format error. Binary file not executable."

Permissions are executable. I think the code that I use to read in the BLOB is correct. But I am not sure if I am retrieving the BLOB properly. I want to do a comparison between my input buffer and what I get back from a mysql_fetch_row() but I'm not sure if I am doing it correctly or not. If I am doing the comparison correctly, then there is something wrong because the comparison between the two buffers fails at some point (the first 630 some characters are the same but then a failure), in which case, what am I doing wrong? How do I read out the program that I stored in the database?

I give my code here and I would much appreciate it if someone could point out what it is I am not doing correctly.

  // First read in the BLOB into the database
  ifstream is;
  is.open(inputFilename,ifstream::in|ifstream::binary);
  is.seekg(0, ifstream::end);
  long bufferSize = is.tellg();
  is.seekg(0, ios::beg);
  char buffer[bufferSize];

  is.read(buffer, bufferSize);
  is.close();

  // Set query string
  char mySql[55000] = "INSERT into Blob_file (blob_file) values ('";
  char* tail;

tail = mySql + strlen(mySql);

  if ((tail + 2*bufferSize) + 3 > mySql + sizeof(mySql)) {
      cerr << "Binary too big" << endl;
      return 1;
  }

tail += mysql_escape_string(tail, buffer, bufferSize);

  (void) strcpy (tail, "')");
  mysql_real_query(myConnection, mySql, strlen(mySql));

// Now try retrieve the BLOB out of the database
char getMySql[1024] = "select blob_file from Blob_file where blob_file_id = 79435"; // assuming the insert created entry 79435


mysql_real_query(myConnection, getMySql, strlen(getMySql));

  MYSQL_RES* Res;
  MYSQL_ROW Row;
  Res = mysql_store_result(myConnection);
  cout << mysql_num_rows(Res) << endl;
  Row = mysql_fetch_row(Res);

  unsigned long *lengths;
  lengths = mysql_fetch_lengths(Res);

  // Is what I retrieved the same as what I put in?
  for (int j=0;j<=lengths[0]-1;j++) {
      cout << ".";
      if (Row[0][j] != buffer[j]) {
          cout << "BAD" << endl;
          return 1;  // I end up here and terminate so something wrong
      };
  }

  ofstream os;
  os.open(outputFilename,ofstream::binary);
  os.write(Row[0],bufferSize);
  os.close();

  // close database connection
  myDatabase.disconnect();

return 0;


Thank You, John


-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]



Reply via email to