Skip to content

Commit b4ab23e

Browse files
authored
Merge pull request #255 from yh-0/RDBC-954
RDBC-954 Python client: fix Connection String R/W Bugs (OLAP + AI)
2 parents 605882a + 2d9222c commit b4ab23e

File tree

5 files changed

+92
-5
lines changed

5 files changed

+92
-5
lines changed

ravendb/documents/operations/ai/ai_connection_string.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class AiModelType(enum.Enum):
1717
CHAT = "Chat"
1818

1919

20-
class AiConnectionString(ConnectionString): # todo kuba
20+
class AiConnectionString(ConnectionString):
2121
def __init__(
2222
self,
2323
name: str,

ravendb/documents/operations/backups/settings.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,20 @@ def __init__(
6868
def from_json(cls, json_dict: Dict[str, Any]) -> LocalSettings:
6969
return cls(
7070
json_dict["Disabled"],
71-
GetBackupConfigurationScript.from_json(json_dict["GetBackupConfigurationScript"]),
71+
(
72+
GetBackupConfigurationScript.from_json(json_dict["GetBackupConfigurationScript"])
73+
if json_dict["GetBackupConfigurationScript"]
74+
else None
75+
),
7276
json_dict["FolderPath"],
7377
)
7478

7579
def to_json(self) -> Dict[str, Any]:
7680
return {
7781
"Disabled": self.disabled,
78-
"GetBackupConfigurationScript": self.get_backup_configuration_script.to_json(),
82+
"GetBackupConfigurationScript": (
83+
self.get_backup_configuration_script.to_json() if self.get_backup_configuration_script else None
84+
),
7985
"FolderPath": self.folder_path,
8086
}
8187

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import json
2+
import urllib
3+
from typing import Dict
4+
5+
import requests
6+
7+
from ravendb import RavenCommand, RaftCommand, ServerNode
8+
from ravendb.documents.operations.definitions import MaintenanceOperation
9+
from ravendb.util.util import RaftIdGenerator
10+
from ravendb.serverwide.server_operation_executor import ConnectionStringType
11+
12+
13+
class RemoveConnectionStringByNameResult:
14+
def __init__(self, raft_command_index: int = None):
15+
self.raft_command_index = raft_command_index
16+
17+
def to_json(self) -> Dict:
18+
return {"RaftCommandIndex": self.raft_command_index}
19+
20+
@classmethod
21+
def from_json(cls, json_dict: Dict) -> "RemoveConnectionStringResult":
22+
return cls(json_dict["RaftCommandIndex"])
23+
24+
25+
class RemoveConnectionStringByNameOperation(MaintenanceOperation[RemoveConnectionStringByNameResult]):
26+
def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType):
27+
self._connection_string_name = connection_string_name
28+
self._connection_string_type = connection_string_type
29+
30+
def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[RemoveConnectionStringResult]":
31+
return self.RemoveConnectionStringCommand(self._connection_string_name, self._connection_string_type)
32+
33+
class RemoveConnectionStringCommand(RavenCommand[RemoveConnectionStringByNameResult], RaftCommand):
34+
def __init__(self, connection_string_name: str, connection_string_type: ConnectionStringType):
35+
super().__init__(RemoveConnectionStringByNameResult)
36+
self._connection_string_name = connection_string_name
37+
self._connection_string_type = connection_string_type
38+
39+
def is_read_request(self) -> bool:
40+
return False
41+
42+
def create_request(self, node: ServerNode) -> requests.Request:
43+
url = f"{node.url}/databases/{node.database}/admin/connection-strings?connectionString={urllib.parse.quote(self._connection_string_name)}&type={self._connection_string_type.value}"
44+
45+
request = requests.Request("DELETE")
46+
request.url = url
47+
48+
return request
49+
50+
def set_response(self, response: str, from_cache: bool) -> None:
51+
if response is None:
52+
self._throw_invalid_response()
53+
54+
self.result = RemoveConnectionStringByNameResult.from_json(json.loads(response))
55+
56+
def get_raft_unique_request_id(self) -> str:
57+
return RaftIdGenerator.new_id()

ravendb/documents/operations/connection_string/remove_connection_string_operation.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from ravendb import RavenCommand, RaftCommand, ConnectionString, ServerNode
88
from ravendb.documents.operations.definitions import MaintenanceOperation
99
from ravendb.util.util import RaftIdGenerator
10+
from ravendb.serverwide.server_operation_executor import ConnectionStringType
1011

1112

1213
class RemoveConnectionStringResult:
@@ -17,15 +18,15 @@ def to_json(self) -> Dict:
1718
return {"RaftCommandIndex": self.raft_command_index}
1819

1920
@classmethod
20-
def from_json(cls, json_dict: Dict) -> "PutConnectionStringResult":
21+
def from_json(cls, json_dict: Dict) -> "RemoveConnectionStringResult":
2122
return cls(json_dict["RaftCommandIndex"])
2223

2324

2425
class RemoveConnectionStringOperation(MaintenanceOperation[RemoveConnectionStringResult]):
2526
def __init__(self, connection_string: ConnectionString = None):
2627
self._connection_string = connection_string
2728

28-
def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[_T]":
29+
def get_command(self, conventions: "DocumentConventions") -> "RavenCommand[RemoveConnectionStringResult]":
2930
return self.RemoveConnectionStringCommand(self._connection_string)
3031

3132
class RemoveConnectionStringCommand(RavenCommand[RemoveConnectionStringResult], RaftCommand):

ravendb/tests/jvm_migrated_tests/client_tests/documents_tests/operations_tests/test_connection_string.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
from ravendb.documents.operations.connection_string.put_connection_string_operation import (
1919
PutConnectionStringOperation,
2020
)
21+
from ravendb.documents.operations.connection_string.remove_connection_string_by_name_operation import (
22+
RemoveConnectionStringByNameOperation,
23+
)
2124
from ravendb.documents.operations.connection_string.remove_connection_string_operation import (
2225
RemoveConnectionStringOperation,
2326
)
@@ -1024,3 +1027,23 @@ def test_all_possible_fields_for_each_connection_string_type(self):
10241027
GetConnectionStringsOperation("snowflake_all_fields", ConnectionStringType.SNOWFLAKE)
10251028
)
10261029
self.assertIsNone(after_delete.snowflake_connection_strings)
1030+
1031+
def test_remove_connection_string_by_name_operation(self):
1032+
raven_connection_string = RavenConnectionString("raven1", self.store.database, self.store.urls)
1033+
1034+
put_result = self.store.maintenance.send(PutConnectionStringOperation(raven_connection_string))
1035+
self.assertGreater(put_result.raft_command_index, 0)
1036+
1037+
raven_get_result = self.store.maintenance.send(
1038+
GetConnectionStringsOperation("raven1", ConnectionStringType.RAVEN)
1039+
)
1040+
self.assertIn("raven1", raven_get_result.raven_connection_strings)
1041+
self.assertEqual(1, len(raven_get_result.raven_connection_strings))
1042+
1043+
remove_result = self.store.maintenance.send(
1044+
RemoveConnectionStringByNameOperation("raven1", ConnectionStringType.RAVEN)
1045+
)
1046+
self.assertGreater(remove_result.raft_command_index, 0)
1047+
1048+
after_delete = self.store.maintenance.send(GetConnectionStringsOperation("raven1", ConnectionStringType.RAVEN))
1049+
self.assertIsNone(after_delete.raven_connection_strings)

0 commit comments

Comments
 (0)