diff --git a/src/idl/mysql.idl.php b/src/idl/mysql.idl.php index 38c1c6811d85b..d6407d49fb27a 100644 --- a/src/idl/mysql.idl.php +++ b/src/idl/mysql.idl.php @@ -21,6 +21,26 @@ 'connect_timeout_ms' => array(Int32, '-1'), 'query_timeout_ms' => array(Int32, '-1'))); + +f('mysql_connect_with_db', Variant, + array('server' => array(String, 'null_string'), + 'username' => array(String, 'null_string'), + 'password' => array(String, 'null_string'), + 'database' => array(String, 'null_string'), + 'new_link' => array(Boolean, 'false'), + 'client_flags' => array(Int32, '0'), + 'connect_timeout_ms' => array(Int32, '-1'), + 'query_timeout_ms' => array(Int32, '-1'))); + +f('mysql_pconnect_with_db', Variant, + array('server' => array(String, 'null_string'), + 'username' => array(String, 'null_string'), + 'password' => array(String, 'null_string'), + 'database' => array(String, 'null_string'), + 'client_flags' => array(Int32, '0'), + 'connect_timeout_ms' => array(Int32, '-1'), + 'query_timeout_ms' => array(Int32, '-1'))); + f('mysql_set_charset', Variant, array('charset' => String, 'link_identifier' => array(Variant, 'null'))); diff --git a/src/runtime/ext/ext_mysql.cpp b/src/runtime/ext/ext_mysql.cpp index cd8e6cba3a67f..07c37f84fe524 100644 --- a/src/runtime/ext/ext_mysql.cpp +++ b/src/runtime/ext/ext_mysql.cpp @@ -222,12 +222,13 @@ static MYSQL *create_new_conn() { } MySQL::MySQL(const char *host, int port, const char *username, - const char *password) + const char *password, const char *database) : m_port(port), m_last_error_set(false), m_last_errno(0), m_xaction_count(0) { if (host) m_host = host; if (username) m_username = username; if (password) m_password = password; + if (database) m_database = database; m_conn = create_new_conn(); } @@ -257,7 +258,8 @@ void MySQL::close() { } bool MySQL::connect(CStrRef host, int port, CStrRef socket, CStrRef username, - CStrRef password, int client_flags, int connect_timeout) { + CStrRef password, CStrRef database, + int client_flags, int connect_timeout) { if (m_conn == NULL) { m_conn = create_new_conn(); } @@ -271,9 +273,11 @@ bool MySQL::connect(CStrRef host, int port, CStrRef socket, CStrRef username, IOStatusHelper io("mysql::connect", host.data(), port); m_xaction_count = 0; bool ret = mysql_real_connect(m_conn, host.data(), username.data(), - password.data(), NULL, port, - socket.empty() ? NULL : socket.data(), - client_flags); + password.data(), + (database.empty() ? NULL : database.data()), + port, + socket.empty() ? NULL : socket.data(), + client_flags); if (ret && RuntimeOption::MySQLWaitTimeout > 0) { String query("set session wait_timeout="); query += String((int64)(RuntimeOption::MySQLWaitTimeout / 1000)); @@ -286,8 +290,8 @@ bool MySQL::connect(CStrRef host, int port, CStrRef socket, CStrRef username, } bool MySQL::reconnect(CStrRef host, int port, CStrRef socket, CStrRef username, - CStrRef password, int client_flags, - int connect_timeout) { + CStrRef password, CStrRef database, + int client_flags, int connect_timeout) { if (m_conn == NULL) { m_conn = create_new_conn(); if (connect_timeout >= 0) { @@ -299,14 +303,18 @@ bool MySQL::reconnect(CStrRef host, int port, CStrRef socket, CStrRef username, } IOStatusHelper io("mysql::connect", host.data(), port); return mysql_real_connect(m_conn, host.data(), username.data(), - password.data(), NULL, port, socket.data(), - client_flags); + password.data(), + (database.empty() ? NULL : database.data()), + port, socket.data(), client_flags); } if (!mysql_ping(m_conn)) { if (RuntimeOption::EnableStats && RuntimeOption::EnableSQLStats) { ServerStats::Log("sql.reconn_ok", 1); } + if (!database.empty()) { + mysql_select_db(m_conn, database.data()); + } return true; } @@ -320,8 +328,9 @@ bool MySQL::reconnect(CStrRef host, int port, CStrRef socket, CStrRef username, IOStatusHelper io("mysql::connect", host.data(), port); m_xaction_count = 0; return mysql_real_connect(m_conn, host.data(), username.data(), - password.data(), NULL, port, socket.data(), - client_flags); + password.data(), + (database.empty() ? NULL : database.data()), + port, socket.data(), client_flags); } /////////////////////////////////////////////////////////////////////////////// @@ -489,8 +498,8 @@ static Variant php_mysql_field_info(CVarRef result, int field, } static Variant php_mysql_do_connect(String server, String username, - String password, int client_flags, - bool persistent, + String password, String database, + int client_flags, bool persistent, int connect_timeout_ms, int query_timeout_ms) { if (connect_timeout_ms < 0) { @@ -502,6 +511,7 @@ static Variant php_mysql_do_connect(String server, String username, if (server.empty()) server = MySQL::GetDefaultServer(); if (username.empty()) username = MySQL::GetDefaultUsername(); if (password.empty()) password = MySQL::GetDefaultPassword(); + if (database.empty()) database = MySQL::GetDefaultDatabase(); // server format: hostname[:port][:/path/to/socket] String host, socket; @@ -535,17 +545,17 @@ static Variant php_mysql_do_connect(String server, String username, } if (mySQL == NULL) { - mySQL = new MySQL(host, port, username, password); + mySQL = new MySQL(host, port, username, password, database); ret = mySQL; if (!mySQL->connect(host, port, socket, username, password, - client_flags, connect_timeout_ms)) { + database, client_flags, connect_timeout_ms)) { mySQL->setLastError("mysql_connect"); return false; } } else { ret = mySQL; if (!mySQL->reconnect(host, port, socket, username, password, - client_flags, connect_timeout_ms)) { + database, client_flags, connect_timeout_ms)) { mySQL->setLastError("mysql_connect"); return false; } @@ -568,7 +578,21 @@ Variant f_mysql_connect(CStrRef server /* = null_string */, int client_flags /* = 0 */, int connect_timeout_ms /* = -1 */, int query_timeout_ms /* = -1 */) { - return php_mysql_do_connect(server, username, password, client_flags, false, + return php_mysql_do_connect(server, username, password, "", + client_flags, false, + connect_timeout_ms, query_timeout_ms); +} + +Variant f_mysql_connect_with_db(CStrRef server /* = null_string */, + CStrRef username /* = null_string */, + CStrRef password /* = null_string */, + CStrRef database /* = null_string */, + bool new_link /* = false */, + int client_flags /* = 0 */, + int connect_timeout_ms /* = -1 */, + int query_timeout_ms /* = -1 */) { + return php_mysql_do_connect(server, username, password, database, + client_flags, false, connect_timeout_ms, query_timeout_ms); } @@ -578,7 +602,20 @@ Variant f_mysql_pconnect(CStrRef server /* = null_string */, int client_flags /* = 0 */, int connect_timeout_ms /* = -1 */, int query_timeout_ms /* = -1 */) { - return php_mysql_do_connect(server, username, password, client_flags, true, + return php_mysql_do_connect(server, username, password, "", + client_flags, true, + connect_timeout_ms, query_timeout_ms); +} + +Variant f_mysql_pconnect_with_db(CStrRef server /* = null_string */, + CStrRef username /* = null_string */, + CStrRef password /* = null_string */, + CStrRef database /* = null_string */, + int client_flags /* = 0 */, + int connect_timeout_ms /* = -1 */, + int query_timeout_ms /* = -1 */) { + return php_mysql_do_connect(server, username, password, database, + client_flags, true, connect_timeout_ms, query_timeout_ms); } diff --git a/src/runtime/ext/ext_mysql.h b/src/runtime/ext/ext_mysql.h index 87770844622a1..aed4d2a9e1119 100644 --- a/src/runtime/ext/ext_mysql.h +++ b/src/runtime/ext/ext_mysql.h @@ -48,6 +48,7 @@ class MySQL : public SweepableResourceData { static String GetDefaultSocket(); static String GetDefaultUsername() { return String();} static String GetDefaultPassword() { return String();} + static String GetDefaultDatabase() { return String();} /** * A connection may be persistent across multiple HTTP requests. @@ -88,7 +89,7 @@ class MySQL : public SweepableResourceData { public: MySQL(const char *host, int port, const char *username, - const char *password); + const char *password, const char *database); ~MySQL(); void setLastError(const char *func); void close(); @@ -98,9 +99,9 @@ class MySQL : public SweepableResourceData { virtual bool isResource() const { return m_conn != NULL;} bool connect(CStrRef host, int port, CStrRef socket, CStrRef username, - CStrRef password, int client_flags, int connect_timeout); + CStrRef password, CStrRef database, int client_flags, int connect_timeout); bool reconnect(CStrRef host, int port, CStrRef socket, CStrRef username, - CStrRef password, int client_flags, int connect_timeout); + CStrRef password, CStrRef database, int client_flags, int connect_timeout); MYSQL *get() { return m_conn;} @@ -112,6 +113,7 @@ class MySQL : public SweepableResourceData { int m_port; std::string m_username; std::string m_password; + std::string m_database; bool m_last_error_set; int m_last_errno; std::string m_last_error; @@ -218,6 +220,22 @@ Variant f_mysql_pconnect(CStrRef server = null_string, int connect_timeout_ms = -1, int query_timeout_ms = -1); +Variant f_mysql_connect_with_db(CStrRef server = null_string, + CStrRef username = null_string, + CStrRef password = null_string, + CStrRef database = null_string, + bool new_link = false, + int client_flags = 0, + int connect_timeout_ms = -1, + int query_timeout_ms = -1); +Variant f_mysql_pconnect_with_db(CStrRef server = null_string, + CStrRef username = null_string, + CStrRef password = null_string, + CStrRef database = null_string, + int client_flags = 0, + int connect_timeout_ms = -1, + int query_timeout_ms = -1); + String f_mysql_escape_string(CStrRef unescaped_string); Variant f_mysql_real_escape_string(CStrRef unescaped_string, diff --git a/src/runtime/ext/profile/extprofile_mysql.h b/src/runtime/ext/profile/extprofile_mysql.h index cdbe158212b69..e2957326f81d0 100644 --- a/src/runtime/ext/profile/extprofile_mysql.h +++ b/src/runtime/ext/profile/extprofile_mysql.h @@ -35,6 +35,16 @@ inline Variant x_mysql_pconnect(CStrRef server = null_string, CStrRef username = return f_mysql_pconnect(server, username, password, client_flags, connect_timeout_ms, query_timeout_ms); } +inline Variant x_mysql_connect_with_db(CStrRef server = null_string, CStrRef username = null_string, CStrRef password = null_string, CStrRef database = null_string, bool new_link = false, int client_flags = 0, int connect_timeout_ms = -1, int query_timeout_ms = -1) { + FUNCTION_INJECTION_BUILTIN(mysql_connect_with_db); + return f_mysql_connect_with_db(server, username, password, database, new_link, client_flags, connect_timeout_ms, query_timeout_ms); +} + +inline Variant x_mysql_pconnect_with_db(CStrRef server = null_string, CStrRef username = null_string, CStrRef password = null_string, CStrRef database = null_string, int client_flags = 0, int connect_timeout_ms = -1, int query_timeout_ms = -1) { + FUNCTION_INJECTION_BUILTIN(mysql_pconnect_with_db); + return f_mysql_pconnect_with_db(server, username, password, database, client_flags, connect_timeout_ms, query_timeout_ms); +} + inline Variant x_mysql_set_charset(CStrRef charset, CVarRef link_identifier = null) { FUNCTION_INJECTION_BUILTIN(mysql_set_charset); return f_mysql_set_charset(charset, link_identifier); diff --git a/src/system/gen/sys/dynamic_table_func.no.cpp b/src/system/gen/sys/dynamic_table_func.no.cpp index 313cb3041cb6b..cb7092af7e7ab 100644 --- a/src/system/gen/sys/dynamic_table_func.no.cpp +++ b/src/system/gen/sys/dynamic_table_func.no.cpp @@ -559,6 +559,20 @@ Variant i_php_check_syntax(CArrRef params) { if (count <= 1) return (f_php_check_syntax(params[0])); return (f_php_check_syntax(params[0], ref(const_cast(params).lvalAt(1)))); } +Variant i_mysql_connect_with_db(CArrRef params) { + FUNCTION_INJECTION(mysql_connect_with_db); + int count __attribute__((__unused__)) = params.size(); + if (count > 8) return throw_toomany_arguments("mysql_connect_with_db", 8, 1); + if (count <= 0) return (f_mysql_connect_with_db()); + if (count == 1) return (f_mysql_connect_with_db(params[0])); + if (count == 2) return (f_mysql_connect_with_db(params[0], params[1])); + if (count == 3) return (f_mysql_connect_with_db(params[0], params[1], params[2])); + if (count == 4) return (f_mysql_connect_with_db(params[0], params[1], params[2], params[3])); + if (count == 5) return (f_mysql_connect_with_db(params[0], params[1], params[2], params[3], params[4])); + if (count == 6) return (f_mysql_connect_with_db(params[0], params[1], params[2], params[3], params[4], params[5])); + if (count == 7) return (f_mysql_connect_with_db(params[0], params[1], params[2], params[3], params[4], params[5], params[6])); + return (f_mysql_connect_with_db(params[0], params[1], params[2], params[3], params[4], params[5], params[6], params[7])); +} Variant i_drawgetstrokemiterlimit(CArrRef params) { FUNCTION_INJECTION(drawgetstrokemiterlimit); int count __attribute__((__unused__)) = params.size(); @@ -3992,6 +4006,19 @@ Variant i_hphp_thread_is_warmup_enabled(CArrRef params) { if (count > 0) return throw_toomany_arguments("hphp_thread_is_warmup_enabled", 0, 1); return (f_hphp_thread_is_warmup_enabled()); } +Variant i_mysql_pconnect_with_db(CArrRef params) { + FUNCTION_INJECTION(mysql_pconnect_with_db); + int count __attribute__((__unused__)) = params.size(); + if (count > 7) return throw_toomany_arguments("mysql_pconnect_with_db", 7, 1); + if (count <= 0) return (f_mysql_pconnect_with_db()); + if (count == 1) return (f_mysql_pconnect_with_db(params[0])); + if (count == 2) return (f_mysql_pconnect_with_db(params[0], params[1])); + if (count == 3) return (f_mysql_pconnect_with_db(params[0], params[1], params[2])); + if (count == 4) return (f_mysql_pconnect_with_db(params[0], params[1], params[2], params[3])); + if (count == 5) return (f_mysql_pconnect_with_db(params[0], params[1], params[2], params[3], params[4])); + if (count == 6) return (f_mysql_pconnect_with_db(params[0], params[1], params[2], params[3], params[4], params[5])); + return (f_mysql_pconnect_with_db(params[0], params[1], params[2], params[3], params[4], params[5], params[6])); +} Variant i_imagepsslantfont(CArrRef params) { FUNCTION_INJECTION(imagepsslantfont); int count __attribute__((__unused__)) = params.size(); @@ -12834,6 +12861,7 @@ Variant invoke_builtin(const char *s, CArrRef params, int64 hash, bool fatal) { HASH_INVOKE(0x6370CF455EA8604BLL, socket_create); break; case 76: + HASH_INVOKE(0x7848970191D5A04CLL, mysql_connect_with_db); HASH_INVOKE(0x03047FD5FC67204CLL, exif_read_data); break; case 83: @@ -13918,6 +13946,7 @@ Variant invoke_builtin(const char *s, CArrRef params, int64 hash, bool fatal) { HASH_INVOKE(0x40E0D496EE29B3A6LL, call_user_func_array); break; case 936: + HASH_INVOKE(0x0121CD6CDCE1C3A8LL, mysql_pconnect_with_db); HASH_INVOKE(0x4120B8157ED413A8LL, i18n_loc_set_strength); break; case 937: @@ -19512,6 +19541,58 @@ Variant ei_php_check_syntax(Eval::VariableEnvironment &env, const Eval::Function if (count <= 1) return (x_php_check_syntax(a0)); else return (x_php_check_syntax(a0, ref(a1))); } +Variant ei_mysql_connect_with_db(Eval::VariableEnvironment &env, const Eval::FunctionCallExpression *caller) { + Variant a0; + Variant a1; + Variant a2; + Variant a3; + Variant a4; + Variant a5; + Variant a6; + Variant a7; + const std::vector ¶ms = caller->params(); + int count __attribute__((__unused__)) = params.size(); + if (count > 8) return throw_toomany_arguments("mysql_connect_with_db", 8, 1); + std::vector::const_iterator it = params.begin(); + do { + if (it == params.end()) break; + a0 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a1 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a2 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a3 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a4 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a5 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a6 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a7 = (*it)->eval(env); + it++; + } while(false); + for (; it != params.end(); ++it) { + (*it)->eval(env); + } + if (count <= 0) return (x_mysql_connect_with_db()); + else if (count == 1) return (x_mysql_connect_with_db(a0)); + else if (count == 2) return (x_mysql_connect_with_db(a0, a1)); + else if (count == 3) return (x_mysql_connect_with_db(a0, a1, a2)); + else if (count == 4) return (x_mysql_connect_with_db(a0, a1, a2, a3)); + else if (count == 5) return (x_mysql_connect_with_db(a0, a1, a2, a3, a4)); + else if (count == 6) return (x_mysql_connect_with_db(a0, a1, a2, a3, a4, a5)); + else if (count == 7) return (x_mysql_connect_with_db(a0, a1, a2, a3, a4, a5, a6)); + else return (x_mysql_connect_with_db(a0, a1, a2, a3, a4, a5, a6, a7)); +} Variant ei_drawgetstrokemiterlimit(Eval::VariableEnvironment &env, const Eval::FunctionCallExpression *caller) { Variant a0; const std::vector ¶ms = caller->params(); @@ -30441,6 +30522,53 @@ Variant ei_hphp_thread_is_warmup_enabled(Eval::VariableEnvironment &env, const E } return (x_hphp_thread_is_warmup_enabled()); } +Variant ei_mysql_pconnect_with_db(Eval::VariableEnvironment &env, const Eval::FunctionCallExpression *caller) { + Variant a0; + Variant a1; + Variant a2; + Variant a3; + Variant a4; + Variant a5; + Variant a6; + const std::vector ¶ms = caller->params(); + int count __attribute__((__unused__)) = params.size(); + if (count > 7) return throw_toomany_arguments("mysql_pconnect_with_db", 7, 1); + std::vector::const_iterator it = params.begin(); + do { + if (it == params.end()) break; + a0 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a1 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a2 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a3 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a4 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a5 = (*it)->eval(env); + it++; + if (it == params.end()) break; + a6 = (*it)->eval(env); + it++; + } while(false); + for (; it != params.end(); ++it) { + (*it)->eval(env); + } + if (count <= 0) return (x_mysql_pconnect_with_db()); + else if (count == 1) return (x_mysql_pconnect_with_db(a0)); + else if (count == 2) return (x_mysql_pconnect_with_db(a0, a1)); + else if (count == 3) return (x_mysql_pconnect_with_db(a0, a1, a2)); + else if (count == 4) return (x_mysql_pconnect_with_db(a0, a1, a2, a3)); + else if (count == 5) return (x_mysql_pconnect_with_db(a0, a1, a2, a3, a4)); + else if (count == 6) return (x_mysql_pconnect_with_db(a0, a1, a2, a3, a4, a5)); + else return (x_mysql_pconnect_with_db(a0, a1, a2, a3, a4, a5, a6)); +} Variant ei_imagepsslantfont(Eval::VariableEnvironment &env, const Eval::FunctionCallExpression *caller) { Variant a0; Variant a1; @@ -58580,6 +58708,7 @@ Variant Eval::invoke_from_eval_builtin(const char *s, Eval::VariableEnvironment HASH_INVOKE_FROM_EVAL(0x6370CF455EA8604BLL, socket_create); break; case 76: + HASH_INVOKE_FROM_EVAL(0x7848970191D5A04CLL, mysql_connect_with_db); HASH_INVOKE_FROM_EVAL(0x03047FD5FC67204CLL, exif_read_data); break; case 83: @@ -59664,6 +59793,7 @@ Variant Eval::invoke_from_eval_builtin(const char *s, Eval::VariableEnvironment HASH_INVOKE_FROM_EVAL(0x40E0D496EE29B3A6LL, call_user_func_array); break; case 936: + HASH_INVOKE_FROM_EVAL(0x0121CD6CDCE1C3A8LL, mysql_pconnect_with_db); HASH_INVOKE_FROM_EVAL(0x4120B8157ED413A8LL, i18n_loc_set_strength); break; case 937: diff --git a/src/system/mysql.inc b/src/system/mysql.inc index cd8345773b104..5ff9e932a3853 100644 --- a/src/system/mysql.inc +++ b/src/system/mysql.inc @@ -1,6 +1,8 @@ #if EXT_TYPE == 0 "mysql_connect", T(Variant), S(0), "server", T(String), "null_string", S(0), "username", T(String), "null_string", S(0), "password", T(String), "null_string", S(0), "new_link", T(Boolean), "false", S(0), "client_flags", T(Int32), "0", S(0), "connect_timeout_ms", T(Int32), "-1", S(0), "query_timeout_ms", T(Int32), "-1", S(0), NULL, S(0), "mysql_pconnect", T(Variant), S(0), "server", T(String), "null_string", S(0), "username", T(String), "null_string", S(0), "password", T(String), "null_string", S(0), "client_flags", T(Int32), "0", S(0), "connect_timeout_ms", T(Int32), "-1", S(0), "query_timeout_ms", T(Int32), "-1", S(0), NULL, S(0), +"mysql_connect_with_db", T(Variant), S(0), "server", T(String), "null_string", S(0), "username", T(String), "null_string", S(0), "password", T(String), "null_string", S(0), "database", T(String), "null_string", S(0), "new_link", T(Boolean), "false", S(0), "client_flags", T(Int32), "0", S(0), "connect_timeout_ms", T(Int32), "-1", S(0), "query_timeout_ms", T(Int32), "-1", S(0), NULL, S(0), +"mysql_pconnect_with_db", T(Variant), S(0), "server", T(String), "null_string", S(0), "username", T(String), "null_string", S(0), "password", T(String), "null_string", S(0), "database", T(String), "null_string", S(0), "client_flags", T(Int32), "0", S(0), "connect_timeout_ms", T(Int32), "-1", S(0), "query_timeout_ms", T(Int32), "-1", S(0), NULL, S(0), "mysql_set_charset", T(Variant), S(0), "charset", T(String), NULL, S(0), "link_identifier", T(Variant), "null", S(0), NULL, S(0), "mysql_ping", T(Variant), S(0), "link_identifier", T(Variant), "null", S(0), NULL, S(0), "mysql_escape_string", T(String), S(0), "unescaped_string", T(String), NULL, S(0), NULL, S(0),