Я использую 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 ++?
Ты хочешь sql::mysql::NativeAPI::MySQL_NativeConnectionWrapper::mysql
, но это закрытый член, который не возвращается ни одним методом. Поэтому, чтобы получить доступ к структуре, вам придется раскошелиться на исходный код Connector / C ++ и скомпилировать свой собственный коннектор.
Если вы идете по этому пути, вы можете предоставить доступ к mysql_set_local_infile_handler()
изнутри Connector / C ++.
Есть еще один способ обойти это с помощью 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 также можно манипулировать в программе. Хотя это кажется «низкотехнологичным», в моем проекте все сделано.