You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			77 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
| 
											5 months ago
										 | package gokb | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"fmt" | ||
|  | 	"net" | ||
|  | 	nurl "net/url" | ||
|  | 	"sort" | ||
|  | 	"strings" | ||
|  | ) | ||
|  | 
 | ||
|  | // ParseURL no longer needs to be used by clients of this library since supplying a URL as a
 | ||
|  | // connection string to sql.Open() is now supported:
 | ||
|  | //
 | ||
|  | //	sql.Open("kingbase", "kingbase://bob:secret@1.2.3.4:54321/mydb?sslmode=verify-full")
 | ||
|  | //
 | ||
|  | // It remains exported here for backwards-compatibility.
 | ||
|  | //
 | ||
|  | // ParseURL converts a url to a connection string for driver.Open.
 | ||
|  | // Example:
 | ||
|  | //
 | ||
|  | //	"kingbase://bob:secret@1.2.3.4:54321/mydb?sslmode=verify-full"
 | ||
|  | //
 | ||
|  | // converts to:
 | ||
|  | //
 | ||
|  | //	"user=bob password=secret host=1.2.3.4 port=54321 dbname=mydb sslmode=verify-full"
 | ||
|  | //
 | ||
|  | // A minimal example:
 | ||
|  | //
 | ||
|  | //	"kingbase://"
 | ||
|  | //
 | ||
|  | // This will be blank, causing driver.Open to use all of the defaults
 | ||
|  | func ParseURL(url string) (string, error) { | ||
|  | 	u, err := nurl.Parse(url) | ||
|  | 	if err != nil { | ||
|  | 		return "", err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if u.Scheme != "kingbase" && u.Scheme != "kingbase" { | ||
|  | 		return "", fmt.Errorf("invalid connection protocol: %s", u.Scheme) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var kvs []string | ||
|  | 	escaper := strings.NewReplacer(` `, `\ `, `'`, `\'`, `\`, `\\`) | ||
|  | 	accrue := func(k, v string) { | ||
|  | 		if v != "" { | ||
|  | 			kvs = append(kvs, k+"="+escaper.Replace(v)) | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if u.User != nil { | ||
|  | 		v := u.User.Username() | ||
|  | 		accrue("user", v) | ||
|  | 
 | ||
|  | 		v, _ = u.User.Password() | ||
|  | 		accrue("password", v) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if host, port, err := net.SplitHostPort(u.Host); err != nil { | ||
|  | 		accrue("host", u.Host) | ||
|  | 	} else { | ||
|  | 		accrue("host", host) | ||
|  | 		accrue("port", port) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if u.Path != "" { | ||
|  | 		accrue("dbname", u.Path[1:]) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	q := u.Query() | ||
|  | 	for k := range q { | ||
|  | 		accrue(k, q.Get(k)) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	sort.Strings(kvs) // Makes testing easier (not a performance concern)
 | ||
|  | 	return strings.Join(kvs, " "), nil | ||
|  | } |