I wanted to test the mysql++ example "Loading binary file in a BLOB ..." because I'm looking for for a solution to load several MB up to a remote DB, without FTP or things like that. Just 1 thread in DB, so performance should be no problem.
Therefor I try to execute and benchmark this quite famous Code from the online-manual, but I've got some Problems (P) and Questions (Q). I'm using Visual C++ 6 on an Windows98 , 526MHz and 320MB Ram. I can compile in debug and release-Version. No errors, just warnings like, I try to translate: \include\type_info1.hh(39) : warning C4800: 'int' : Variable wird auf booleschen Wert ('True' oder 'False') gesetzt Integer set to boolean value true or false \include\convert1.hh(40) : warning C4273: 'strtol' : Inkonsistente DLL-Bindung. dllexport angenommen. assumed inconsistent dll-binding for dllexport \include\sql_query1.hh(135) : warning C4355: this' : wird in Initialisierungslisten fuer Basisklasse verwendet "->this" is used in init-lists for derived classses \load_file.cpp(5) : warning C4273: '_errno' : Inkonsistente DLL-Bindung. dllexport angenommen. assumed inconsistent dll-binding Q1: Can I do something against this warnings? Q2: or are they taking any affect? Then something curious: I can execute the code in Release-Mode and it runs with no runtime error ( but the result is wrong , see below). P1: When I run in in debug-Mode, I get an SQL-Syntax-Error 1064 Q3: Where can I find error-codes in the online-manual? Q4: I'm not shure if std::string fill(read_buffer,blen); I included std::string P2:Unfortunally, the result ist not ok, since the "escape" manipulator" doesn't seem to do anything at all. P3: I tried to fix the code for my VisualC++ compiler by inserting #include <string> <iostream> , using namespace std; or adding std:: for debug-mode. Then I get (often, not always) an Exception in line: std::string tmp_str = strbuf.str(); release binary seems to be unchanged ... This is a sample output of 2 runnings. file "aaa" contains now data to escape, but abs does. both are ascii files. // --------- OUTPUT 1st C:\Bauinfo\Projekt_MySQL\mmd_source\Konsolentest\mysql_blob_load\Release>l abc release: loading ... abc "load data file:" 0s Length:20 kBytes/second: 1.#INF // the "cout" of the whole query INSERT INTO blobs (blob_data) VALUES("abc / 1 ' 2 " 3\ ") Error: You have an error in your SQL syntax near '3\ ")' at line 1 1064 2nd C:\Bauinfo\Projekt_MySQL\mmd_source\Konsolentest\mysql_blob_load\Release>l aaa release: loading ... aaa "load data file:" 0s Length:28 kBytes/second: 1.#INF INSERT INTO blobs (blob_data) VALUES("aaa bbb !§$%&() 123 >< x-_ ") "INSERT in MySQL:" 0s Length:28 kBytes/second: 1.#INF // ---------------------------- END OF OUTPUT P3) Uploaded Binary files cause no SQL-error, but are cut at the first '\0'. therefore only some bytes are stored in BLOB (messured via phpmyadmin, SELECT length(blob_data) ... Has anybody compiled and tried out the original example? now a last, my lightly changed code: -- #include <windows.h> #include <sys/stat.h> #include <fstream> #include <sqlplus.hh> extern int errno; #include <iostream> #include <string> // Für Zeittests #define _PERFORMANCE #include <time.h> #include <cstdlib> #include <vector> #include <algorithm> #include <conio.h> using namespace std; const char MY_HOST[]="localhost"; const char MY_USER[]="franz"; const char MY_PASSWORD[]="fff123"; const char MY_DATABASE[]="blobtest"; const char MY_TABLE[]="blobs"; const char MY_FIELD[]="blob_data"; // BLOB field int main(int argc, char *argv[]) { #ifdef _DEBUG // compiled for "debugging" std::string datei = "aaa"; cout << "debug: loading ... " << datei<< endl; // argc=2; #endif #ifndef _DEBUG // compiled for "release" std::string datei = argv[1]; if (argc < 2) { cerr << "Usage : load_file full_file_path" << endl << endl; return -1; } cout << "release: loading ... " << datei<< endl; #endif Connection con(use_exceptions); try { con.real_connect (MY_DATABASE,MY_HOST,MY_USER,MY_PASSWORD,3306,(int)0,60,NULL); Query query = con.query(); std::ostrstream strbuf; std::ifstream In (datei.c_str(),ios::in | ios::binary); struct stat for_len; if ((In.rdbuf())->is_open()) { if (stat (datei.c_str(),&for_len) == -1) return -1; unsigned int blen = for_len.st_size; if (!blen) return -1; #ifdef _PERFORMANCE // Performance Test clock_t Start, End; double Elapsed; Start = clock(); #endif char *read_buffer = new char[blen]; In.read(read_buffer,blen); std::string fill(read_buffer,blen); #ifdef _PERFORMANCE End = clock(); Elapsed = static_cast<double> ( End - Start ) / CLOCKS_PER_SEC ; cout << "\"load data file:\" " << Elapsed << "s" << endl; cout << "Length:"<< blen << endl; cout << "Bytes/second: " << blen / Elapsed << endl; // 2nd Performance Test Start = clock(); #endif strbuf << "INSERT INTO " << MY_TABLE << " (" << MY_FIELD << ") VALUES(\"" << escape << fill << "\")"; std::string tmp_str = strbuf.str(); // to have variable in debugger available int l = tmp_str.length(); cout << endl << "Length SQL-query: " << l; cout << endl << "Query:" << tmp_str << endl; query.exec(tmp_str); #ifdef _PERFORMANCE End = clock(); Elapsed = static_cast<double> ( End - Start ) / CLOCKS_PER_SEC ; cout << "\"INSERT in MySQL:\" " << Elapsed << "s" << endl; cout << "Length:"<< blen << endl; cout << "Bytes/second: " << blen / Elapsed << endl; #endif delete[] read_buffer; } else cerr << "Your binary file " << datei.c_str() << "could not be open, errno = " << errno; return 0; } catch (BadQuery er) cerr << "Error: " << er.error << " " << con.errnum() << endl; return -1; } cout << "ende"; getch(); } -- [EMAIL PROTECTED] --------------------------------------------------------------------- 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