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