diff --git a/CHANGES.md b/CHANGES.md index 2e37ed3d..71941c3d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # unreleased +changes since 1.8.0 + +* Restore behavior where 'sockdir' can be changed by setting 'host' + to something that starts with a slash. Mtest.py relies on this. + # 1.8.0 diff --git a/pymonetdb/target.py b/pymonetdb/target.py index 51cc044c..19c09b01 100644 --- a/pymonetdb/target.py +++ b/pymonetdb/target.py @@ -33,7 +33,8 @@ def looks_like_url(text: str) -> bool: ) IGNORED = set(['hash', 'debug', 'logfile']) VIRTUAL = set([ - 'connect_scan', 'connect_unix', 'connect_tcp', 'connect_port', + 'connect_scan', 'connect_sockdir', + 'connect_unix', 'connect_tcp', 'connect_port', 'connect_tls_verify', 'connect_certhash_digits', 'connect_binary', 'connect_clientkey', 'connect_clientcert', ]) @@ -55,7 +56,7 @@ def looks_like_url(text: str) -> bool: tableschema="", table="", sock="", - sockdir="/tmp", + sockdir="", sockprefix=".s.monetdb.", cert="", certhash="", @@ -427,27 +428,42 @@ def validate(self): # noqa C901 def connect_scan(self): if not self.database: return False - if self.sock or self.host or self.port != -1: + if self.sock: + return False + if self.host and not self.host.startswith('/'): + return False + if self.port != -1: return False if self.tls: return False return True + @property + def connect_sockdir(self): + if self.sockdir: + return self.sockdir + elif self.host and self.host.startswith('/'): + return self.host + else: + return "/tmp" + @property def connect_unix(self): if self.sock: return self.sock if self.tls: return "" - if self.host == "": - return f"{self.sockdir}/{self.sockprefix}{self.connect_port}" + if self.host == "" or self.host.startswith('/'): + return f"{self.connect_sockdir}/{self.sockprefix}{self.connect_port}" return "" @property def connect_tcp(self): if self.sock: return "" - return self.host or "localhost" + if self.host and not self.host.startswith('/'): + return self.host + return "localhost" @property def connect_port(self): diff --git a/tests/tests.md b/tests/tests.md index d4ac652a..edf34bc9 100644 --- a/tests/tests.md +++ b/tests/tests.md @@ -291,9 +291,11 @@ EXPECT sock=C:\TEMP\sock ### sockdir ```test -EXPECT sockdir=/tmp +EXPECT sockdir= +EXPECT connect_sockdir=/tmp ACCEPT monetdb:///demo?sockdir=/tmp/nonstandard EXPECT sockdir=/tmp/nonstandard +EXPECT connect_sockdir=/tmp/nonstandard EXPECT connect_unix=/tmp/nonstandard/.s.monetdb.50000 ``` @@ -1193,22 +1195,83 @@ EXPECT connect_tcp=not.localhost REJECT monetdbs://not.localhost/?sock=/a/path ``` -### sock and sockdir +### sock, sockdir and host Sockdir only applies to implicit Unix domain sockets, not to ones that are given explicitly ```test -EXPECT sockdir=/tmp +EXPECT connect_sockdir=/tmp EXPECT port=-1 EXPECT host= EXPECT connect_unix=/tmp/.s.monetdb.50000 SET sockdir=/somewhere/else +EXPECT connect_sockdir=/somewhere/else EXPECT connect_unix=/somewhere/else/.s.monetdb.50000 SET port=12345 EXPECT connect_unix=/somewhere/else/.s.monetdb.12345 ``` +Mtest.py and maybe other software expects to be able to set **sockdir** by passing a path +in **host**. + +```test +EXPECT connect_sockdir=/tmp +SET host=banana +EXPECT connect_sockdir=/tmp +SET host=/somewhere/else +EXPECT connect_sockdir=/somewhere/else +EXPECT connect_tcp=localhost +``` + +Setting **sockdir** takes precedence over **host**. + +```test +EXPECT connect_sockdir=/tmp +SET sockdir=/xyz +EXPECT connect_sockdir=/xyz +SET host=banana +EXPECT connect_sockdir=/xyz +SET host=/somewhere/else +EXPECT connect_sockdir=/xyz +EXPECT connect_unix=/xyz/.s.monetdb.50000 +``` + +**connect_tcp** behaves as if **host** is empty. + +```test +SET host=/somewhere/else +EXPECT connect_unix=/somewhere/else/.s.monetdb.50000 +EXPECT connect_tcp=localhost +``` + +```test +SET host=/somewhere/else +SET sock=/tmp/foo.sock +EXPECT valid=false +``` + +*connect_scan** behavior does not change when setting **sockdir** through **host**. + +```test +EXPECT database= +EXPECT connect_scan=off +EXPECT connect_tcp=localhost +SET host=/somewhere/else +EXPECT connect_scan=off +EXPECT connect_tcp=localhost +``` + +```test +SET database=demo +EXPECT connect_scan=on +EXPECT connect_tcp=localhost +SET host=/somewhere/else +EXPECT connect_scan=on +EXPECT connect_tcp=localhost +``` + + ## Legacy URL's ```test