Skip to content

Commit

Permalink
Modify Target so 'host' can be used to configure 'sockdir'
Browse files Browse the repository at this point in the history
Mtest relies on this.
  • Loading branch information
joerivanruth committed Apr 22, 2024
1 parent d31b201 commit 3454cb1
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 9 deletions.
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
28 changes: 22 additions & 6 deletions pymonetdb/target.py
Original file line number Diff line number Diff line change
Expand Up @@ -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',
])
Expand All @@ -55,7 +56,7 @@ def looks_like_url(text: str) -> bool:
tableschema="",
table="",
sock="",
sockdir="/tmp",
sockdir="",
sockprefix=".s.monetdb.",
cert="",
certhash="",
Expand Down Expand Up @@ -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):
Expand Down
69 changes: 66 additions & 3 deletions tests/tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 3454cb1

Please sign in to comment.