2017-04-17 12 views
0

リモートデータベースにデータをロードするには、mysql_query( "LOAD DATA LOCAL")を使用する必要があります。データは以下の形式になります。C++、mysql API LOAD DATA LOCAL

しかし、ファイルからロードする場合、残念ながら、常にコアダンプがあります。 クライアントライブラリは、mysql-connector-c-6.0.2-linux-sles10-x86.tar.gzです。これは、dev.mysql.com/downloadの最新バージョンです。 libmysql.so.16.0.0を使用します。 私のコードは以下の通りです:GDBによって

m_pMySQL = mysql_init(NULL); 
if(!m_pMySQL) 
{ 
    A7C_LOG_ERROR (logCat, "Can not init mysql!"); 
    return STATUS_ERROR; 
} 
if(0 != mysql_options(m_pMySQL, MYSQL_OPT_LOCAL_INFILE, 0)) 
{ 
    A7C_LOG_ERROR (logCat, "Can not set mysql to local infile !"); 
} 

if(!mysql_real_connect(m_pMySQL, 
    m_host.c_str(), 
    m_username.c_str(), 
    m_password.c_str(), 
    m_dbname.c_str(), 
    m_port, 
    NULL, 
    //0)) 
    CLIENT_MULTI_RESULTS|CLIENT_LOCAL_FILES)) 
{ 
    A7C_LOG_ERROR (logCat, "Can not connect mysql server. ERROR: "<<mysql_error(m_pMySQL)); 
    return STATUS_ERROR; 
} 

string load("LOAD DATA LOCAL INFILE '/var/tmp/TDR_HTU1_TID01' IGNORE INTO TABLE LOOKUP"); 
if(mysql_query(m_pMySQL, load.c_str())) 
    { 
    A7C_LOG_ERROR (logCat, "Failed to load. Statement: " 
     <<load<<". Error:"<<mysql_error(m_pMySQL)); 
    return STATUS_ERROR; 
    } 

コア情報:

> Program terminated with signal 11, Segmentation fault. 
> #0 0xf7b362d1 in my_read (Filedes=18, 
> Buffer=0xf3645a40 "460001191124402\t8613611226646\n460027014803029\t8618701483175\n460028101539830\t8615810184408\n460020264337590\t8613426218170\n460022102200877\t8615210220922\n460023100016582\t8615010067740\n460021537608606\t8615"..., 
> Count=8192, MyFlags=<value optimized out>) at 
> /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/mysys/my_read.c:55 
> 55  
> /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/mysys/my_read.c: 
> No such file or directory. 
>   in /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/mysys/my_read.c 
> (gdb) where 
> \#0 0xf7b362d1 in my_read (Filedes=18, 
>  Buffer=0xf3645a40 "460001191124402\t8613611226646\n460027014803029\t8618701483175\n460028101539830\t8615810184408\n460020264337590\t8613426218170\n460022102200877\t8615210220922\n460023100016582\t8615010067740\n460021537608606\t8615"..., 
> Count=8192, MyFlags=<value optimized out>) at 
> /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/mysys/my_read.c:55 
> #1 0xf7ac513d in default_local_infile_read (ptr=0xf3d59190, 
>  buf=0xf3645a40 "460001191124402\t8613611226646\n460027014803029\t8618701483175\n460028101539830\t8615810184408\n460020264337590\t8613426218170\n460022102200877\t8615210220922\n460023100016582\t8615010067740\n460021537608606\t8615"..., 
> buf_len=8192) at 
> /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/libmysql/libmysql.c:693 
> #2 0xf7ac5337 in handle_local_infile (mysql=0x80aa6c0, net_filename=0x80add11 "/var/tmp/TDR_HTU1_TID01") at 
> /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/libmysql/libmysql.c:577 
> #3 0xf7ac0532 in cli_read_query_result (mysql=0x80aa6c0) at /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/libmysql/client.c:2867 
> #4 0xf7abcc04 in mysql_real_query (mysql=0x80aa6c0, query=0x807c2d4 "LOAD DATA LOCAL INFILE '/var/tmp/TDR_HTU1_TID01' IGNORE INTO TABLE 
> LOOKUP", length=73) 
>  at /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/libmysql/client.c:2912 
> #5 0xf7ac4f75 in mysql_query (mysql=0x80aa6c0, query=0x807c2d4 "LOAD DATA LOCAL INFILE '/var/tmp/TDR_HTU1_TID01' IGNORE INTO TABLE LOOKUP") 
>  at /export/home2/tmp/cteam/bs/connector-c/src/mysql-connector-c-6.0.2/libmysql/libmysql.c:790 

私は、MySQLのコマンドラインクライアントを使用するように変更した場合は、それがうまく動作します。 これがプロジェクトをブロックしました。助けてください!

+0

質問を書いても、目には痛みがあります。 –

+0

タグをスパムしないでください。 C++はCではありませんC++ではありません! – Olaf

答えて

0

libmysqlclientバージョンlibmysqlclient.so.16バージョンで動作します。 libmysqlclient.so.18のバージョンでは動作しません。

関連する問題