Использовать встроенный mysql и --local-infile = 1 с c ++? - PullRequest
1 голос
/ 27 декабря 2011

Я подключаюсь к базе данных mysql, используя сервер встраивания (связывание с mysqld) в c ++.У меня есть следующий код:

static char *server_options[] = \
        { (char *)"mysql_test",
          (char *)"--datadir=/home/cquiros/temp/mysql/db2",
          (char *)"--default-storage-engine=MyISAM",
          (char *)"--loose-innodb=0",
          (char *)"--local-infile=1",
          (char *)"--skip-grant-tables=1",
          (char *)"--myisam-recover=FORCE",
          (char *)"--key_buffer_size=16777216",
          (char *)"--character-set-server=utf8",
          (char *)"--collation-server=utf8_bin",
          NULL };

        int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;

        mysql_library_init(num_elements, server_options, NULL);
        m_mysql = mysql_init(NULL);

        char enable_load_infile = 1;
        if (mysql_options(m_mysql,MYSQL_OPT_LOCAL_INFILE, (const char *)&(enable_load_infile)))
            qDebug() << "Error setting option";

        mysql_real_connect(m_mysql, NULL,NULL,NULL, "database1", 0,NULL,0);

Соединение работает, и я могу запрашивать и создавать таблицы, однако, когда я пытаюсь выполнить «загрузить данные локальный infile ...», я всегда получаю «Используемая команда неразрешено с этой версией MySQL ", хотя я устанавливаю --local-infile = 1 в настройках сервера или задаю его в коде:

char enable_load_infile = 1;
        if (mysql_options(m_mysql,MYSQL_OPT_LOCAL_INFILE, (const char *)&(enable_load_infile)))
            qDebug() << "Error setting option";

Любая идея, что я делаю неправильно и как это исправить?

Большое спасибо за вашу помощь.Карлос.

1 Ответ

1 голос
/ 09 апреля 2013

@ QLands Я понимаю, что прошло уже больше года с тех пор, как вы задали этот вопрос, но я подумал, что отвечу только за потомство, если другие, как я, ищут решения.

У менята же проблема, я могу заставить операторы LOAD DATA LOCAL INFILE работать из CLI mysql Linux после того, как я явно включил его в файл /etc/mysql/my.cfg.Однако я НЕ МОГУ заставить его работать с коннектором MySQL C ++ - я также получаю сообщение об ошибке «Используемая команда не разрешена в этой версии MySQL», когда я пытаюсь выполнить команду LOAD DATA LOCAL INFILE через коннектор MySQL C ++.Правильно?

После долгих поисков и поиска постов технической поддержки, я пришел к выводу, что коннектор MySQL C ++ (по какой-либо причине) не решил реализовать возможность для разработчиков иметь возможностьразрешить опцию local-infile = 1.Очевидно, что некоторые люди смогли взломать / раскошелиться на коннектор MySQL C ++, чтобы раскрыть функциональность, но никто не опубликовал их исходный код - только сказал, что он работает.Видимо, есть обходной путь в MySQL C API после инициализации соединения, который вы бы использовали:

mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 1 );

Вот несколько справочных статей, которые приводят меня к такому выводу:

1.) Как я могу получить собственную структуру соединения C API из MySQL, Connector / C ++?

2.) Mysql 5.5 ЗАГРУЗКА ДАННЫХ INFILE Разрешения

3.) http://osdir.com/ml/db.mysql.c++/2004-04/msg00097.html

По сути, если вам нужна возможность использовать функцию LOAD DATA LOCAL INFILE - вы должны использовать mysql C API или выполнить его из командной строки или взломать / разорвать существующий mysql C ++API для раскрытия структуры соединения: (

...