valkey-glide 2.2.1rc1__cp313-cp313-macosx_10_7_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of valkey-glide might be problematic. Click here for more details.
- glide/__init__.py +388 -0
- glide/async_commands/__init__.py +5 -0
- glide/async_commands/cluster_commands.py +1476 -0
- glide/async_commands/core.py +7818 -0
- glide/async_commands/ft.py +465 -0
- glide/async_commands/glide_json.py +1269 -0
- glide/async_commands/standalone_commands.py +1001 -0
- glide/glide.cpython-313-darwin.so +0 -0
- glide/glide.pyi +61 -0
- glide/glide_client.py +821 -0
- glide/logger.py +97 -0
- glide/opentelemetry.py +185 -0
- glide/py.typed +0 -0
- glide_shared/__init__.py +330 -0
- glide_shared/commands/__init__.py +0 -0
- glide_shared/commands/batch.py +5997 -0
- glide_shared/commands/batch_options.py +261 -0
- glide_shared/commands/bitmap.py +320 -0
- glide_shared/commands/command_args.py +103 -0
- glide_shared/commands/core_options.py +407 -0
- glide_shared/commands/server_modules/ft_options/ft_aggregate_options.py +300 -0
- glide_shared/commands/server_modules/ft_options/ft_constants.py +84 -0
- glide_shared/commands/server_modules/ft_options/ft_create_options.py +423 -0
- glide_shared/commands/server_modules/ft_options/ft_profile_options.py +113 -0
- glide_shared/commands/server_modules/ft_options/ft_search_options.py +139 -0
- glide_shared/commands/server_modules/json_batch.py +820 -0
- glide_shared/commands/server_modules/json_options.py +93 -0
- glide_shared/commands/sorted_set.py +412 -0
- glide_shared/commands/stream.py +449 -0
- glide_shared/config.py +975 -0
- glide_shared/constants.py +124 -0
- glide_shared/exceptions.py +88 -0
- glide_shared/protobuf/command_request_pb2.py +56 -0
- glide_shared/protobuf/connection_request_pb2.py +56 -0
- glide_shared/protobuf/response_pb2.py +32 -0
- glide_shared/protobuf_codec.py +110 -0
- glide_shared/routes.py +161 -0
- valkey_glide-2.2.1rc1.dist-info/METADATA +210 -0
- valkey_glide-2.2.1rc1.dist-info/RECORD +40 -0
- valkey_glide-2.2.1rc1.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
from typing import Any, Dict, List, Literal, Mapping, Optional, Set, TypeVar, Union
|
|
4
|
+
|
|
5
|
+
from glide_shared.protobuf.command_request_pb2 import CommandRequest
|
|
6
|
+
from glide_shared.protobuf.connection_request_pb2 import ConnectionRequest
|
|
7
|
+
from glide_shared.routes import ByAddressRoute, RandomNode, SlotIdRoute, SlotKeyRoute
|
|
8
|
+
|
|
9
|
+
OK: str = "OK"
|
|
10
|
+
DEFAULT_READ_BYTES_SIZE: int = pow(2, 16)
|
|
11
|
+
# Typing
|
|
12
|
+
T = TypeVar("T")
|
|
13
|
+
TOK = Literal["OK"]
|
|
14
|
+
TResult = Union[
|
|
15
|
+
TOK,
|
|
16
|
+
str,
|
|
17
|
+
List[List[str]],
|
|
18
|
+
int,
|
|
19
|
+
None,
|
|
20
|
+
Dict[str, T],
|
|
21
|
+
Mapping[str, "TResult"],
|
|
22
|
+
float,
|
|
23
|
+
Set[T],
|
|
24
|
+
List[T],
|
|
25
|
+
bytes,
|
|
26
|
+
Dict[bytes, "TResult"],
|
|
27
|
+
Mapping[bytes, "TResult"],
|
|
28
|
+
]
|
|
29
|
+
TRequest = Union[CommandRequest, ConnectionRequest]
|
|
30
|
+
# When routing to a single node, response will be T
|
|
31
|
+
# Otherwise, response will be : {Address : response , ... } with type of Dict[str, T].
|
|
32
|
+
TClusterResponse = Union[T, Dict[bytes, T]]
|
|
33
|
+
TSingleNodeRoute = Union[RandomNode, SlotKeyRoute, SlotIdRoute, ByAddressRoute]
|
|
34
|
+
# When specifying legacy path (path doesn't start with `$`), response will be T
|
|
35
|
+
# Otherwise, (when specifying JSONPath), response will be List[Optional[T]].
|
|
36
|
+
#
|
|
37
|
+
# TJsonResponse is designed to handle scenarios where some paths may not contain valid values, especially with JSONPath
|
|
38
|
+
# targeting multiple paths.
|
|
39
|
+
# In such cases, the response may include None values, represented as `Optional[T]` in the list.
|
|
40
|
+
# This type provides flexibility for commands where a subset of the paths may return None.
|
|
41
|
+
#
|
|
42
|
+
# For more information, see: https://redis.io/docs/data-types/json/path/ .
|
|
43
|
+
TJsonResponse = Union[T, List[Optional[T]]]
|
|
44
|
+
|
|
45
|
+
# When specifying legacy path (path doesn't start with `$`), response will be T
|
|
46
|
+
# Otherwise, (when specifying JSONPath), response will be List[T].
|
|
47
|
+
# This type represents the response format for commands that apply to every path and every type in a JSON document.
|
|
48
|
+
# It covers both singular and multiple paths, ensuring that the command returns valid results for each matched path
|
|
49
|
+
# without None values.
|
|
50
|
+
#
|
|
51
|
+
# TJsonUniversalResponse is considered "universal" because it applies to every matched path and
|
|
52
|
+
# guarantees valid, non-null results across all paths, covering both singular and multiple paths.
|
|
53
|
+
# This type is used for commands that return results from all matched paths, ensuring that each
|
|
54
|
+
# path contains meaningful values without None entries (unless it's part of the commands response).
|
|
55
|
+
# It is typically used in scenarios where each target is expected to yield a valid response. For commands that are valid
|
|
56
|
+
# for all target types.
|
|
57
|
+
#
|
|
58
|
+
# For more information, see: https://redis.io/docs/data-types/json/path/ .
|
|
59
|
+
TJsonUniversalResponse = Union[T, List[T]]
|
|
60
|
+
TEncodable = Union[str, bytes]
|
|
61
|
+
TFunctionListResponse = List[
|
|
62
|
+
Mapping[
|
|
63
|
+
bytes,
|
|
64
|
+
Union[bytes, List[Mapping[bytes, Union[bytes, Set[bytes]]]]],
|
|
65
|
+
]
|
|
66
|
+
]
|
|
67
|
+
# Response for function stats command on a single node.
|
|
68
|
+
# The response holds a map with 2 keys: Current running function / script and information about it, and the engines and
|
|
69
|
+
# the information about it.
|
|
70
|
+
TFunctionStatsSingleNodeResponse = Mapping[
|
|
71
|
+
bytes,
|
|
72
|
+
Union[
|
|
73
|
+
None,
|
|
74
|
+
Mapping[
|
|
75
|
+
bytes,
|
|
76
|
+
Union[Mapping[bytes, Mapping[bytes, int]], bytes, int, List[bytes]],
|
|
77
|
+
],
|
|
78
|
+
],
|
|
79
|
+
]
|
|
80
|
+
# Full response for function stats command across multiple nodes.
|
|
81
|
+
# It maps node address to the per-node response.
|
|
82
|
+
TFunctionStatsFullResponse = Mapping[
|
|
83
|
+
bytes,
|
|
84
|
+
TFunctionStatsSingleNodeResponse,
|
|
85
|
+
]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
TXInfoStreamResponse = Mapping[
|
|
89
|
+
bytes, Union[bytes, int, Mapping[bytes, Optional[List[List[bytes]]]]]
|
|
90
|
+
]
|
|
91
|
+
TXInfoStreamFullResponse = Mapping[
|
|
92
|
+
bytes,
|
|
93
|
+
Union[
|
|
94
|
+
bytes,
|
|
95
|
+
int,
|
|
96
|
+
Mapping[bytes, List[List[bytes]]],
|
|
97
|
+
List[Mapping[bytes, Union[bytes, int, List[List[Union[bytes, int]]]]]],
|
|
98
|
+
],
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
FtInfoResponse = Mapping[
|
|
102
|
+
TEncodable,
|
|
103
|
+
Union[
|
|
104
|
+
TEncodable,
|
|
105
|
+
int,
|
|
106
|
+
List[TEncodable],
|
|
107
|
+
List[
|
|
108
|
+
Mapping[
|
|
109
|
+
TEncodable,
|
|
110
|
+
Union[TEncodable, Mapping[TEncodable, Union[TEncodable, int]]],
|
|
111
|
+
]
|
|
112
|
+
],
|
|
113
|
+
],
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
FtSearchResponse = List[
|
|
117
|
+
Union[int, Mapping[TEncodable, Mapping[TEncodable, TEncodable]]]
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
FtAggregateResponse = List[Mapping[TEncodable, Any]]
|
|
121
|
+
|
|
122
|
+
FtProfileResponse = List[
|
|
123
|
+
Union[FtSearchResponse, FtAggregateResponse, Mapping[str, int]]
|
|
124
|
+
]
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Type
|
|
4
|
+
|
|
5
|
+
from glide_shared.protobuf.response_pb2 import RequestErrorType
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class GlideError(Exception):
|
|
9
|
+
"""
|
|
10
|
+
Base class for errors.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, message: Optional[str] = None):
|
|
14
|
+
super().__init__(message or "No error message provided")
|
|
15
|
+
|
|
16
|
+
def name(self):
|
|
17
|
+
return self.__class__.__name__
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ClosingError(GlideError):
|
|
21
|
+
"""
|
|
22
|
+
Errors that report that the client has closed and is no longer usable.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RequestError(GlideError):
|
|
29
|
+
"""
|
|
30
|
+
Errors that were reported during a request.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class TimeoutError(RequestError):
|
|
37
|
+
"""
|
|
38
|
+
Errors that are thrown when a request times out.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ExecAbortError(RequestError):
|
|
45
|
+
"""
|
|
46
|
+
Errors that are thrown when a transaction is aborted.
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ConnectionError(RequestError):
|
|
53
|
+
"""
|
|
54
|
+
Errors that are thrown when a connection disconnects.
|
|
55
|
+
These errors can be temporary, as the client will attempt to reconnect.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class ConfigurationError(RequestError):
|
|
62
|
+
"""
|
|
63
|
+
Errors that are thrown when a request cannot be completed in current configuration settings.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
pass
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class LoggerError(GlideError):
|
|
70
|
+
"""
|
|
71
|
+
Errors that are thrown when the logger has an error initializing.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def get_request_error_class(
|
|
78
|
+
error_type: Optional[RequestErrorType.ValueType],
|
|
79
|
+
) -> Type[RequestError]:
|
|
80
|
+
if error_type == RequestErrorType.Disconnect:
|
|
81
|
+
return ConnectionError
|
|
82
|
+
if error_type == RequestErrorType.ExecAbort:
|
|
83
|
+
return ExecAbortError
|
|
84
|
+
if error_type == RequestErrorType.Timeout:
|
|
85
|
+
return TimeoutError
|
|
86
|
+
if error_type == RequestErrorType.Unspecified:
|
|
87
|
+
return RequestError
|
|
88
|
+
return RequestError
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: protobuf/command_request.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.1
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1eprotobuf/command_request.proto\x12\x0f\x63ommand_request\"M\n\x0bSlotIdRoute\x12-\n\tslot_type\x18\x01 \x01(\x0e\x32\x1a.command_request.SlotTypes\x12\x0f\n\x07slot_id\x18\x02 \x01(\x05\"O\n\x0cSlotKeyRoute\x12-\n\tslot_type\x18\x01 \x01(\x0e\x32\x1a.command_request.SlotTypes\x12\x10\n\x08slot_key\x18\x02 \x01(\t\",\n\x0e\x42yAddressRoute\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\x05\"\xf6\x01\n\x06Routes\x12\x36\n\rsimple_routes\x18\x01 \x01(\x0e\x32\x1d.command_request.SimpleRoutesH\x00\x12\x37\n\x0eslot_key_route\x18\x02 \x01(\x0b\x32\x1d.command_request.SlotKeyRouteH\x00\x12\x35\n\rslot_id_route\x18\x03 \x01(\x0b\x32\x1c.command_request.SlotIdRouteH\x00\x12;\n\x10\x62y_address_route\x18\x04 \x01(\x0b\x32\x1f.command_request.ByAddressRouteH\x00\x42\x07\n\x05value\"\xb6\x01\n\x07\x43ommand\x12\x32\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x1c.command_request.RequestType\x12\x38\n\nargs_array\x18\x02 \x01(\x0b\x32\".command_request.Command.ArgsArrayH\x00\x12\x1a\n\x10\x61rgs_vec_pointer\x18\x03 \x01(\x04H\x00\x1a\x19\n\tArgsArray\x12\x0c\n\x04\x61rgs\x18\x01 \x03(\x0c\x42\x06\n\x04\x61rgs\"\x80\x01\n\x18ScriptInvocationPointers\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x19\n\x0ckeys_pointer\x18\x02 \x01(\x04H\x00\x88\x01\x01\x12\x19\n\x0c\x61rgs_pointer\x18\x03 \x01(\x04H\x01\x88\x01\x01\x42\x0f\n\r_keys_pointerB\x0f\n\r_args_pointer\"<\n\x10ScriptInvocation\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\x0c\x12\x0c\n\x04\x61rgs\x18\x03 \x03(\x0c\"\x90\x02\n\x05\x42\x61tch\x12\x11\n\tis_atomic\x18\x01 \x01(\x08\x12*\n\x08\x63ommands\x18\x02 \x03(\x0b\x32\x18.command_request.Command\x12\x1b\n\x0eraise_on_error\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12\x14\n\x07timeout\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1f\n\x12retry_server_error\x18\x05 \x01(\x08H\x02\x88\x01\x01\x12#\n\x16retry_connection_error\x18\x06 \x01(\x08H\x03\x88\x01\x01\x42\x11\n\x0f_raise_on_errorB\n\n\x08_timeoutB\x15\n\x13_retry_server_errorB\x19\n\x17_retry_connection_error\"\xb4\x01\n\x0b\x43lusterScan\x12\x0e\n\x06\x63ursor\x18\x01 \x01(\t\x12\x1a\n\rmatch_pattern\x18\x02 \x01(\x0cH\x00\x88\x01\x01\x12\x12\n\x05\x63ount\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x18\n\x0bobject_type\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x1f\n\x17\x61llow_non_covered_slots\x18\x05 \x01(\x08\x42\x10\n\x0e_match_patternB\x08\n\x06_countB\x0e\n\x0c_object_type\"V\n\x18UpdateConnectionPassword\x12\x15\n\x08password\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x16\n\x0eimmediate_auth\x18\x02 \x01(\x08\x42\x0b\n\t_password\"\x11\n\x0fRefreshIamToken\"\xbb\x04\n\x0e\x43ommandRequest\x12\x14\n\x0c\x63\x61llback_idx\x18\x01 \x01(\r\x12\x32\n\x0esingle_command\x18\x02 \x01(\x0b\x32\x18.command_request.CommandH\x00\x12\'\n\x05\x62\x61tch\x18\x03 \x01(\x0b\x32\x16.command_request.BatchH\x00\x12>\n\x11script_invocation\x18\x04 \x01(\x0b\x32!.command_request.ScriptInvocationH\x00\x12O\n\x1ascript_invocation_pointers\x18\x05 \x01(\x0b\x32).command_request.ScriptInvocationPointersH\x00\x12\x34\n\x0c\x63luster_scan\x18\x06 \x01(\x0b\x32\x1c.command_request.ClusterScanH\x00\x12O\n\x1aupdate_connection_password\x18\x07 \x01(\x0b\x32).command_request.UpdateConnectionPasswordH\x00\x12=\n\x11refresh_iam_token\x18\x08 \x01(\x0b\x32 .command_request.RefreshIamTokenH\x00\x12&\n\x05route\x18\t \x01(\x0b\x32\x17.command_request.Routes\x12\x1a\n\rroot_span_ptr\x18\n \x01(\x04H\x01\x88\x01\x01\x42\t\n\x07\x63ommandB\x10\n\x0e_root_span_ptr*:\n\x0cSimpleRoutes\x12\x0c\n\x08\x41llNodes\x10\x00\x12\x10\n\x0c\x41llPrimaries\x10\x01\x12\n\n\x06Random\x10\x02*%\n\tSlotTypes\x12\x0b\n\x07Primary\x10\x00\x12\x0b\n\x07Replica\x10\x01*\xea\x30\n\x0bRequestType\x12\x12\n\x0eInvalidRequest\x10\x00\x12\x11\n\rCustomCommand\x10\x01\x12\x0c\n\x08\x42itCount\x10\x65\x12\x0c\n\x08\x42itField\x10\x66\x12\x14\n\x10\x42itFieldReadOnly\x10g\x12\t\n\x05\x42itOp\x10h\x12\n\n\x06\x42itPos\x10i\x12\n\n\x06GetBit\x10j\x12\n\n\x06SetBit\x10k\x12\x0b\n\x06\x41sking\x10\xc9\x01\x12\x14\n\x0f\x43lusterAddSlots\x10\xca\x01\x12\x19\n\x14\x43lusterAddSlotsRange\x10\xcb\x01\x12\x15\n\x10\x43lusterBumpEpoch\x10\xcc\x01\x12\x1f\n\x1a\x43lusterCountFailureReports\x10\xcd\x01\x12\x1b\n\x16\x43lusterCountKeysInSlot\x10\xce\x01\x12\x14\n\x0f\x43lusterDelSlots\x10\xcf\x01\x12\x19\n\x14\x43lusterDelSlotsRange\x10\xd0\x01\x12\x14\n\x0f\x43lusterFailover\x10\xd1\x01\x12\x16\n\x11\x43lusterFlushSlots\x10\xd2\x01\x12\x12\n\rClusterForget\x10\xd3\x01\x12\x19\n\x14\x43lusterGetKeysInSlot\x10\xd4\x01\x12\x10\n\x0b\x43lusterInfo\x10\xd5\x01\x12\x13\n\x0e\x43lusterKeySlot\x10\xd6\x01\x12\x11\n\x0c\x43lusterLinks\x10\xd7\x01\x12\x10\n\x0b\x43lusterMeet\x10\xd8\x01\x12\x10\n\x0b\x43lusterMyId\x10\xd9\x01\x12\x15\n\x10\x43lusterMyShardId\x10\xda\x01\x12\x11\n\x0c\x43lusterNodes\x10\xdb\x01\x12\x14\n\x0f\x43lusterReplicas\x10\xdc\x01\x12\x15\n\x10\x43lusterReplicate\x10\xdd\x01\x12\x11\n\x0c\x43lusterReset\x10\xde\x01\x12\x16\n\x11\x43lusterSaveConfig\x10\xdf\x01\x12\x1a\n\x15\x43lusterSetConfigEpoch\x10\xe0\x01\x12\x13\n\x0e\x43lusterSetslot\x10\xe1\x01\x12\x12\n\rClusterShards\x10\xe2\x01\x12\x12\n\rClusterSlaves\x10\xe3\x01\x12\x11\n\x0c\x43lusterSlots\x10\xe4\x01\x12\r\n\x08ReadOnly\x10\xe5\x01\x12\x0e\n\tReadWrite\x10\xe6\x01\x12\t\n\x04\x41uth\x10\xad\x02\x12\x12\n\rClientCaching\x10\xae\x02\x12\x12\n\rClientGetName\x10\xaf\x02\x12\x13\n\x0e\x43lientGetRedir\x10\xb0\x02\x12\r\n\x08\x43lientId\x10\xb1\x02\x12\x0f\n\nClientInfo\x10\xb2\x02\x12\x15\n\x10\x43lientKillSimple\x10\xb3\x02\x12\x0f\n\nClientKill\x10\xb4\x02\x12\x0f\n\nClientList\x10\xb5\x02\x12\x12\n\rClientNoEvict\x10\xb6\x02\x12\x12\n\rClientNoTouch\x10\xb7\x02\x12\x10\n\x0b\x43lientPause\x10\xb8\x02\x12\x10\n\x0b\x43lientReply\x10\xb9\x02\x12\x12\n\rClientSetInfo\x10\xba\x02\x12\x12\n\rClientSetName\x10\xbb\x02\x12\x13\n\x0e\x43lientTracking\x10\xbc\x02\x12\x17\n\x12\x43lientTrackingInfo\x10\xbd\x02\x12\x12\n\rClientUnblock\x10\xbe\x02\x12\x12\n\rClientUnpause\x10\xbf\x02\x12\t\n\x04\x45\x63ho\x10\xc0\x02\x12\n\n\x05Hello\x10\xc1\x02\x12\t\n\x04Ping\x10\xc2\x02\x12\t\n\x04Quit\x10\xc3\x02\x12\n\n\x05Reset\x10\xc4\x02\x12\x0b\n\x06Select\x10\xc5\x02\x12\t\n\x04\x43opy\x10\x91\x03\x12\x08\n\x03\x44\x65l\x10\x92\x03\x12\t\n\x04\x44ump\x10\x93\x03\x12\x0b\n\x06\x45xists\x10\x94\x03\x12\x0b\n\x06\x45xpire\x10\x95\x03\x12\r\n\x08\x45xpireAt\x10\x96\x03\x12\x0f\n\nExpireTime\x10\x97\x03\x12\t\n\x04Keys\x10\x98\x03\x12\x0c\n\x07Migrate\x10\x99\x03\x12\t\n\x04Move\x10\x9a\x03\x12\x13\n\x0eObjectEncoding\x10\x9b\x03\x12\x0f\n\nObjectFreq\x10\x9c\x03\x12\x13\n\x0eObjectIdleTime\x10\x9d\x03\x12\x13\n\x0eObjectRefCount\x10\x9e\x03\x12\x0c\n\x07Persist\x10\x9f\x03\x12\x0c\n\x07PExpire\x10\xa0\x03\x12\x0e\n\tPExpireAt\x10\xa1\x03\x12\x10\n\x0bPExpireTime\x10\xa2\x03\x12\t\n\x04PTTL\x10\xa3\x03\x12\x0e\n\tRandomKey\x10\xa4\x03\x12\x0b\n\x06Rename\x10\xa5\x03\x12\r\n\x08RenameNX\x10\xa6\x03\x12\x0c\n\x07Restore\x10\xa7\x03\x12\t\n\x04Scan\x10\xa8\x03\x12\t\n\x04Sort\x10\xa9\x03\x12\x11\n\x0cSortReadOnly\x10\xaa\x03\x12\n\n\x05Touch\x10\xab\x03\x12\x08\n\x03TTL\x10\xac\x03\x12\t\n\x04Type\x10\xad\x03\x12\x0b\n\x06Unlink\x10\xae\x03\x12\t\n\x04Wait\x10\xaf\x03\x12\x0c\n\x07WaitAof\x10\xb0\x03\x12\x0b\n\x06GeoAdd\x10\xf5\x03\x12\x0c\n\x07GeoDist\x10\xf6\x03\x12\x0c\n\x07GeoHash\x10\xf7\x03\x12\x0b\n\x06GeoPos\x10\xf8\x03\x12\x0e\n\tGeoRadius\x10\xf9\x03\x12\x16\n\x11GeoRadiusReadOnly\x10\xfa\x03\x12\x16\n\x11GeoRadiusByMember\x10\xfb\x03\x12\x1e\n\x19GeoRadiusByMemberReadOnly\x10\xfc\x03\x12\x0e\n\tGeoSearch\x10\xfd\x03\x12\x13\n\x0eGeoSearchStore\x10\xfe\x03\x12\t\n\x04HDel\x10\xd9\x04\x12\x0c\n\x07HExists\x10\xda\x04\x12\t\n\x04HGet\x10\xdb\x04\x12\x0c\n\x07HGetAll\x10\xdc\x04\x12\x0c\n\x07HIncrBy\x10\xdd\x04\x12\x11\n\x0cHIncrByFloat\x10\xde\x04\x12\n\n\x05HKeys\x10\xdf\x04\x12\t\n\x04HLen\x10\xe0\x04\x12\n\n\x05HMGet\x10\xe1\x04\x12\n\n\x05HMSet\x10\xe2\x04\x12\x0f\n\nHRandField\x10\xe3\x04\x12\n\n\x05HScan\x10\xe4\x04\x12\t\n\x04HSet\x10\xe5\x04\x12\x0b\n\x06HSetNX\x10\xe6\x04\x12\x0c\n\x07HStrlen\x10\xe7\x04\x12\n\n\x05HVals\x10\xe8\x04\x12\x0b\n\x06HSetEx\x10\xe9\x04\x12\x0b\n\x06HGetEx\x10\xea\x04\x12\x0c\n\x07HExpire\x10\xeb\x04\x12\x0e\n\tHExpireAt\x10\xec\x04\x12\r\n\x08HPExpire\x10\xed\x04\x12\x0f\n\nHPExpireAt\x10\xee\x04\x12\r\n\x08HPersist\x10\xef\x04\x12\t\n\x04HTtl\x10\xf0\x04\x12\n\n\x05HPTtl\x10\xf1\x04\x12\x10\n\x0bHExpireTime\x10\xf2\x04\x12\x11\n\x0cHPExpireTime\x10\xf3\x04\x12\n\n\x05PfAdd\x10\xbd\x05\x12\x0c\n\x07PfCount\x10\xbe\x05\x12\x0c\n\x07PfMerge\x10\xbf\x05\x12\x0b\n\x06\x42LMove\x10\xa1\x06\x12\x0b\n\x06\x42LMPop\x10\xa2\x06\x12\n\n\x05\x42LPop\x10\xa3\x06\x12\n\n\x05\x42RPop\x10\xa4\x06\x12\x0f\n\nBRPopLPush\x10\xa5\x06\x12\x0b\n\x06LIndex\x10\xa6\x06\x12\x0c\n\x07LInsert\x10\xa7\x06\x12\t\n\x04LLen\x10\xa8\x06\x12\n\n\x05LMove\x10\xa9\x06\x12\n\n\x05LMPop\x10\xaa\x06\x12\t\n\x04LPop\x10\xab\x06\x12\t\n\x04LPos\x10\xac\x06\x12\n\n\x05LPush\x10\xad\x06\x12\x0b\n\x06LPushX\x10\xae\x06\x12\x0b\n\x06LRange\x10\xaf\x06\x12\t\n\x04LRem\x10\xb0\x06\x12\t\n\x04LSet\x10\xb1\x06\x12\n\n\x05LTrim\x10\xb2\x06\x12\t\n\x04RPop\x10\xb3\x06\x12\x0e\n\tRPopLPush\x10\xb4\x06\x12\n\n\x05RPush\x10\xb5\x06\x12\x0b\n\x06RPushX\x10\xb6\x06\x12\x0f\n\nPSubscribe\x10\x85\x07\x12\x0c\n\x07Publish\x10\x86\x07\x12\x13\n\x0ePubSubChannels\x10\x87\x07\x12\x11\n\x0cPubSubNumPat\x10\x88\x07\x12\x11\n\x0cPubSubNumSub\x10\x89\x07\x12\x18\n\x13PubSubShardChannels\x10\x8a\x07\x12\x16\n\x11PubSubShardNumSub\x10\x8b\x07\x12\x11\n\x0cPUnsubscribe\x10\x8c\x07\x12\r\n\x08SPublish\x10\x8d\x07\x12\x0f\n\nSSubscribe\x10\x8e\x07\x12\x0e\n\tSubscribe\x10\x8f\x07\x12\x11\n\x0cSUnsubscribe\x10\x90\x07\x12\x10\n\x0bUnsubscribe\x10\x91\x07\x12\t\n\x04\x45val\x10\xe9\x07\x12\x11\n\x0c\x45valReadOnly\x10\xea\x07\x12\x0c\n\x07\x45valSha\x10\xeb\x07\x12\x14\n\x0f\x45valShaReadOnly\x10\xec\x07\x12\n\n\x05\x46\x43\x61ll\x10\xed\x07\x12\x12\n\rFCallReadOnly\x10\xee\x07\x12\x13\n\x0e\x46unctionDelete\x10\xef\x07\x12\x11\n\x0c\x46unctionDump\x10\xf0\x07\x12\x12\n\rFunctionFlush\x10\xf1\x07\x12\x11\n\x0c\x46unctionKill\x10\xf2\x07\x12\x11\n\x0c\x46unctionList\x10\xf3\x07\x12\x11\n\x0c\x46unctionLoad\x10\xf4\x07\x12\x14\n\x0f\x46unctionRestore\x10\xf5\x07\x12\x12\n\rFunctionStats\x10\xf6\x07\x12\x10\n\x0bScriptDebug\x10\xf7\x07\x12\x11\n\x0cScriptExists\x10\xf8\x07\x12\x10\n\x0bScriptFlush\x10\xf9\x07\x12\x0f\n\nScriptKill\x10\xfa\x07\x12\x0f\n\nScriptLoad\x10\xfb\x07\x12\x0f\n\nScriptShow\x10\xfc\x07\x12\x0b\n\x06\x41\x63lCat\x10\xcd\x08\x12\x0f\n\nAclDelUser\x10\xce\x08\x12\x0e\n\tAclDryRun\x10\xcf\x08\x12\x0f\n\nAclGenPass\x10\xd0\x08\x12\x0f\n\nAclGetUser\x10\xd1\x08\x12\x0c\n\x07\x41\x63lList\x10\xd2\x08\x12\x0c\n\x07\x41\x63lLoad\x10\xd3\x08\x12\x0b\n\x06\x41\x63lLog\x10\xd4\x08\x12\x0c\n\x07\x41\x63lSave\x10\xd5\x08\x12\x0f\n\nAclSetSser\x10\xd6\x08\x12\r\n\x08\x41\x63lUsers\x10\xd7\x08\x12\x0e\n\tAclWhoami\x10\xd8\x08\x12\x11\n\x0c\x42gRewriteAof\x10\xd9\x08\x12\x0b\n\x06\x42gSave\x10\xda\x08\x12\r\n\x08\x43ommand_\x10\xdb\x08\x12\x11\n\x0c\x43ommandCount\x10\xdc\x08\x12\x10\n\x0b\x43ommandDocs\x10\xdd\x08\x12\x13\n\x0e\x43ommandGetKeys\x10\xde\x08\x12\x1b\n\x16\x43ommandGetKeysAndFlags\x10\xdf\x08\x12\x10\n\x0b\x43ommandInfo\x10\xe0\x08\x12\x10\n\x0b\x43ommandList\x10\xe1\x08\x12\x0e\n\tConfigGet\x10\xe2\x08\x12\x14\n\x0f\x43onfigResetStat\x10\xe3\x08\x12\x12\n\rConfigRewrite\x10\xe4\x08\x12\x0e\n\tConfigSet\x10\xe5\x08\x12\x0b\n\x06\x44\x42Size\x10\xe6\x08\x12\r\n\x08\x46\x61ilOver\x10\xe7\x08\x12\r\n\x08\x46lushAll\x10\xe8\x08\x12\x0c\n\x07\x46lushDB\x10\xe9\x08\x12\t\n\x04Info\x10\xea\x08\x12\r\n\x08LastSave\x10\xeb\x08\x12\x12\n\rLatencyDoctor\x10\xec\x08\x12\x11\n\x0cLatencyGraph\x10\xed\x08\x12\x15\n\x10LatencyHistogram\x10\xee\x08\x12\x13\n\x0eLatencyHistory\x10\xef\x08\x12\x12\n\rLatencyLatest\x10\xf0\x08\x12\x11\n\x0cLatencyReset\x10\xf1\x08\x12\x0b\n\x06Lolwut\x10\xf2\x08\x12\x11\n\x0cMemoryDoctor\x10\xf3\x08\x12\x16\n\x11MemoryMallocStats\x10\xf4\x08\x12\x10\n\x0bMemoryPurge\x10\xf5\x08\x12\x10\n\x0bMemoryStats\x10\xf6\x08\x12\x10\n\x0bMemoryUsage\x10\xf7\x08\x12\x0f\n\nModuleList\x10\xf8\x08\x12\x0f\n\nModuleLoad\x10\xf9\x08\x12\x11\n\x0cModuleLoadEx\x10\xfa\x08\x12\x11\n\x0cModuleUnload\x10\xfb\x08\x12\x0c\n\x07Monitor\x10\xfc\x08\x12\n\n\x05PSync\x10\xfd\x08\x12\r\n\x08ReplConf\x10\xfe\x08\x12\x0e\n\tReplicaOf\x10\xff\x08\x12\x12\n\rRestoreAsking\x10\x80\t\x12\t\n\x04Role\x10\x81\t\x12\t\n\x04Save\x10\x82\t\x12\r\n\x08ShutDown\x10\x83\t\x12\x0c\n\x07SlaveOf\x10\x84\t\x12\x0f\n\nSlowLogGet\x10\x85\t\x12\x0f\n\nSlowLogLen\x10\x86\t\x12\x11\n\x0cSlowLogReset\x10\x87\t\x12\x0b\n\x06SwapDb\x10\x88\t\x12\t\n\x04Sync\x10\x89\t\x12\t\n\x04Time\x10\x8a\t\x12\t\n\x04SAdd\x10\xb1\t\x12\n\n\x05SCard\x10\xb2\t\x12\n\n\x05SDiff\x10\xb3\t\x12\x0f\n\nSDiffStore\x10\xb4\t\x12\x0b\n\x06SInter\x10\xb5\t\x12\x0f\n\nSInterCard\x10\xb6\t\x12\x10\n\x0bSInterStore\x10\xb7\t\x12\x0e\n\tSIsMember\x10\xb8\t\x12\r\n\x08SMembers\x10\xb9\t\x12\x0f\n\nSMIsMember\x10\xba\t\x12\n\n\x05SMove\x10\xbb\t\x12\t\n\x04SPop\x10\xbc\t\x12\x10\n\x0bSRandMember\x10\xbd\t\x12\t\n\x04SRem\x10\xbe\t\x12\n\n\x05SScan\x10\xbf\t\x12\x0b\n\x06SUnion\x10\xc0\t\x12\x10\n\x0bSUnionStore\x10\xc1\t\x12\x0b\n\x06\x42ZMPop\x10\x95\n\x12\r\n\x08\x42ZPopMax\x10\x96\n\x12\r\n\x08\x42ZPopMin\x10\x97\n\x12\t\n\x04ZAdd\x10\x98\n\x12\n\n\x05ZCard\x10\x99\n\x12\x0b\n\x06ZCount\x10\x9a\n\x12\n\n\x05ZDiff\x10\x9b\n\x12\x0f\n\nZDiffStore\x10\x9c\n\x12\x0c\n\x07ZIncrBy\x10\x9d\n\x12\x0b\n\x06ZInter\x10\x9e\n\x12\x0f\n\nZInterCard\x10\x9f\n\x12\x10\n\x0bZInterStore\x10\xa0\n\x12\x0e\n\tZLexCount\x10\xa1\n\x12\n\n\x05ZMPop\x10\xa2\n\x12\x0c\n\x07ZMScore\x10\xa3\n\x12\x0c\n\x07ZPopMax\x10\xa4\n\x12\x0c\n\x07ZPopMin\x10\xa5\n\x12\x10\n\x0bZRandMember\x10\xa6\n\x12\x0b\n\x06ZRange\x10\xa7\n\x12\x10\n\x0bZRangeByLex\x10\xa8\n\x12\x12\n\rZRangeByScore\x10\xa9\n\x12\x10\n\x0bZRangeStore\x10\xaa\n\x12\n\n\x05ZRank\x10\xab\n\x12\t\n\x04ZRem\x10\xac\n\x12\x13\n\x0eZRemRangeByLex\x10\xad\n\x12\x14\n\x0fZRemRangeByRank\x10\xae\n\x12\x15\n\x10ZRemRangeByScore\x10\xaf\n\x12\x0e\n\tZRevRange\x10\xb0\n\x12\x13\n\x0eZRevRangeByLex\x10\xb1\n\x12\x15\n\x10ZRevRangeByScore\x10\xb2\n\x12\r\n\x08ZRevRank\x10\xb3\n\x12\n\n\x05ZScan\x10\xb4\n\x12\x0b\n\x06ZScore\x10\xb5\n\x12\x0b\n\x06ZUnion\x10\xb6\n\x12\x10\n\x0bZUnionStore\x10\xb7\n\x12\t\n\x04XAck\x10\xf9\n\x12\t\n\x04XAdd\x10\xfa\n\x12\x0f\n\nXAutoClaim\x10\xfb\n\x12\x0b\n\x06XClaim\x10\xfc\n\x12\t\n\x04XDel\x10\xfd\n\x12\x11\n\x0cXGroupCreate\x10\xfe\n\x12\x19\n\x14XGroupCreateConsumer\x10\xff\n\x12\x16\n\x11XGroupDelConsumer\x10\x80\x0b\x12\x12\n\rXGroupDestroy\x10\x81\x0b\x12\x10\n\x0bXGroupSetId\x10\x82\x0b\x12\x13\n\x0eXInfoConsumers\x10\x83\x0b\x12\x10\n\x0bXInfoGroups\x10\x84\x0b\x12\x10\n\x0bXInfoStream\x10\x85\x0b\x12\t\n\x04XLen\x10\x86\x0b\x12\r\n\x08XPending\x10\x87\x0b\x12\x0b\n\x06XRange\x10\x88\x0b\x12\n\n\x05XRead\x10\x89\x0b\x12\x0f\n\nXReadGroup\x10\x8a\x0b\x12\x0e\n\tXRevRange\x10\x8b\x0b\x12\x0b\n\x06XSetId\x10\x8c\x0b\x12\n\n\x05XTrim\x10\x8d\x0b\x12\x0b\n\x06\x41ppend\x10\xdd\x0b\x12\t\n\x04\x44\x65\x63r\x10\xde\x0b\x12\x0b\n\x06\x44\x65\x63rBy\x10\xdf\x0b\x12\x08\n\x03Get\x10\xe0\x0b\x12\x0b\n\x06GetDel\x10\xe1\x0b\x12\n\n\x05GetEx\x10\xe2\x0b\x12\r\n\x08GetRange\x10\xe3\x0b\x12\x0b\n\x06GetSet\x10\xe4\x0b\x12\t\n\x04Incr\x10\xe5\x0b\x12\x0b\n\x06IncrBy\x10\xe6\x0b\x12\x10\n\x0bIncrByFloat\x10\xe7\x0b\x12\x08\n\x03LCS\x10\xe8\x0b\x12\t\n\x04MGet\x10\xe9\x0b\x12\t\n\x04MSet\x10\xea\x0b\x12\x0b\n\x06MSetNX\x10\xeb\x0b\x12\x0b\n\x06PSetEx\x10\xec\x0b\x12\x08\n\x03Set\x10\xed\x0b\x12\n\n\x05SetEx\x10\xee\x0b\x12\n\n\x05SetNX\x10\xef\x0b\x12\r\n\x08SetRange\x10\xf0\x0b\x12\x0b\n\x06Strlen\x10\xf1\x0b\x12\x0b\n\x06Substr\x10\xf2\x0b\x12\x0c\n\x07\x44iscard\x10\xc1\x0c\x12\t\n\x04\x45xec\x10\xc2\x0c\x12\n\n\x05Multi\x10\xc3\x0c\x12\x0c\n\x07UnWatch\x10\xc4\x0c\x12\n\n\x05Watch\x10\xc5\x0c\x12\x12\n\rJsonArrAppend\x10\xd1\x0f\x12\x11\n\x0cJsonArrIndex\x10\xd2\x0f\x12\x12\n\rJsonArrInsert\x10\xd3\x0f\x12\x0f\n\nJsonArrLen\x10\xd4\x0f\x12\x0f\n\nJsonArrPop\x10\xd5\x0f\x12\x10\n\x0bJsonArrTrim\x10\xd6\x0f\x12\x0e\n\tJsonClear\x10\xd7\x0f\x12\x0e\n\tJsonDebug\x10\xd8\x0f\x12\x0c\n\x07JsonDel\x10\xd9\x0f\x12\x0f\n\nJsonForget\x10\xda\x0f\x12\x0c\n\x07JsonGet\x10\xdb\x0f\x12\r\n\x08JsonMGet\x10\xdc\x0f\x12\x12\n\rJsonNumIncrBy\x10\xdd\x0f\x12\x12\n\rJsonNumMultBy\x10\xde\x0f\x12\x10\n\x0bJsonObjKeys\x10\xdf\x0f\x12\x0f\n\nJsonObjLen\x10\xe0\x0f\x12\r\n\x08JsonResp\x10\xe1\x0f\x12\x0c\n\x07JsonSet\x10\xe2\x0f\x12\x12\n\rJsonStrAppend\x10\xe3\x0f\x12\x0f\n\nJsonStrLen\x10\xe4\x0f\x12\x0f\n\nJsonToggle\x10\xe5\x0f\x12\r\n\x08JsonType\x10\xe6\x0f\x12\x0b\n\x06\x46tList\x10\xb5\x10\x12\x10\n\x0b\x46tAggregate\x10\xb6\x10\x12\x0f\n\nFtAliasAdd\x10\xb7\x10\x12\x0f\n\nFtAliasDel\x10\xb8\x10\x12\x10\n\x0b\x46tAliasList\x10\xb9\x10\x12\x12\n\rFtAliasUpdate\x10\xba\x10\x12\r\n\x08\x46tCreate\x10\xbb\x10\x12\x10\n\x0b\x46tDropIndex\x10\xbc\x10\x12\x0e\n\tFtExplain\x10\xbd\x10\x12\x11\n\x0c\x46tExplainCli\x10\xbe\x10\x12\x0b\n\x06\x46tInfo\x10\xbf\x10\x12\x0e\n\tFtProfile\x10\xc0\x10\x12\r\n\x08\x46tSearch\x10\xc1\x10\x62\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protobuf.command_request_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
DESCRIPTOR._options = None
|
|
24
|
+
_globals['_SIMPLEROUTES']._serialized_start=2023
|
|
25
|
+
_globals['_SIMPLEROUTES']._serialized_end=2081
|
|
26
|
+
_globals['_SLOTTYPES']._serialized_start=2083
|
|
27
|
+
_globals['_SLOTTYPES']._serialized_end=2120
|
|
28
|
+
_globals['_REQUESTTYPE']._serialized_start=2123
|
|
29
|
+
_globals['_REQUESTTYPE']._serialized_end=8373
|
|
30
|
+
_globals['_SLOTIDROUTE']._serialized_start=51
|
|
31
|
+
_globals['_SLOTIDROUTE']._serialized_end=128
|
|
32
|
+
_globals['_SLOTKEYROUTE']._serialized_start=130
|
|
33
|
+
_globals['_SLOTKEYROUTE']._serialized_end=209
|
|
34
|
+
_globals['_BYADDRESSROUTE']._serialized_start=211
|
|
35
|
+
_globals['_BYADDRESSROUTE']._serialized_end=255
|
|
36
|
+
_globals['_ROUTES']._serialized_start=258
|
|
37
|
+
_globals['_ROUTES']._serialized_end=504
|
|
38
|
+
_globals['_COMMAND']._serialized_start=507
|
|
39
|
+
_globals['_COMMAND']._serialized_end=689
|
|
40
|
+
_globals['_COMMAND_ARGSARRAY']._serialized_start=656
|
|
41
|
+
_globals['_COMMAND_ARGSARRAY']._serialized_end=681
|
|
42
|
+
_globals['_SCRIPTINVOCATIONPOINTERS']._serialized_start=692
|
|
43
|
+
_globals['_SCRIPTINVOCATIONPOINTERS']._serialized_end=820
|
|
44
|
+
_globals['_SCRIPTINVOCATION']._serialized_start=822
|
|
45
|
+
_globals['_SCRIPTINVOCATION']._serialized_end=882
|
|
46
|
+
_globals['_BATCH']._serialized_start=885
|
|
47
|
+
_globals['_BATCH']._serialized_end=1157
|
|
48
|
+
_globals['_CLUSTERSCAN']._serialized_start=1160
|
|
49
|
+
_globals['_CLUSTERSCAN']._serialized_end=1340
|
|
50
|
+
_globals['_UPDATECONNECTIONPASSWORD']._serialized_start=1342
|
|
51
|
+
_globals['_UPDATECONNECTIONPASSWORD']._serialized_end=1428
|
|
52
|
+
_globals['_REFRESHIAMTOKEN']._serialized_start=1430
|
|
53
|
+
_globals['_REFRESHIAMTOKEN']._serialized_end=1447
|
|
54
|
+
_globals['_COMMANDREQUEST']._serialized_start=1450
|
|
55
|
+
_globals['_COMMANDREQUEST']._serialized_end=2021
|
|
56
|
+
# @@protoc_insertion_point(module_scope)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: protobuf/connection_request.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.1
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!protobuf/connection_request.proto\x12\x12\x63onnection_request\")\n\x0bNodeAddress\x12\x0c\n\x04host\x18\x01 \x01(\t\x12\x0c\n\x04port\x18\x02 \x01(\r\"\x8e\x01\n\x12\x41uthenticationInfo\x12\x10\n\x08password\x18\x01 \x01(\t\x12\x10\n\x08username\x18\x02 \x01(\t\x12@\n\x0fiam_credentials\x18\x03 \x01(\x0b\x32\".connection_request.IamCredentialsH\x00\x88\x01\x01\x42\x12\n\x10_iam_credentials\"\xb1\x01\n\x0eIamCredentials\x12\x14\n\x0c\x63luster_name\x18\x01 \x01(\t\x12\x0e\n\x06region\x18\x02 \x01(\t\x12\x35\n\x0cservice_type\x18\x03 \x01(\x0e\x32\x1f.connection_request.ServiceType\x12%\n\x18refresh_interval_seconds\x18\x04 \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_refresh_interval_seconds\"7\n\x1cPeriodicChecksManualInterval\x12\x17\n\x0f\x64uration_in_sec\x18\x01 \x01(\r\"\x18\n\x16PeriodicChecksDisabled\"8\n\x18PubSubChannelsOrPatterns\x12\x1c\n\x14\x63hannels_or_patterns\x18\x01 \x03(\x0c\"\xf1\x01\n\x13PubSubSubscriptions\x12k\n\x1c\x63hannels_or_patterns_by_type\x18\x01 \x03(\x0b\x32\x45.connection_request.PubSubSubscriptions.ChannelsOrPatternsByTypeEntry\x1am\n\x1d\x43hannelsOrPatternsByTypeEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12;\n\x05value\x18\x02 \x01(\x0b\x32,.connection_request.PubSubChannelsOrPatterns:\x02\x38\x01\"\x94\x07\n\x11\x43onnectionRequest\x12\x32\n\taddresses\x18\x01 \x03(\x0b\x32\x1f.connection_request.NodeAddress\x12-\n\x08tls_mode\x18\x02 \x01(\x0e\x32\x1b.connection_request.TlsMode\x12\x1c\n\x14\x63luster_mode_enabled\x18\x03 \x01(\x08\x12\x17\n\x0frequest_timeout\x18\x04 \x01(\r\x12/\n\tread_from\x18\x05 \x01(\x0e\x32\x1c.connection_request.ReadFrom\x12N\n\x19\x63onnection_retry_strategy\x18\x06 \x01(\x0b\x32+.connection_request.ConnectionRetryStrategy\x12\x43\n\x13\x61uthentication_info\x18\x07 \x01(\x0b\x32&.connection_request.AuthenticationInfo\x12\x13\n\x0b\x64\x61tabase_id\x18\x08 \x01(\r\x12\x35\n\x08protocol\x18\t \x01(\x0e\x32#.connection_request.ProtocolVersion\x12\x13\n\x0b\x63lient_name\x18\n \x01(\t\x12[\n\x1fperiodic_checks_manual_interval\x18\x0b \x01(\x0b\x32\x30.connection_request.PeriodicChecksManualIntervalH\x00\x12N\n\x18periodic_checks_disabled\x18\x0c \x01(\x0b\x32*.connection_request.PeriodicChecksDisabledH\x00\x12\x45\n\x14pubsub_subscriptions\x18\r \x01(\x0b\x32\'.connection_request.PubSubSubscriptions\x12\x1f\n\x17inflight_requests_limit\x18\x0e \x01(\r\x12\x11\n\tclient_az\x18\x0f \x01(\t\x12\x1a\n\x12\x63onnection_timeout\x18\x10 \x01(\r\x12\x14\n\x0clazy_connect\x18\x11 \x01(\x08\x12+\n#refresh_topology_from_initial_nodes\x18\x12 \x01(\x08\x12\x10\n\x08lib_name\x18\x13 \x01(\t\x12\x12\n\nroot_certs\x18\x14 \x03(\x0c\x42\x11\n\x0fperiodic_checks\"\x8b\x01\n\x17\x43onnectionRetryStrategy\x12\x19\n\x11number_of_retries\x18\x01 \x01(\r\x12\x0e\n\x06\x66\x61\x63tor\x18\x02 \x01(\r\x12\x15\n\rexponent_base\x18\x03 \x01(\r\x12\x1b\n\x0ejitter_percent\x18\x04 \x01(\rH\x00\x88\x01\x01\x42\x11\n\x0f_jitter_percent*o\n\x08ReadFrom\x12\x0b\n\x07Primary\x10\x00\x12\x11\n\rPreferReplica\x10\x01\x12\x11\n\rLowestLatency\x10\x02\x12\x0e\n\nAZAffinity\x10\x03\x12 \n\x1c\x41ZAffinityReplicasAndPrimary\x10\x04*4\n\x07TlsMode\x12\t\n\x05NoTls\x10\x00\x12\r\n\tSecureTls\x10\x01\x12\x0f\n\x0bInsecureTls\x10\x02*,\n\x0bServiceType\x12\x0f\n\x0b\x45LASTICACHE\x10\x00\x12\x0c\n\x08MEMORYDB\x10\x01*\'\n\x0fProtocolVersion\x12\t\n\x05RESP3\x10\x00\x12\t\n\x05RESP2\x10\x01*8\n\x11PubSubChannelType\x12\t\n\x05\x45xact\x10\x00\x12\x0b\n\x07Pattern\x10\x01\x12\x0b\n\x07Sharded\x10\x02\x62\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protobuf.connection_request_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
DESCRIPTOR._options = None
|
|
24
|
+
_globals['_PUBSUBSUBSCRIPTIONS_CHANNELSORPATTERNSBYTYPEENTRY']._options = None
|
|
25
|
+
_globals['_PUBSUBSUBSCRIPTIONS_CHANNELSORPATTERNSBYTYPEENTRY']._serialized_options = b'8\001'
|
|
26
|
+
_globals['_READFROM']._serialized_start=1871
|
|
27
|
+
_globals['_READFROM']._serialized_end=1982
|
|
28
|
+
_globals['_TLSMODE']._serialized_start=1984
|
|
29
|
+
_globals['_TLSMODE']._serialized_end=2036
|
|
30
|
+
_globals['_SERVICETYPE']._serialized_start=2038
|
|
31
|
+
_globals['_SERVICETYPE']._serialized_end=2082
|
|
32
|
+
_globals['_PROTOCOLVERSION']._serialized_start=2084
|
|
33
|
+
_globals['_PROTOCOLVERSION']._serialized_end=2123
|
|
34
|
+
_globals['_PUBSUBCHANNELTYPE']._serialized_start=2125
|
|
35
|
+
_globals['_PUBSUBCHANNELTYPE']._serialized_end=2181
|
|
36
|
+
_globals['_NODEADDRESS']._serialized_start=57
|
|
37
|
+
_globals['_NODEADDRESS']._serialized_end=98
|
|
38
|
+
_globals['_AUTHENTICATIONINFO']._serialized_start=101
|
|
39
|
+
_globals['_AUTHENTICATIONINFO']._serialized_end=243
|
|
40
|
+
_globals['_IAMCREDENTIALS']._serialized_start=246
|
|
41
|
+
_globals['_IAMCREDENTIALS']._serialized_end=423
|
|
42
|
+
_globals['_PERIODICCHECKSMANUALINTERVAL']._serialized_start=425
|
|
43
|
+
_globals['_PERIODICCHECKSMANUALINTERVAL']._serialized_end=480
|
|
44
|
+
_globals['_PERIODICCHECKSDISABLED']._serialized_start=482
|
|
45
|
+
_globals['_PERIODICCHECKSDISABLED']._serialized_end=506
|
|
46
|
+
_globals['_PUBSUBCHANNELSORPATTERNS']._serialized_start=508
|
|
47
|
+
_globals['_PUBSUBCHANNELSORPATTERNS']._serialized_end=564
|
|
48
|
+
_globals['_PUBSUBSUBSCRIPTIONS']._serialized_start=567
|
|
49
|
+
_globals['_PUBSUBSUBSCRIPTIONS']._serialized_end=808
|
|
50
|
+
_globals['_PUBSUBSUBSCRIPTIONS_CHANNELSORPATTERNSBYTYPEENTRY']._serialized_start=699
|
|
51
|
+
_globals['_PUBSUBSUBSCRIPTIONS_CHANNELSORPATTERNSBYTYPEENTRY']._serialized_end=808
|
|
52
|
+
_globals['_CONNECTIONREQUEST']._serialized_start=811
|
|
53
|
+
_globals['_CONNECTIONREQUEST']._serialized_end=1727
|
|
54
|
+
_globals['_CONNECTIONRETRYSTRATEGY']._serialized_start=1730
|
|
55
|
+
_globals['_CONNECTIONRETRYSTRATEGY']._serialized_end=1869
|
|
56
|
+
# @@protoc_insertion_point(module_scope)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
|
3
|
+
# source: protobuf/response.proto
|
|
4
|
+
# Protobuf Python Version: 4.25.1
|
|
5
|
+
"""Generated protocol buffer code."""
|
|
6
|
+
from google.protobuf import descriptor as _descriptor
|
|
7
|
+
from google.protobuf import descriptor_pool as _descriptor_pool
|
|
8
|
+
from google.protobuf import symbol_database as _symbol_database
|
|
9
|
+
from google.protobuf.internal import builder as _builder
|
|
10
|
+
# @@protoc_insertion_point(imports)
|
|
11
|
+
|
|
12
|
+
_sym_db = _symbol_database.Default()
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17protobuf/response.proto\x12\x08response\"I\n\x0cRequestError\x12(\n\x04type\x18\x01 \x01(\x0e\x32\x1a.response.RequestErrorType\x12\x0f\n\x07message\x18\x02 \x01(\t\"\x83\x02\n\x08Response\x12\x14\n\x0c\x63\x61llback_idx\x18\x01 \x01(\r\x12\x16\n\x0cresp_pointer\x18\x02 \x01(\x04H\x00\x12\x37\n\x11\x63onstant_response\x18\x03 \x01(\x0e\x32\x1a.response.ConstantResponseH\x00\x12/\n\rrequest_error\x18\x04 \x01(\x0b\x32\x16.response.RequestErrorH\x00\x12\x17\n\rclosing_error\x18\x05 \x01(\tH\x00\x12\x0f\n\x07is_push\x18\x06 \x01(\x08\x12\x1a\n\rroot_span_ptr\x18\x07 \x01(\x04H\x01\x88\x01\x01\x42\x07\n\x05valueB\x10\n\x0e_root_span_ptr*O\n\x10RequestErrorType\x12\x0f\n\x0bUnspecified\x10\x00\x12\r\n\tExecAbort\x10\x01\x12\x0b\n\x07Timeout\x10\x02\x12\x0e\n\nDisconnect\x10\x03*\x1a\n\x10\x43onstantResponse\x12\x06\n\x02OK\x10\x00\x62\x06proto3')
|
|
18
|
+
|
|
19
|
+
_globals = globals()
|
|
20
|
+
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
21
|
+
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'protobuf.response_pb2', _globals)
|
|
22
|
+
if _descriptor._USE_C_DESCRIPTORS == False:
|
|
23
|
+
DESCRIPTOR._options = None
|
|
24
|
+
_globals['_REQUESTERRORTYPE']._serialized_start=374
|
|
25
|
+
_globals['_REQUESTERRORTYPE']._serialized_end=453
|
|
26
|
+
_globals['_CONSTANTRESPONSE']._serialized_start=455
|
|
27
|
+
_globals['_CONSTANTRESPONSE']._serialized_end=481
|
|
28
|
+
_globals['_REQUESTERROR']._serialized_start=37
|
|
29
|
+
_globals['_REQUESTERROR']._serialized_end=110
|
|
30
|
+
_globals['_RESPONSE']._serialized_start=113
|
|
31
|
+
_globals['_RESPONSE']._serialized_end=372
|
|
32
|
+
# @@protoc_insertion_point(module_scope)
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
import struct
|
|
4
|
+
from typing import List, Tuple, Type
|
|
5
|
+
|
|
6
|
+
from google.protobuf import message
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ProtobufCodec:
|
|
10
|
+
"""
|
|
11
|
+
Codec for protobuf messages.
|
|
12
|
+
All of the Varint functions were copied from [protobuf](https://github.com/protocolbuffers/protobuf)
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
@classmethod
|
|
16
|
+
def _decode_varint_32(cls, buffer, pos):
|
|
17
|
+
decoder_func = cls._varint_decoder((1 << 32) - 1, int)
|
|
18
|
+
return decoder_func(buffer, pos)
|
|
19
|
+
|
|
20
|
+
@staticmethod
|
|
21
|
+
def _varint_decoder(mask, result_type):
|
|
22
|
+
"""Return an encoder for a basic varint value (does not include tag).
|
|
23
|
+
|
|
24
|
+
Decoded values will be bitwise-anded with the given mask before being
|
|
25
|
+
returned, e.g. to limit them to 32 bits. The returned decoder does not
|
|
26
|
+
take the usual "end" parameter -- the caller is expected to do bounds checking
|
|
27
|
+
after the fact (often the caller can defer such checking until later). The
|
|
28
|
+
decoder returns a (value, new_pos) pair.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
def decode_varint(buffer, pos):
|
|
32
|
+
result = 0
|
|
33
|
+
shift = 0
|
|
34
|
+
while 1:
|
|
35
|
+
b = buffer[pos]
|
|
36
|
+
result |= (b & 0x7F) << shift
|
|
37
|
+
pos += 1
|
|
38
|
+
if not (b & 0x80):
|
|
39
|
+
result &= mask
|
|
40
|
+
result = result_type(result)
|
|
41
|
+
return (result, pos)
|
|
42
|
+
shift += 7
|
|
43
|
+
if shift >= 64:
|
|
44
|
+
raise message.DecodeError("Too many bytes when decoding varint.")
|
|
45
|
+
|
|
46
|
+
return decode_varint
|
|
47
|
+
|
|
48
|
+
@staticmethod
|
|
49
|
+
def _varint_encoder():
|
|
50
|
+
"""Return an encoder for a basic varint value (does not include tag)."""
|
|
51
|
+
|
|
52
|
+
local_int2byte = struct.Struct(">B").pack
|
|
53
|
+
|
|
54
|
+
def encode_varint(write, value):
|
|
55
|
+
bits = value & 0x7F
|
|
56
|
+
value >>= 7
|
|
57
|
+
while value:
|
|
58
|
+
write(local_int2byte(0x80 | bits))
|
|
59
|
+
bits = value & 0x7F
|
|
60
|
+
value >>= 7
|
|
61
|
+
return write(local_int2byte(bits))
|
|
62
|
+
|
|
63
|
+
return encode_varint
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def _varint_bytes(cls, value: int) -> bytes:
|
|
67
|
+
"""Encode the given integer as a varint and return the bytes."""
|
|
68
|
+
|
|
69
|
+
pieces: List[bytes] = []
|
|
70
|
+
func = cls._varint_encoder()
|
|
71
|
+
func(pieces.append, value)
|
|
72
|
+
return b"".join(pieces)
|
|
73
|
+
|
|
74
|
+
@classmethod
|
|
75
|
+
def decode_delimited(
|
|
76
|
+
cls,
|
|
77
|
+
read_bytes: bytearray,
|
|
78
|
+
read_bytes_view: memoryview,
|
|
79
|
+
offset: int,
|
|
80
|
+
message_class: Type[message.Message],
|
|
81
|
+
) -> Tuple[message.Message, int]:
|
|
82
|
+
try:
|
|
83
|
+
msg_len, new_pos = cls._decode_varint_32(read_bytes_view, offset)
|
|
84
|
+
except IndexError:
|
|
85
|
+
# Didn't read enough bytes to decode the varint
|
|
86
|
+
raise PartialMessageException(
|
|
87
|
+
"Didn't read enough bytes to decode the varint"
|
|
88
|
+
)
|
|
89
|
+
required_read_size = new_pos + msg_len
|
|
90
|
+
if required_read_size > len(read_bytes):
|
|
91
|
+
# Recieved only partial response
|
|
92
|
+
raise PartialMessageException("Recieved only a partial response")
|
|
93
|
+
offset = new_pos
|
|
94
|
+
end = offset + msg_len
|
|
95
|
+
msg_buf = read_bytes_view[offset:end]
|
|
96
|
+
offset += msg_len
|
|
97
|
+
message = message_class()
|
|
98
|
+
message.ParseFromString(msg_buf)
|
|
99
|
+
return (message, offset)
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def encode_delimited(cls, b_arr: bytearray, message: message.Message) -> None:
|
|
103
|
+
bytes_request = message.SerializeToString()
|
|
104
|
+
varint = cls._varint_bytes(len(bytes_request))
|
|
105
|
+
b_arr.extend(varint)
|
|
106
|
+
b_arr.extend(bytes_request)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class PartialMessageException(Exception):
|
|
110
|
+
pass
|
glide_shared/routes.py
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0
|
|
2
|
+
|
|
3
|
+
from enum import Enum
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from glide_shared.exceptions import RequestError
|
|
7
|
+
from glide_shared.protobuf.command_request_pb2 import (
|
|
8
|
+
CommandRequest,
|
|
9
|
+
Routes,
|
|
10
|
+
SimpleRoutes,
|
|
11
|
+
)
|
|
12
|
+
from glide_shared.protobuf.command_request_pb2 import SlotTypes as ProtoSlotTypes
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class SlotType(Enum):
|
|
16
|
+
PRIMARY = 1
|
|
17
|
+
"""
|
|
18
|
+
Address a primary node.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
REPLICA = 2
|
|
22
|
+
"""
|
|
23
|
+
Address a replica node.
|
|
24
|
+
|
|
25
|
+
`REPLICA` overrides the `read_from_replica` configuration. If it's used the request
|
|
26
|
+
will be routed to a replica, even if the strategy is `ALWAYS_FROM_MASTER`.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class Route:
|
|
31
|
+
def __init__(self) -> None:
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# cluster routes
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class AllNodes(Route):
|
|
39
|
+
"""
|
|
40
|
+
Route request to all nodes.
|
|
41
|
+
|
|
42
|
+
Warning:
|
|
43
|
+
Don't use it with write commands, they could be routed to a replica (RO) node and fail.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
pass
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class AllPrimaries(Route):
|
|
50
|
+
"""
|
|
51
|
+
Route request to all primary nodes.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class RandomNode(Route):
|
|
58
|
+
"""
|
|
59
|
+
Route request to a random node.
|
|
60
|
+
|
|
61
|
+
Warning:
|
|
62
|
+
Don't use it with write commands, because they could be randomly routed to a replica (RO) node and fail.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class SlotKeyRoute(Route):
|
|
69
|
+
"""Routes a request to a node by its slot key
|
|
70
|
+
|
|
71
|
+
Attributes:
|
|
72
|
+
slot_type (SlotType): Defines type of the node being addressed.
|
|
73
|
+
slot_key (str): The request will be sent to nodes managing this key.
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
def __init__(self, slot_type: SlotType, slot_key: str) -> None:
|
|
77
|
+
super().__init__()
|
|
78
|
+
self.slot_type = slot_type
|
|
79
|
+
self.slot_key = slot_key
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class SlotIdRoute(Route):
|
|
83
|
+
"""Routes a request to a node by its slot ID
|
|
84
|
+
|
|
85
|
+
Attributes:
|
|
86
|
+
slot_type (SlotType): Defines type of the node being addressed.
|
|
87
|
+
slot_id (int): Slot number. There are 16384 slots in a Valkey cluster, and each shard
|
|
88
|
+
manages a slot range. Unless the slot is known, it's better to route using
|
|
89
|
+
`SlotType.PRIMARY`
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
def __init__(self, slot_type: SlotType, slot_id: int) -> None:
|
|
93
|
+
super().__init__()
|
|
94
|
+
self.slot_type = slot_type
|
|
95
|
+
self.slot_id = slot_id
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class ByAddressRoute(Route):
|
|
99
|
+
"""Routes a request to a node by its address
|
|
100
|
+
|
|
101
|
+
Attributes:
|
|
102
|
+
host (str): The endpoint of the node. If `port` is not provided, should be in the f"{address}:{port}" format,
|
|
103
|
+
where `address` is the preferred endpoint as shown in the output of the `CLUSTER SLOTS` command.
|
|
104
|
+
port (Optional[int]): The port to access on the node. If port is not provided, `host` is assumed to be in
|
|
105
|
+
the format f"{address}:{port}".
|
|
106
|
+
"""
|
|
107
|
+
|
|
108
|
+
def __init__(self, host: str, port: Optional[int] = None) -> None:
|
|
109
|
+
super().__init__()
|
|
110
|
+
if port is None:
|
|
111
|
+
split = host.split(":")
|
|
112
|
+
if len(split) < 2:
|
|
113
|
+
raise RequestError(
|
|
114
|
+
"No port provided, expected host to be formatted as {hostname}:{port}`. Received "
|
|
115
|
+
+ host
|
|
116
|
+
)
|
|
117
|
+
self.host = split[0]
|
|
118
|
+
self.port = int(split[1])
|
|
119
|
+
else:
|
|
120
|
+
self.host = host
|
|
121
|
+
self.port = port
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def to_protobuf_slot_type(slot_type: SlotType) -> ProtoSlotTypes.ValueType:
|
|
125
|
+
return (
|
|
126
|
+
ProtoSlotTypes.Primary
|
|
127
|
+
if slot_type == SlotType.PRIMARY
|
|
128
|
+
else ProtoSlotTypes.Replica
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def build_protobuf_route(route: Optional[Route]) -> Optional[Routes]:
|
|
133
|
+
if route is None:
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
protobuf_route = Routes()
|
|
137
|
+
if isinstance(route, AllNodes):
|
|
138
|
+
protobuf_route.simple_routes = SimpleRoutes.AllNodes
|
|
139
|
+
elif isinstance(route, AllPrimaries):
|
|
140
|
+
protobuf_route.simple_routes = SimpleRoutes.AllPrimaries
|
|
141
|
+
elif isinstance(route, RandomNode):
|
|
142
|
+
protobuf_route.simple_routes = SimpleRoutes.Random
|
|
143
|
+
elif isinstance(route, SlotKeyRoute):
|
|
144
|
+
protobuf_route.slot_key_route.slot_type = to_protobuf_slot_type(route.slot_type)
|
|
145
|
+
protobuf_route.slot_key_route.slot_key = route.slot_key
|
|
146
|
+
elif isinstance(route, SlotIdRoute):
|
|
147
|
+
protobuf_route.slot_id_route.slot_type = to_protobuf_slot_type(route.slot_type)
|
|
148
|
+
protobuf_route.slot_id_route.slot_id = route.slot_id
|
|
149
|
+
elif isinstance(route, ByAddressRoute):
|
|
150
|
+
protobuf_route.by_address_route.host = route.host
|
|
151
|
+
protobuf_route.by_address_route.port = route.port
|
|
152
|
+
else:
|
|
153
|
+
raise RequestError(f"Received invalid route type: {type(route)}")
|
|
154
|
+
|
|
155
|
+
return protobuf_route
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def set_protobuf_route(request: CommandRequest, route: Optional[Route]) -> None:
|
|
159
|
+
protobuf_route = build_protobuf_route(route)
|
|
160
|
+
if protobuf_route:
|
|
161
|
+
request.route.CopyFrom(protobuf_route)
|