|
@@ -79,144 +79,3 @@ time_t mysql2time(const char* _str)
|
|
|
time.tm_isdst = -1;
|
|
|
return mktime(&time);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-/*
|
|
|
- * Parse a mysql database URL of form
|
|
|
- * mysql://[username[:password]@]hostname[:port]/database
|
|
|
- *
|
|
|
- * Returns 0 if parsing was successful and -1 otherwise
|
|
|
- */
|
|
|
-int parse_mysql_url(char* _url, char** _user, char** _pass,
|
|
|
- char** _host, char** _port, char** _db)
|
|
|
-{
|
|
|
-#define SHORTEST_MYSQL_URL "mysql://a/b"
|
|
|
-#define SHORTEST_MYSQL_URL_LEN (sizeof(SHORTEST_MYSQL_URL) - 1)
|
|
|
-
|
|
|
-#define MYSQL_URL_PREFIX "mysql://"
|
|
|
-#define MYSQL_URL_PREFIX_LEN (sizeof(MYSQL_URL_PREFIX) - 1)
|
|
|
-
|
|
|
- enum state {
|
|
|
- ST_USER_HOST, /* Username or hostname */
|
|
|
- ST_PASS_PORT, /* Password or port part */
|
|
|
- ST_HOST, /* Hostname part */
|
|
|
- ST_PORT, /* Port part */
|
|
|
- ST_DB /* Database part */
|
|
|
- };
|
|
|
-
|
|
|
- enum state st;
|
|
|
- int len, i;
|
|
|
- char* begin, *prev_begin;
|
|
|
-
|
|
|
- if (!_url || !_user || !_pass || !_host || !_port || !_db) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- len = strlen(_url);
|
|
|
- if (len < SHORTEST_MYSQL_URL_LEN) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- if (strncasecmp(_url, MYSQL_URL_PREFIX, MYSQL_URL_PREFIX_LEN)) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- /* Skip the prefix part */
|
|
|
- _url += MYSQL_URL_PREFIX_LEN;
|
|
|
- len -= MYSQL_URL_PREFIX_LEN;
|
|
|
-
|
|
|
- /* Initialize all variables */
|
|
|
- *_user = '\0';
|
|
|
- *_pass = '\0';
|
|
|
- *_host = '\0';
|
|
|
- *_port = '\0';
|
|
|
- *_db = '\0';
|
|
|
-
|
|
|
- st = ST_USER_HOST;
|
|
|
- begin = _url;
|
|
|
- prev_begin = 0;
|
|
|
-
|
|
|
- for(i = 0; i < len; i++) {
|
|
|
- switch(st) {
|
|
|
- case ST_USER_HOST:
|
|
|
- switch(_url[i]) {
|
|
|
- case '@':
|
|
|
- st = ST_HOST;
|
|
|
- *_user = begin;
|
|
|
- begin = _url + i + 1;
|
|
|
- _url[i] = '\0';
|
|
|
- break;
|
|
|
-
|
|
|
- case ':':
|
|
|
- st = ST_PASS_PORT;
|
|
|
- prev_begin = begin;
|
|
|
- begin = _url + i + 1;
|
|
|
- _url[i] = '\0';
|
|
|
- break;
|
|
|
-
|
|
|
- case '/':
|
|
|
- *_host = begin;
|
|
|
- _url[i] = '\0';
|
|
|
-
|
|
|
- *_db = _url + i + 1;
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- case ST_PASS_PORT:
|
|
|
- switch(_url[i]) {
|
|
|
- case '@':
|
|
|
- st = ST_HOST;
|
|
|
- *_user = prev_begin;
|
|
|
- *_pass = begin;
|
|
|
- begin = _url + i + 1;
|
|
|
- _url[i] = '\0';
|
|
|
- break;
|
|
|
-
|
|
|
- case '/':
|
|
|
- *_host = prev_begin;
|
|
|
- *_port = begin;
|
|
|
- _url[i] = '\0';
|
|
|
-
|
|
|
- *_db = _url + i + 1;
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- case ST_HOST:
|
|
|
- switch(_url[i]) {
|
|
|
- case ':':
|
|
|
- st = ST_PORT;
|
|
|
- *_host = begin;
|
|
|
- begin = _url + i + 1;
|
|
|
- _url[i] = '\0';
|
|
|
- break;
|
|
|
-
|
|
|
- case '/':
|
|
|
- *_host = begin;
|
|
|
- _url[i] = '\0';
|
|
|
-
|
|
|
- *_db = _url + i + 1;
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- case ST_PORT:
|
|
|
- switch(_url[i]) {
|
|
|
- case '/':
|
|
|
- *_port = begin;
|
|
|
- _url[i] = '\0';
|
|
|
-
|
|
|
- *_db = _url + i + 1;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case ST_DB:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (st != ST_DB) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|