Example #1
0
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::
Example #2
0
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;
}
Example #3
0
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);
}
Example #4
0
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;
}
Example #5
0
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);
  }
}
Example #6
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;
}
Example #7
0
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);
}