-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathKV_interface.py
More file actions
111 lines (90 loc) · 3.03 KB
/
Copy pathKV_interface.py
File metadata and controls
111 lines (90 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
def getValue(query_args):
try:
return query_args.split(',')[1][1:-1].strip() # [1:-1] to make "val" -> val
except IndexError:
print("No value specified for put query.")
exit(1)
def getKey(query_args):
try:
return query_args.split(',')[0][1:-1].strip() # [1:-1] to make "key" -> key
except IndexError:
print("No key specified for requested query.")
exit(1)
def rewrite_query(query, metadata):
return query_multiplexer(query, metadata)
def query_multiplexer(query, metadata):
query_split = query.split('(')
query_cmd = query_split[0].lower().strip()
query_args = query_split[1].strip()[:-1]
K = getKey(query_args)
if query_cmd == "put":
V = getValue(query_args)
# Check if this is a metadata-only update
if V == "meta_only":
return put_meta_only(K, metadata)
return put_filtered(K, V, metadata)
elif query_cmd == "get":
V = getValue(query_args)
# Check if this is a metadata-only retrieval
if V == "meta_only":
return get_meta_only(K, metadata)
return get_filtered(K, metadata)
elif query_cmd == "delete":
return delete_filtered(K, metadata)
elif query_cmd == "putm":
return putm(K, metadata)
elif query_cmd == "getm":
getm_type = getValue(query_args)
return getm(K, getm_type, metadata)
elif query_cmd == "deletem":
return deletem(K, metadata)
elif query_cmd == "putc":
return putc_filtered(K, V, metadata)
elif query_cmd == "getlogs":
return getLogs(K, metadata)
else:
print(f"Query type {query_cmd} not supported")
exit(1)
# intact KV API
def put(K, V):
return (f"put {K} {V}")
def get(K):
return (f"get {K}")
def delete(K):
return (f"del {K}")
# GDPR-enhanced API
def put_filtered(K, V, metadata):
if metadata == "":
return put(K, V)
return (f"put {K} {V} {metadata}")
def putc_filtered(K, V, metadata):
if metadata == "":
return put(K, V)
return (f"putc {K} {V} {metadata}")
def get_filtered(K, metadata):
if metadata == "":
return get(K)
return (f"get {K} {metadata}")
def delete_filtered(K, metadata):
if metadata == "":
return delete(K)
return (f"del {K} {metadata}")
# GDPR-metadata API
def putm(K, metadata):
return (f"putm {K} {metadata}")
def put_meta_only(K, metadata):
# For put_meta_only, metadata is required (cannot update metadata of non-existent key)
return (f"put_meta_only {K} {metadata}")
def getm(K, getm_type, metadata):
return (f"getm {K} {getm_type} {metadata}")
def get_meta_only(K, metadata):
if metadata == "":
return get(K) # Fallback to regular get if no metadata filter
return (f"get_meta_only {K} {metadata}")
def deletem(K, metadata):
return (f"deletem {K} {metadata}")
# Regulator API
def getLogs(K, metadata):
if not K:
K = "dir" # for the empty key case -- list the dir
return (f"getLogs {K} {metadata}")