int my_con_connect(db_con_t* con) { struct my_con* mcon; struct my_uri* muri; mcon = DB_GET_PAYLOAD(con); muri = DB_GET_PAYLOAD(con->uri); /* Do not reconnect already connected connections */ if (mcon->flags & MY_CONNECTED) return 0; DBG("mysql: Connecting to %.*s:%.*s\n", con->uri->scheme.len, ZSW(con->uri->scheme.s), con->uri->body.len, ZSW(con->uri->body.s)); if (my_connect_to) { if (mysql_options(mcon->con, MYSQL_OPT_CONNECT_TIMEOUT, (char*)&my_connect_to)) WARN("mysql: failed to set MYSQL_OPT_CONNECT_TIMEOUT\n"); } #if MYSQL_VERSION_ID >= 40101 if ((my_client_ver >= 50025) || ((my_client_ver >= 40122) && (my_client_ver < 50000))) { if (my_send_to) { if (mysql_options(mcon->con, MYSQL_OPT_WRITE_TIMEOUT , (char*)&my_send_to)) WARN("mysql: failed to set MYSQL_OPT_WRITE_TIMEOUT\n"); } if (my_recv_to){ if (mysql_options(mcon->con, MYSQL_OPT_READ_TIMEOUT , (char*)&my_recv_to)) WARN("mysql: failed to set MYSQL_OPT_READ_TIMEOUT\n"); } } #endif if (!mysql_real_connect(mcon->con, muri->host, muri->username, muri->password, muri->database, muri->port, 0, 0)) { LOG(L_ERR, "mysql: %s\n", mysql_error(mcon->con)); return -1; } DBG("mysql: Connection type is %s\n", mysql_get_host_info(mcon->con)); DBG("mysql: Protocol version is %d\n", mysql_get_proto_info(mcon->con)); DBG("mysql: Server version is %s\n", mysql_get_server_info(mcon->con)); mcon->flags |= MY_CONNECTED; /* Increase the variable that keeps track of number of connects performed * on this connection. The mysql module uses the variable to determine * when a pre-compiled command needs to be uploaded to the server again. * If the number in the my_con structure is large than the number kept * in my_cmd then it means that we have to upload the command to the server * again because the connection was reconnected meanwhile. */ mcon->resets++; return 0; }
static MYSQL *getconnection (mysql_database_t *db) { if (db->state != 0) { int err; if ((err = mysql_ping (db->con)) != 0) { /* Assured by "mysql_config_database" */ assert (db->instance != NULL); WARNING ("mysql_ping failed for instance \"%s\": %s", db->instance, mysql_error (db->con)); db->state = 0; } else { db->state = 1; return (db->con); } } if ((db->con = mysql_init (db->con)) == NULL) { ERROR ("mysql_init failed: %s", mysql_error (db->con)); db->state = 0; return (NULL); } if (mysql_real_connect (db->con, db->host, db->user, db->pass, db->database, db->port, db->socket, 0) == NULL) { ERROR ("mysql plugin: Failed to connect to database %s " "at server %s: %s", (db->database != NULL) ? db->database : "<none>", (db->host != NULL) ? db->host : "localhost", mysql_error (db->con)); db->state = 0; return (NULL); } else { INFO ("mysql plugin: Successfully connected to database %s " "at server %s (server version: %s, protocol version: %d)", (db->database != NULL) ? db->database : "<none>", mysql_get_host_info (db->con), mysql_get_server_info (db->con), mysql_get_proto_info (db->con)); db->state = 1; return (db->con); } } /* static MYSQL *getconnection (mysql_database_t *db) */
int my_con_connect(db_con_t* con) { struct my_con* mcon; struct my_uri* muri; mcon = DB_GET_PAYLOAD(con); muri = DB_GET_PAYLOAD(con->uri); /* Do not reconnect already connected connections */ if (mcon->flags & MY_CONNECTED) return 0; DBG("mysql: Connecting to %.*s:%.*s\n", con->uri->scheme.len, ZSW(con->uri->scheme.s), con->uri->body.len, ZSW(con->uri->body.s)); if (my_connect_to) { if (mysql_options(mcon->con, MYSQL_OPT_CONNECT_TIMEOUT, (char*)&my_connect_to)) WARN("mysql: failed to set MYSQL_OPT_CONNECT_TIMEOUT\n"); } #if MYSQL_VERSION_ID >= 40101 if ((my_client_ver >= 50025) || ((my_client_ver >= 40122) && (my_client_ver < 50000))) { if (my_send_to) { if (mysql_options(mcon->con, MYSQL_OPT_WRITE_TIMEOUT , (char*)&my_send_to)) WARN("mysql: failed to set MYSQL_OPT_WRITE_TIMEOUT\n"); } if (my_recv_to){ if (mysql_options(mcon->con, MYSQL_OPT_READ_TIMEOUT , (char*)&my_recv_to)) WARN("mysql: failed to set MYSQL_OPT_READ_TIMEOUT\n"); } } #endif if (!mysql_real_connect(mcon->con, muri->host, muri->username, muri->password, muri->database, muri->port, 0, 0)) { LOG(L_ERR, "mysql: %s\n", mysql_error(mcon->con)); return -1; } DBG("mysql: Connection type is %s\n", mysql_get_host_info(mcon->con)); DBG("mysql: Protocol version is %d\n", mysql_get_proto_info(mcon->con)); DBG("mysql: Server version is %s\n", mysql_get_server_info(mcon->con)); mcon->flags |= MY_CONNECTED; return 0; }
static MYSQL *getconnection (mysql_database_t *db) { if (db->is_connected) { int status; status = mysql_ping (db->con); if (status == 0) return (db->con); WARNING ("mysql plugin: Lost connection to instance \"%s\": %s", db->instance, mysql_error (db->con)); } db->is_connected = 0; if (db->con == NULL) { db->con = mysql_init (NULL); if (db->con == NULL) { ERROR ("mysql plugin: mysql_init failed: %s", mysql_error (db->con)); return (NULL); } } /* Configure TCP connect timeout (default: 0) */ db->con->options.connect_timeout = db->timeout; if (mysql_real_connect (db->con, db->host, db->user, db->pass, db->database, db->port, db->socket, 0) == NULL) { ERROR ("mysql plugin: Failed to connect to database %s " "at server %s: %s", (db->database != NULL) ? db->database : "<none>", (db->host != NULL) ? db->host : "localhost", mysql_error (db->con)); return (NULL); } INFO ("mysql plugin: Successfully connected to database %s " "at server %s (server version: %s, protocol version: %d)", (db->database != NULL) ? db->database : "<none>", mysql_get_host_info (db->con), mysql_get_server_info (db->con), mysql_get_proto_info (db->con)); db->is_connected = 1; return (db->con); } /* static MYSQL *getconnection (mysql_database_t *db) */
/*! \brief * Create a new connection structure, * open the MySQL connection and set reference count to 1 */ struct my_con* db_mysql_new_connection(const struct db_id* id) { struct my_con* ptr; char *host, *grp, *egrp; if (!id) { LM_ERR("invalid parameter value\n"); return 0; } ptr = (struct my_con*)pkg_malloc(sizeof(struct my_con)); if (!ptr) { LM_ERR("no private memory left\n"); return 0; } egrp = 0; memset(ptr, 0, sizeof(struct my_con)); ptr->ref = 1; ptr->con = (MYSQL*)pkg_malloc(sizeof(MYSQL)); if (!ptr->con) { LM_ERR("no private memory left\n"); goto err; } mysql_init(ptr->con); if (id->host[0] == '[' && (egrp = strchr(id->host, ']')) != NULL) { grp = id->host + 1; *egrp = '\0'; host = egrp; if (host != id->host + strlen(id->host)-1) { host += 1; // host found after closing bracket } else { // let mysql read host info from my.cnf // (defaults to "localhost") host = NULL; } // read [client] and [<grp>] sections in the order // given in my.cnf mysql_options(ptr->con, MYSQL_READ_DEFAULT_GROUP, grp); } else { host = id->host; } if (id->port) { LM_DBG("opening connection: mysql://xxxx:xxxx@%s:%d/%s\n", ZSW(host), id->port, ZSW(id->database)); } else { LM_DBG("opening connection: mysql://xxxx:xxxx@%s/%s\n", ZSW(host), ZSW(id->database)); } // set connect, read and write timeout, the value counts three times mysql_options(ptr->con, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&db_mysql_timeout_interval); mysql_options(ptr->con, MYSQL_OPT_READ_TIMEOUT, (const char *)&db_mysql_timeout_interval); mysql_options(ptr->con, MYSQL_OPT_WRITE_TIMEOUT, (const char *)&db_mysql_timeout_interval); #if (MYSQL_VERSION_ID >= 40100) if (!mysql_real_connect(ptr->con, host, id->username, id->password, id->database, id->port, 0, CLIENT_MULTI_STATEMENTS)) { #else if (!mysql_real_connect(ptr->con, host, id->username, id->password, id->database, id->port, 0, 0)) { #endif LM_ERR("driver error: %s\n", mysql_error(ptr->con)); /* increase error counter */ counter_inc(mysql_cnts_h.driver_err); mysql_close(ptr->con); goto err; } /* force reconnection if enabled */ if (db_mysql_auto_reconnect) ptr->con->reconnect = 1; else ptr->con->reconnect = 0; LM_DBG("connection type is %s\n", mysql_get_host_info(ptr->con)); LM_DBG("protocol version is %d\n", mysql_get_proto_info(ptr->con)); LM_DBG("server version is %s\n", mysql_get_server_info(ptr->con)); ptr->timestamp = time(0); ptr->id = (struct db_id*)id; if(egrp) *egrp = ']'; return ptr; err: if (ptr && ptr->con) pkg_free(ptr->con); if (ptr) pkg_free(ptr); if(egrp) *egrp = ']'; return 0; } /*! \brief * Close the connection and release memory */ void db_mysql_free_connection(struct pool_con* con) { struct my_con * _c; if (!con) return; _c = (struct my_con*) con; if (_c->id) free_db_id(_c->id); if (_c->con) { mysql_close(_c->con); pkg_free(_c->con); } pkg_free(_c); }
/* * Create a new connection structure, * open the MySQL connection and set reference count to 1 */ struct my_con* new_connection(struct db_id* id) { struct my_con* ptr; if (!id) { LOG(L_ERR, "new_connection: Invalid parameter value\n"); return 0; } ptr = (struct my_con*)pkg_malloc(sizeof(struct my_con)); if (!ptr) { LOG(L_ERR, "new_connection: No memory left\n"); return 0; } memset(ptr, 0, sizeof(struct my_con)); ptr->ref = 1; ptr->con = (MYSQL*)pkg_malloc(sizeof(MYSQL)); if (!ptr->con) { LOG(L_ERR, "new_connection: No enough memory\n"); goto err; } mysql_init(ptr->con); if (id->port) { DBG("new_connection: Opening MySQL connection: %s://%s:%s@%s:%d/%s\n", ZSW(id->scheme), ZSW(id->username), ZSW(id->password), ZSW(id->host), id->port, ZSW(id->database) ); } else { DBG("new_connection: Opening MySQL connection: %s://%s:%s@%s/%s\n", ZSW(id->scheme), ZSW(id->username), ZSW(id->password), ZSW(id->host), ZSW(id->database) ); } if (!mysql_real_connect(ptr->con, id->host, id->username, id->password, id->database, id->port, 0, 0)) { LOG(L_ERR, "new_connection: %s\n", mysql_error(ptr->con)); mysql_close(ptr->con); goto err; } /* Enable reconnection explicitly */ ptr->con->reconnect = 1; DBG("new_connection: Connection type is %s\n", mysql_get_host_info(ptr->con)); DBG("new_connection: Protocol version is %d\n", mysql_get_proto_info(ptr->con)); DBG("new_connection: Server version is %s\n", mysql_get_server_info(ptr->con)); ptr->timestamp = time(0); ptr->id = id; return ptr; err: if (ptr && ptr->con) pkg_free(ptr->con); if (ptr) pkg_free(ptr); return 0; }
Variant f_mysql_get_proto_info(CVarRef link_identifier /* = uninit_null() */) { MYSQL *conn = MySQL::GetConn(link_identifier); if (!conn) return false; return (int64_t)mysql_get_proto_info(conn); }
Variant HHVM_FUNCTION(mysql_get_proto_info, const Variant& link_identifier /* = uninit_null() */) { MYSQL *conn = MySQL::GetConn(link_identifier); if (!conn) return false; return (int64_t)mysql_get_proto_info(conn); }
unsigned int GSqlDatabase::GetProtocolInformation(void) { return (mysql_get_proto_info(&(this->_mysql))); }
// unsigned int mysql_get_proto_info(MYSQL *mysql) static IDL_VPTR IDL_mg_mysql_get_proto_info(int argc, IDL_VPTR *argv) { unsigned int info = mysql_get_proto_info((MYSQL *)argv[0]->value.ptrint); return IDL_GettmpULong(info); }
static JSVAL get_proto_info(JSARGS args) { HandleScope scope; MYSQL *handle = (MYSQL *) args[0]->IntegerValue(); return scope.Close(Integer::New(mysql_get_proto_info(handle))); }
static PyObject* wsql_connection_get_proto_info(wsql_connection *self, void* closure) { CHECK_CONNECTION(self, NULL); return PyLong_FromLong((long)mysql_get_proto_info(&(self->connection))); }
/* proto_info() */ static VALUE proto_info(VALUE obj) { return INT2NUM(mysql_get_proto_info(GetHandler(obj))); }
unsigned int CDatabase_Connection::get_proto_info() { return mysql_get_proto_info(&my); }
int main (int argc, char **argv) { MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; /* should be status */ char *result = NULL; char *error = NULL; char slaveresult[SLAVERESULTSIZE]; char* perf; perf = strdup (""); setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); /* Parse extra opts if any */ argv=np_extra_opts (&argc, argv, progname); if (process_arguments (argc, argv) == ERROR) usage4 (_("Could not parse arguments")); /* initialize mysql */ mysql_init (&mysql); if (opt_file != NULL) mysql_options(&mysql,MYSQL_READ_DEFAULT_FILE,opt_file); if (opt_group != NULL) mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,opt_group); else mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"client"); if (ssl) mysql_ssl_set(&mysql,key,cert,ca_cert,ca_dir,ciphers); /* establish a connection to the server and error checking */ if (!mysql_real_connect(&mysql,db_host,db_user,db_pass,db,db_port,db_socket,0)) { if (ignore_auth && mysql_errno (&mysql) == ER_ACCESS_DENIED_ERROR) { printf("MySQL OK - Version: %s (protocol %d)\n", mysql_get_server_info(&mysql), mysql_get_proto_info(&mysql) ); mysql_close (&mysql); return STATE_OK; } else if (mysql_errno (&mysql) == CR_UNKNOWN_HOST) die (STATE_WARNING, "%s\n", mysql_error (&mysql)); else if (mysql_errno (&mysql) == CR_VERSION_ERROR) die (STATE_WARNING, "%s\n", mysql_error (&mysql)); else if (mysql_errno (&mysql) == CR_OUT_OF_MEMORY) die (STATE_WARNING, "%s\n", mysql_error (&mysql)); else if (mysql_errno (&mysql) == CR_IPSOCK_ERROR) die (STATE_WARNING, "%s\n", mysql_error (&mysql)); else if (mysql_errno (&mysql) == CR_SOCKET_CREATE_ERROR) die (STATE_WARNING, "%s\n", mysql_error (&mysql)); else die (STATE_CRITICAL, "%s\n", mysql_error (&mysql)); } /* get the server stats */ result = strdup (mysql_stat (&mysql)); /* error checking once more */ if (mysql_error (&mysql)) { if (mysql_errno (&mysql) == CR_SERVER_GONE_ERROR) die (STATE_CRITICAL, "%s\n", mysql_error (&mysql)); else if (mysql_errno (&mysql) == CR_SERVER_LOST) die (STATE_CRITICAL, "%s\n", mysql_error (&mysql)); else if (mysql_errno (&mysql) == CR_UNKNOWN_ERROR) die (STATE_CRITICAL, "%s\n", mysql_error (&mysql)); } /* try to fetch some perf data */ if (mysql_query (&mysql, "show global status") == 0) { if ( (res = mysql_store_result (&mysql)) == NULL) { error = strdup(mysql_error(&mysql)); mysql_close (&mysql); die (STATE_CRITICAL, _("status store_result error: %s\n"), error); } while ( (row = mysql_fetch_row (res)) != NULL) { int i; for(i = 0; i < LENGTH_METRIC_UNIT; i++) { if (strcmp(row[0], metric_unit[i]) == 0) { xasprintf(&perf, "%s%s ", perf, perfdata(metric_unit[i], atol(row[1]), "", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0)); continue; } } for(i = 0; i < LENGTH_METRIC_COUNTER; i++) { if (strcmp(row[0], metric_counter[i]) == 0) { xasprintf(&perf, "%s%s ", perf, perfdata(metric_counter[i], atol(row[1]), "c", FALSE, 0, FALSE, 0, FALSE, 0, FALSE, 0)); continue; } } } /* remove trailing space */ if (strlen(perf) > 0) perf[strlen(perf) - 1] = '\0'; } if(check_slave) { /* check the slave status */ if (mysql_query (&mysql, "show slave status") != 0) { error = strdup(mysql_error(&mysql)); mysql_close (&mysql); die (STATE_CRITICAL, _("slave query error: %s\n"), error); } /* store the result */ if ( (res = mysql_store_result (&mysql)) == NULL) { error = strdup(mysql_error(&mysql)); mysql_close (&mysql); die (STATE_CRITICAL, _("slave store_result error: %s\n"), error); } /* Check there is some data */ if (mysql_num_rows(res) == 0) { mysql_close(&mysql); die (STATE_WARNING, "%s\n", _("No slaves defined")); } /* fetch the first row */ if ( (row = mysql_fetch_row (res)) == NULL) { error = strdup(mysql_error(&mysql)); mysql_free_result (res); mysql_close (&mysql); die (STATE_CRITICAL, _("slave fetch row error: %s\n"), error); } if (mysql_field_count (&mysql) == 12) { /* mysql 3.23.x */ snprintf (slaveresult, SLAVERESULTSIZE, _("Slave running: %s"), row[6]); if (strcmp (row[6], "Yes") != 0) { mysql_free_result (res); mysql_close (&mysql); die (STATE_CRITICAL, "%s\n", slaveresult); } } else { /* mysql 4.x.x and mysql 5.x.x */ int slave_io_field = -1 , slave_sql_field = -1, seconds_behind_field = -1, i, num_fields; MYSQL_FIELD* fields; num_fields = mysql_num_fields(res); fields = mysql_fetch_fields(res); for(i = 0; i < num_fields; i++) { if (strcmp(fields[i].name, "Slave_IO_Running") == 0) { slave_io_field = i; continue; } if (strcmp(fields[i].name, "Slave_SQL_Running") == 0) { slave_sql_field = i; continue; } if (strcmp(fields[i].name, "Seconds_Behind_Master") == 0) { seconds_behind_field = i; continue; } } /* Check if slave status is available */ if ((slave_io_field < 0) || (slave_sql_field < 0) || (num_fields == 0)) { mysql_free_result (res); mysql_close (&mysql); die (STATE_CRITICAL, "Slave status unavailable\n"); } /* Save slave status in slaveresult */ snprintf (slaveresult, SLAVERESULTSIZE, "Slave IO: %s Slave SQL: %s Seconds Behind Master: %s", row[slave_io_field], row[slave_sql_field], seconds_behind_field!=-1?row[seconds_behind_field]:"Unknown"); /* Raise critical error if SQL THREAD or IO THREAD are stopped */ if (strcmp (row[slave_io_field], "Yes") != 0 || strcmp (row[slave_sql_field], "Yes") != 0) { mysql_free_result (res); mysql_close (&mysql); die (STATE_CRITICAL, "%s\n", slaveresult); } if (verbose >=3) { if (seconds_behind_field == -1) { printf("seconds_behind_field not found\n"); } else { printf ("seconds_behind_field(index %d)=%s\n", seconds_behind_field, row[seconds_behind_field]); } } /* Check Seconds Behind against threshold */ if ((seconds_behind_field != -1) && (strcmp (row[seconds_behind_field], "NULL") != 0)) { double value = atof(row[seconds_behind_field]); int status; status = get_status(value, my_threshold); xasprintf (&perf, "%s %s", perf, fperfdata ("seconds behind master", value, "s", TRUE, (double) warning_time, TRUE, (double) critical_time, FALSE, 0, FALSE, 0)); if (status == STATE_WARNING) { printf("SLOW_SLAVE %s: %s|%s\n", _("WARNING"), slaveresult, perf); exit(STATE_WARNING); } else if (status == STATE_CRITICAL) { printf("SLOW_SLAVE %s: %s|%s\n", _("CRITICAL"), slaveresult, perf); exit(STATE_CRITICAL); } } } /* free the result */ mysql_free_result (res); } /* close the connection */ mysql_close (&mysql); /* print out the result of stats */ if (check_slave) { printf ("%s %s|%s\n", result, slaveresult, perf); } else { printf ("%s|%s\n", result, perf); } return STATE_OK; }