2013-01-19 7 views
5

Uso il connettore/C++ di MySQL per comunicare con un server MySQL da un programma C++. Per qualche ragione (vedi sotto per lo sfondo), ho bisogno ad un certo punto della struttura di connessione API C nativa. Come posso ottenerlo dalle classi Connector/C++?Come posso ottenere la struttura di connessione API C nativa da MySQL Connector/C++?

Background:

voglio caricare una quantità enorme di dati (fino a 2-3 miliardi di tuple) dalla memoria principale del client al server. Pertanto, voglio provare l'istruzione LOAD DATA INFILE. Per evitare di scrivere prima tutti i dati su un file di testo, voglio definire il mio gestore di infile locale, che legge i dati direttamente dalla memoria principale.

Tuttavia, Connector/C++ non ha alcun metodo per impostare i gestori di file locali definiti dall'utente, ma l'API C nativa lo fa. La funzione C corrispondente mysql_set_local_infile_handler() ha bisogno di un gestore di connessione nativo (la struttura MYSQL) come parametro di input. Quindi, come ottengo questo gestore dal Connector/C++? O c'è un modo migliore per impostare il gestore di infile locale in un ambiente Connector/C++?

+0

È sicuramente costruito su Connector/C. Connector/C++ è solo un ulteriore wrapper attorno all'API C nativa (Native C API e Connector/C sono due parole per la stessa cosa, comunque). Viene menzionato più volte nel manuale, ad esempio qui: "MySQL Connector/C++ si basa sulla MySQL Client Library (API C MySQL)." (http://dev.mysql.com/doc/refman/5.5/en/connector-cpp-installation-source.html) (Dov'è il commento andato a cui ho risposto !?) – user1494080

risposta

2

Si desidera sql::mysql::NativeAPI::MySQL_NativeConnectionWrapper::mysql, ma è un membro privato che non viene restituito con alcun metodo. Pertanto, per accedere alla struttura, sarà necessario posizionare il connettore/C++ e compilare il proprio connettore.

Se è il percorso che si intraprende, è preferibile fornire l'accesso a mysql_set_local_infile_handler() dall'interno di Connector/C++.

+0

Peccato. Speravo che sarebbe stato possibile con il connettore "vanilla". – user1494080

0

C'è un altro modo per risolverlo tramite l'aiuto del comando C++ "sistema".

1) impostare l'ambiente mysql in my.cnf: local-infile=1. È possibile trovare questo file qui: how to know mysql my.cnf location. Oppure aggiungi semplicemente l'opzione mysql --local-infile [other options] nella riga di comando della shell menzionata di seguito.

2) Nel codice C++, invece di utilizzare stmt->execute(...) da C++ connettore, utilizzando

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 potrebbe essere manipolata anche nel programma. Sebbene sembri "low-tech", fa funzionare il mio progetto.

Problemi correlati