inline void command::commit() { close_stmt(); if (m_autocommit) return; check(lib::singleton().p_mysql_query(m_con, "COMMIT") == 0); check(lib::singleton().p_mysql_query(m_con, "BEGIN") == 0); } // command::
inline void command::set_autocommit(bool autocommit) { close_stmt(); if (m_autocommit == autocommit) return; check(lib::singleton().p_mysql_query(m_con, autocommit? "ROLLBACK": "BEGIN") == 0); m_autocommit = autocommit; }
inline void command::close_all() { m_autocommit = true; close_stmt(); if (!m_con) return; MYSQL* con(0); std::swap(con, m_con); lib::singleton().p_mysql_close(con); }
bool command::process(term & t) { bool ret = false; term resp; #ifdef PRINTCMD char * tmpbuf = print_term(command); REMOTE_LOG(DBG, "========================================\nCOMMAND : %s %s\n========================================\n", CMD_NAME_STR(ERL_INT_VALUE(cmd)), tmpbuf); delete tmpbuf; #endif if(t.is_tuple() && t[1].is_integer()) { int cmd = t[1].v.i; resp.tuple(); resp.add(t[0]); resp.insert().integer(cmd); if((t.length() - 1) != (size_t)CMD_ARGS_COUNT(cmd)) { term & _t = resp.insert().tuple(); _t.insert().atom("error"); _t.insert().atom("badarg"); if(resp.is_undef()) REMOTE_LOG(ERR, "ERROR badarg %s expected %d, got %d\n", CMD_NAME_STR(cmd) , CMD_ARGS_COUNT(cmd), (t.length() - 1)); if(resp.is_undef()) REMOTE_LOG(CRT, "driver error: no resp generated, shutting down port\n"); vector<unsigned char> respv = tc.encode(resp); p.write_cmd(respv); } else { switch(cmd) { case RMOTE_MSG: ret = change_log_flag(t, resp); break; case GET_SESSN: ret = get_session(t, resp); break; case PUT_SESSN: ret = release_conn(t, resp); break; case CMT_SESSN: ret = commit(t, resp); break; case RBK_SESSN: ret = rollback(t, resp); break; case CMD_DSCRB: ret = describe(t, resp); break; case PREP_STMT: ret = prep_sql(t, resp); break; case BIND_ARGS: ret = bind_args(t, resp); break; case EXEC_STMT: ret = exec_stmt(t, resp); break; case FTCH_ROWS: ret = fetch_rows(t, resp); break; case CLSE_STMT: ret = close_stmt(t, resp); break; case GET_LOBDA: ret = get_lob_data(t, resp); break; case CMD_ECHOT: ret = echo(t, resp); break; case SESN_PING: ret = ping(t, resp); break; default: ret = true; break; } } } return ret; }
inline void command::exec_batch(const std::string& sql) { close_stmt(); check(lib::singleton().p_mysql_query(m_con, sql.c_str()) == 0); while (true) { MYSQL_RES* res(lib::singleton().p_mysql_store_result(m_con)); if (res) lib::singleton().p_mysql_free_result(res); const int r(lib::singleton().p_mysql_next_result(m_con)); if (r < 0) break; check(r == 0); } }
inline void free_stmt(MYSQL_STMT **holder) { int increment; if (holder != NULL) { for (increment = 0; increment < config.db.connections; increment++) { if (*(holder + increment) != NULL) { close_stmt(*(holder + increment)); } } free_bl(holder); } return; }
inline void command::exec(const std::string& sql, const std::vector<column_def>& params) { close_stmt(); m_stmt = lib::singleton().p_mysql_stmt_init(m_con); if (!m_stmt) throw std::runtime_error("MySQL error"); check(lib::singleton().p_mysql_stmt_prepare(m_stmt, sql.c_str(), (unsigned long)sql.size()) == 0); std::vector<MYSQL_BIND> binds(params.size()); if (!binds.empty()) { memset(binds.data(), 0, binds.size() * sizeof(MYSQL_BIND)); for (size_t i(0); i < params.size(); ++i) bind_param(params[i].query_value, binds[i]); check(lib::singleton().p_mysql_stmt_bind_param(m_stmt, binds.data()) == 0); } check(lib::singleton().p_mysql_stmt_execute(m_stmt) == 0); }