Skip to content

Commit

Permalink
lib/srdb1: url parser extracts the db name before the url parameters
Browse files Browse the repository at this point in the history
- some database urls can have parameters after db name, like:
  driver://username:password@dbhost:port/dbname?params
- reported by Kelvin Chua for db_mongodb
  • Loading branch information
miconda committed Nov 17, 2015
1 parent 6a738a9 commit 4da5d89
Showing 1 changed file with 28 additions and 4 deletions.
32 changes: 28 additions & 4 deletions lib/srdb1/db_id.c
Expand Up @@ -55,6 +55,30 @@ static int dupl_string(char** dst, const char* begin, const char* end)
return 0;
}

/**
* Duplicate a string name (until a params separator found)
* \param dst destination
* \param begin start of the string
* \param end end of the string
*/
static int dupl_string_name(char** dst, const char* begin, const char* end)
{
char *p;
if (*dst) pkg_free(*dst);

for(p=(char*)begin; p<end; p++) {
if(*p=='?') break;
}
*dst = pkg_malloc(p - begin + 1);
if ((*dst) == NULL) {
return -1;
}

memcpy(*dst, begin, p - begin);
(*dst)[p - begin] = '\0';
return 0;
}


/**
* Parse a database URL of form
Expand Down Expand Up @@ -151,7 +175,7 @@ static int parse_db_url(struct db_id* id, const str* url)

case '/':
if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
if (dupl_string(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
if (dupl_string_name(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
return 0;
}
break;
Expand All @@ -178,7 +202,7 @@ static int parse_db_url(struct db_id* id, const str* url)
id->host = prev_token;
prev_token = 0;
id->port = str2s(begin, url->s + i - begin, 0);
if (dupl_string(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
if (dupl_string_name(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
return 0;
}
break;
Expand All @@ -193,7 +217,7 @@ static int parse_db_url(struct db_id* id, const str* url)

case '/':
if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
if (dupl_string(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
if (dupl_string_name(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
return 0;
}
break;
Expand All @@ -202,7 +226,7 @@ static int parse_db_url(struct db_id* id, const str* url)
switch(url->s[i]) {
case '/':
id->port = str2s(begin, url->s + i - begin, 0);
if (dupl_string(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
if (dupl_string_name(&id->database, url->s + i + 1, url->s + len) < 0) goto err;
return 0;
}
break;
Expand Down

0 comments on commit 4da5d89

Please sign in to comment.