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

Я использую MySQL Connector / C ++ для связи с сервером MySQL из программы на C ++. По какой-то причине (см. Ниже), в какой-то момент мне нужна собственная структура соединения C API. Как получить его из классов Connector / C ++?

Фон:

Я хочу загрузить огромный объем данных (до 2-3 миллиардов кортежей) из основной памяти клиента на сервер. Поэтому я хочу попробовать оператор LOAD DATA INFILE. Чтобы сначала не записывать все данные в текстовый файл, я хочу определить свой собственный локальный обработчик infile, который считывает данные непосредственно из основной памяти.

Однако в Connector / C ++ нет метода для установки пользовательских локальных обработчиков инфиляции, как это делает нативный C API. Соответствующая функция C mysql_set_local_infile_handler () нуждается в собственном обработчике соединения (структура MYSQL) в качестве входного параметра. Итак, как мне получить этот обработчик из Connector / C ++? Или есть ли лучший способ установить локальный обработчик infile в среде Connector / C ++?

5

Решение

Ты хочешь sql::mysql::NativeAPI::MySQL_NativeConnectionWrapper::mysql, но это закрытый член, который не возвращается ни одним методом. Поэтому, чтобы получить доступ к структуре, вам придется раскошелиться на исходный код Connector / C ++ и скомпилировать свой собственный коннектор.

Если вы идете по этому пути, вы можете предоставить доступ к mysql_set_local_infile_handler() изнутри Connector / C ++.

2

Другие решения

Есть еще один способ обойти это с помощью c ++ команды «system».

1) установить среду mysql в my.cnf: local-infile=1, Вы можете найти этот файл здесь: как узнать местонахождение mysql my.cnf. Или просто добавьте опцию mysql --local-infile [other options] в командной строке оболочки, упомянутой ниже.

2) В вашем коде c ++ вместо использования stmt->execute(...) из коннектора c ++, используя


system("mysql -u username --database=dbname --password=pw -e \"LOAD DATA LOCAL INFILE filename INTO TABLE tablename FIELD TERMINATED BY ',' LINES TERMINATED BY '\n' (column1, column2, column3);\"");

Массив char также можно манипулировать в программе. Хотя это кажется «низкотехнологичным», в моем проекте все сделано.

0

По вопросам рекламы [email protected]