Hi,
Im use boost::process::child to create a mysql cli child process to import sql file.
Normally im use this command:
/usr/bin/mysql mysql -h127.0.0.1 -utestuser --password='!@#QWE123qwe' -P3306 --default-character-set=utf8mb4 --max-allowed-packet=1GB < /root/create_db.sql
It’s worked well in bash.
But when use boost::process::child, std_err report ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES).
Is there any bugs in my code?
Os: ubuntu 18.04 LTS
Boost: 1.71.0
MySql:5.7.27
Create_db.sql:
DROP DATABASE IF EXISTS test_db;
CREATE DATABASE test_db;
Thanks
[code]
#include <iostream>
#include <boost/algorithm/string/join.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/process.hpp>
using namespace boost::process;
using namespace boost::iostreams;
using namespace boost::asio;
std::string SearchExecutableInPath(std::string const& filename) {
try {
return search_path(filename).generic_string();
}
catch (...) {
return "";
}
}
int RunProcess(
std::string const& executable,
std::vector<std::string> const& args,
std::string input_file_path
) {
io_context ioCtx;
auto work = make_work_guard(ioCtx);
std::thread ioThread([&ioCtx] {
ioCtx.run();
});
std::future<std::string> dataOut, dataErr;
child c;
if (!input_file_path.empty()) {
c = child(
boost::filesystem::absolute(executable),
boost::process::args(args),
std_out > dataOut,
std_err > dataErr,
std_in < boost::filesystem::absolute(input_file_path),
ioCtx
);
}
else {
c = child(
boost::filesystem::absolute(executable),
boost::process::args(args),
std_out > dataOut,
std_err > dataErr,
std_in.close(),
ioCtx
);
}
c.wait();
int result = c.exit_code();
std::string output = dataOut.get();
std::string error = dataErr.get();
if (!output.empty()) {
std::cout << output << std::endl;
}
if (!error.empty()) {
std::cout << error << std::endl;
}
work.reset();
ioThread.join();
return result;
}
int main()
{
// /usr/bin/mysql mysql -h127.0.0.1 -utestuser --password='!@#QWE123qwe' -P3306 --default-character-set=utf8mb4 --max-allowed-packet=1GB < /root/create_db.sql
std::vector<std::string> args;
args.reserve(8);
// mysql cli
args.push_back("mysql");
// connection info
args.push_back("-h127.0.0.1");
args.push_back("-utestuser");
args.push_back("--password='!@#QWE123qwe'");
args.push_back("-P3306");
// encoding
args.push_back("--default-character-set=utf8mb4");
// maybe large sql file
args.push_back("--max-allowed-packet=1GB");
int const ret = RunProcess(
SearchExecutableInPath("mysql"),
args,
"/root/create_db.sql");
std::cout << "ret code: " << ret << std::endl;
return 0;
}
[/code]