Mysql 5.5 LOAD DATA INFILE Permissions

c++, mysql

Solution

The answer is, we need the following line of code:

mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 0 );

inserted between `mysql_init()` and `mysql_real_connect()`.

Below is a snippet of C code for reference. Note that SOCI's mysql backend can be patched with this line of code for it to work.

Tested and works on Mysql 5.5, gcc 4.7.2, Quantal.

#include <mysql.h>
#include <stdio.h>

main()
{
  MYSQL mysql;

  mysql_init( &mysql );
  mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 0 );
  if ( !mysql_real_connect( &mysql,"127.0.0.1","root","open_sasame","tmp_db",0,NULL,0 ))
  {
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
      mysql_error( &mysql ));
  }

  if ( mysql_query( &mysql, "LOAD DATA LOCAL INFILE '/tmp/junk4.txt' "
    "INTO TABLE tmp_db.example_tbl FIELDS TERMINATED BY '|' "
    "LINES TERMINATED BY '\\n'" ))
  {
    fprintf( stderr, "ERROR DURING LOAD DATA LOCAL INFILE\n" );
  }

  mysql_close( &mysql );
}

Problem

ERROR The used command is not allowed with this MySQL version I am having problems migrating some mysqlclient C++ code from Mysql 5.1 to 5.5 (using soci). The C++ part is not so relevant - the problem is writing some mysqlclient code which can successfully do a LOAD DATA INFILE on MySQL 5.5. Here are my notes (LOAD DATA INFILE fails, but normal queries are ok): The code below works fine on Mysql 5.1, gcc 4.6.1, Oneiric The same code fails on Mysql 5.5, gcc 4.7.2, Quantal If I LOAD DATA INFILE from mysql (the command-line client), it works fine (I have updated my.cnf with local-infile=1) mysql> show variables like '%local_infile%'; results in ON It would be great if there were a SOCI or a configuration solution to this, but if someone has managed to get this to work with libmysqlclient, that would be great to know, too... ``` #include <soci.h> #include <mysql/soci-mysql.h> #include <string> #include <iostream> using soci::use; using namespace std; using namespace soci; main() { string val = "mysql://" + "host=127.0.0.1" + " dbname=tmp_db" + " user=root" + " password=open_sasame"; int sum; session sql( val ); sql << "SELECT 1+1", into( sum ); cerr << "RESULT=" << sum << endl; // works fine // NEXT LINE FAILS WITH: // The used command is not allowed with this MySQL version sql << "LOAD DATA LOCAL INFILE '/tmp/junk3.txt' INTO TABLE tmp_db.example_tbl FIELDS TERMINATED BY '|' LINES TERMINATED BY '\\n'"; } ```

Original source