2
0
Эх сурвалжийг харах

lib/srdb1: url parser extracts the db name before the url parameters

- some database urls can have parameters after db name, like:
  driver://username:password@dbhost:port/dbname?params
- reported by Kelvin Chua for db_mongodb
Daniel-Constantin Mierla 9 жил өмнө
parent
commit
4da5d898da
1 өөрчлөгдсөн 28 нэмэгдсэн , 4 устгасан
  1. 28 4
      lib/srdb1/db_id.c

+ 28 - 4
lib/srdb1/db_id.c

@@ -55,6 +55,30 @@ static int dupl_string(char** dst, const char* begin, const char* end)
 	return 0;
 	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 
  * Parse a database URL of form 
@@ -151,7 +175,7 @@ static int parse_db_url(struct db_id* id, const str* url)
 
 
 			case '/':
 			case '/':
 				if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
 				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;
 				return 0;
 			}
 			}
 			break;
 			break;
@@ -178,7 +202,7 @@ static int parse_db_url(struct db_id* id, const str* url)
 				id->host = prev_token;
 				id->host = prev_token;
 				prev_token = 0;
 				prev_token = 0;
 				id->port = str2s(begin, url->s + i - begin, 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;
 				return 0;
 			}
 			}
 			break;
 			break;
@@ -193,7 +217,7 @@ static int parse_db_url(struct db_id* id, const str* url)
 
 
 			case '/':
 			case '/':
 				if (dupl_string(&id->host, begin, url->s + i) < 0) goto err;
 				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;
 				return 0;
 			}
 			}
 			break;
 			break;
@@ -202,7 +226,7 @@ static int parse_db_url(struct db_id* id, const str* url)
 			switch(url->s[i]) {
 			switch(url->s[i]) {
 			case '/':
 			case '/':
 				id->port = str2s(begin, url->s + i - begin, 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;
 				return 0;
 			}
 			}
 			break;
 			break;