Skip to content

Commit 728c00e

Browse files
authored
fix: rewrote settings logic to mimic aw-server-python behavior (#428)
* fix: rewrote settings logic to mimic aw-server-python behavior * refactor: removed redundant KeyValue struct * format: applied cargo fmt * format: applied cargo clippy --fix
1 parent 7538163 commit 728c00e

File tree

11 files changed

+179
-237
lines changed

11 files changed

+179
-237
lines changed

aw-datastore/src/datastore.rs

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use serde_json::value::Value;
1212
use aw_models::Bucket;
1313
use aw_models::BucketMetadata;
1414
use aw_models::Event;
15-
use aw_models::KeyValue;
1615

1716
use rusqlite::params;
1817
use rusqlite::types::ToSql;
@@ -897,7 +896,7 @@ impl DatastoreInstance {
897896
Ok(())
898897
}
899898

900-
pub fn get_key_value(&self, conn: &Connection, key: &str) -> Result<KeyValue, DatastoreError> {
899+
pub fn get_key_value(&self, conn: &Connection, key: &str) -> Result<String, DatastoreError> {
901900
let mut stmt = match conn.prepare(
902901
"
903902
SELECT * FROM key_value WHERE KEY = ?1",
@@ -910,16 +909,7 @@ impl DatastoreInstance {
910909
}
911910
};
912911

913-
match stmt.query_row([key], |row| {
914-
Ok(KeyValue {
915-
key: row.get(0)?,
916-
value: row.get(1)?,
917-
timestamp: Some(DateTime::from_utc(
918-
NaiveDateTime::from_timestamp_opt(row.get(2)?, 0).unwrap(),
919-
Utc,
920-
)),
921-
})
922-
}) {
912+
match stmt.query_row([key], |row| row.get(1)) {
923913
Ok(result) => Ok(result),
924914
Err(err) => match err {
925915
rusqlite::Error::QueryReturnedNoRows => {
@@ -932,12 +922,12 @@ impl DatastoreInstance {
932922
}
933923
}
934924

935-
pub fn get_keys_starting(
925+
pub fn get_key_values(
936926
&self,
937927
conn: &Connection,
938928
pattern: &str,
939-
) -> Result<Vec<String>, DatastoreError> {
940-
let mut stmt = match conn.prepare("SELECT key FROM key_value WHERE key LIKE ?") {
929+
) -> Result<HashMap<String, String>, DatastoreError> {
930+
let mut stmt = match conn.prepare("SELECT key, value FROM key_value WHERE key LIKE ?") {
941931
Ok(stmt) => stmt,
942932
Err(err) => {
943933
return Err(DatastoreError::InternalError(format!(
@@ -946,25 +936,30 @@ impl DatastoreInstance {
946936
}
947937
};
948938

949-
let mut output = Vec::<String>::new();
939+
let mut output = HashMap::<String, String>::new();
950940
// Rusqlite's get wants index and item type as parameters.
951-
let result = stmt.query_map([pattern], |row| row.get::<usize, String>(0));
941+
let result = stmt.query_map([pattern], |row| {
942+
Ok((row.get::<usize, String>(0)?, row.get::<usize, String>(1)?))
943+
});
952944
match result {
953-
Ok(keys) => {
954-
for row in keys {
945+
Ok(settings) => {
946+
for row in settings {
955947
// Unwrap to String or panic on SQL row if type is invalid. Can't happen with a
956948
// properly initialized table.
957-
output.push(row.unwrap());
949+
let (key, value) = row.unwrap();
950+
// Only return keys starting with "settings.".
951+
if !key.starts_with("settings.") {
952+
continue;
953+
}
954+
output.insert(key, value);
958955
}
959956
Ok(output)
960957
}
961958
Err(err) => match err {
962-
rusqlite::Error::QueryReturnedNoRows => {
963-
Err(DatastoreError::NoSuchKey(pattern.to_string()))
964-
}
965-
_ => Err(DatastoreError::InternalError(format!(
966-
"Failed to get key_value rows starting with pattern {pattern}"
967-
))),
959+
rusqlite::Error::QueryReturnedNoRows => Ok(output),
960+
_ => Err(DatastoreError::InternalError(
961+
"Failed to get settings".to_string(),
962+
)),
968963
},
969964
}
970965
}

aw-datastore/src/worker.rs

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use rusqlite::TransactionBehavior;
1313

1414
use aw_models::Bucket;
1515
use aw_models::Event;
16-
use aw_models::KeyValue;
1716

1817
use crate::DatastoreError;
1918
use crate::DatastoreInstance;
@@ -51,8 +50,8 @@ pub enum Response {
5150
Event(Event),
5251
EventList(Vec<Event>),
5352
Count(i64),
54-
KeyValue(KeyValue),
55-
StringVec(Vec<String>),
53+
KeyValue(String),
54+
KeyValues(HashMap<String, String>),
5655
}
5756

5857
#[allow(clippy::large_enum_variant)]
@@ -74,9 +73,9 @@ pub enum Command {
7473
GetEventCount(String, Option<DateTime<Utc>>, Option<DateTime<Utc>>),
7574
DeleteEventsById(String, Vec<i64>),
7675
ForceCommit(),
77-
InsertKeyValue(String, String),
76+
GetKeyValues(String),
7877
GetKeyValue(String),
79-
GetKeysStarting(String),
78+
SetKeyValue(String, String),
8079
DeleteKeyValue(String),
8180
Close(),
8281
}
@@ -275,18 +274,18 @@ impl DatastoreWorker {
275274
self.commit = true;
276275
Ok(Response::Empty())
277276
}
278-
Command::InsertKeyValue(key, data) => match ds.insert_key_value(tx, &key, &data) {
277+
Command::GetKeyValues(pattern) => match ds.get_key_values(tx, pattern.as_str()) {
278+
Ok(result) => Ok(Response::KeyValues(result)),
279+
Err(e) => Err(e),
280+
},
281+
Command::SetKeyValue(key, data) => match ds.insert_key_value(tx, &key, &data) {
279282
Ok(()) => Ok(Response::Empty()),
280283
Err(e) => Err(e),
281284
},
282285
Command::GetKeyValue(key) => match ds.get_key_value(tx, &key) {
283286
Ok(result) => Ok(Response::KeyValue(result)),
284287
Err(e) => Err(e),
285288
},
286-
Command::GetKeysStarting(pattern) => match ds.get_keys_starting(tx, &pattern) {
287-
Ok(result) => Ok(Response::StringVec(result)),
288-
Err(e) => Err(e),
289-
},
290289
Command::DeleteKeyValue(key) => match ds.delete_key_value(tx, &key) {
291290
Ok(()) => Ok(Response::Empty()),
292291
Err(e) => Err(e),
@@ -475,46 +474,46 @@ impl Datastore {
475474
}
476475
}
477476

478-
pub fn insert_key_value(&self, key: &str, data: &str) -> Result<(), DatastoreError> {
479-
let cmd = Command::InsertKeyValue(key.to_string(), data.to_string());
480-
let receiver = self.requester.request(cmd).unwrap();
481-
482-
_unwrap_response(receiver)
483-
}
484-
485-
pub fn delete_key_value(&self, key: &str) -> Result<(), DatastoreError> {
486-
let cmd = Command::DeleteKeyValue(key.to_string());
487-
let receiver = self.requester.request(cmd).unwrap();
488-
489-
_unwrap_response(receiver)
490-
}
491-
492-
pub fn get_key_value(&self, key: &str) -> Result<KeyValue, DatastoreError> {
493-
let cmd = Command::GetKeyValue(key.to_string());
477+
pub fn get_key_values(&self, pattern: &str) -> Result<HashMap<String, String>, DatastoreError> {
478+
let cmd = Command::GetKeyValues(pattern.to_string());
494479
let receiver = self.requester.request(cmd).unwrap();
495480

496481
match receiver.collect().unwrap() {
497482
Ok(r) => match r {
498-
Response::KeyValue(value) => Ok(value),
483+
Response::KeyValues(value) => Ok(value),
499484
_ => panic!("Invalid response"),
500485
},
501486
Err(e) => Err(e),
502487
}
503488
}
504489

505-
pub fn get_keys_starting(&self, pattern: &str) -> Result<Vec<String>, DatastoreError> {
506-
let cmd = Command::GetKeysStarting(pattern.to_string());
490+
pub fn get_key_value(&self, key: &str) -> Result<String, DatastoreError> {
491+
let cmd = Command::GetKeyValue(key.to_string());
507492
let receiver = self.requester.request(cmd).unwrap();
508493

509494
match receiver.collect().unwrap() {
510495
Ok(r) => match r {
511-
Response::StringVec(value) => Ok(value),
496+
Response::KeyValue(kv) => Ok(kv),
512497
_ => panic!("Invalid response"),
513498
},
514499
Err(e) => Err(e),
515500
}
516501
}
517502

503+
pub fn set_key_value(&self, key: &str, data: &str) -> Result<(), DatastoreError> {
504+
let cmd = Command::SetKeyValue(key.to_string(), data.to_string());
505+
let receiver = self.requester.request(cmd).unwrap();
506+
507+
_unwrap_response(receiver)
508+
}
509+
510+
pub fn delete_key_value(&self, key: &str) -> Result<(), DatastoreError> {
511+
let cmd = Command::DeleteKeyValue(key.to_string());
512+
let receiver = self.requester.request(cmd).unwrap();
513+
514+
_unwrap_response(receiver)
515+
}
516+
518517
// Should block until worker has stopped
519518
pub fn close(&self) {
520519
info!("Sending close request to database");

aw-datastore/tests/datastore.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ mod datastore_tests {
169169

170170
// Get all events
171171
let fetched_events_all = ds.get_events(&bucket.id, None, None, None).unwrap();
172-
let expected_fetched_events = vec![&e2, &e1];
172+
let expected_fetched_events = [&e2, &e1];
173173
assert_eq!(fetched_events_all.len(), 2);
174174
for i in 0..fetched_events_all.len() {
175175
let expected = &expected_fetched_events[i];
@@ -268,7 +268,7 @@ mod datastore_tests {
268268

269269
// Get all events
270270
let fetched_events_all = ds.get_events(&bucket.id, None, None, None).unwrap();
271-
let expected_fetched_events = vec![&e2, &e1];
271+
let expected_fetched_events = [&e2, &e1];
272272
assert_eq!(fetched_events_all.len(), 2);
273273
for i in 0..fetched_events_all.len() {
274274
let expected = &expected_fetched_events[i];
@@ -286,7 +286,7 @@ mod datastore_tests {
286286

287287
// Get all events
288288
let fetched_events_all = ds.get_events(&bucket.id, None, None, None).unwrap();
289-
let expected_fetched_events = vec![e2];
289+
let expected_fetched_events = [e2];
290290
assert_eq!(fetched_events_all.len(), 1);
291291
for i in 0..fetched_events_all.len() {
292292
let expected = &expected_fetched_events[i];

aw-models/src/key_value.rs

Lines changed: 0 additions & 30 deletions
This file was deleted.

aw-models/src/lib.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ mod bucket;
2020
mod duration;
2121
mod event;
2222
mod info;
23-
mod key_value;
2423
mod query;
2524
mod timeinterval;
2625
mod tryvec;
@@ -30,8 +29,6 @@ pub use self::bucket::BucketMetadata;
3029
pub use self::bucket::BucketsExport;
3130
pub use self::event::Event;
3231
pub use self::info::Info;
33-
pub use self::key_value::Key;
34-
pub use self::key_value::KeyValue;
3532
pub use self::query::Query;
3633
pub use self::timeinterval::TimeInterval;
3734
pub use self::tryvec::TryVec;

aw-query/tests/query.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ mod query_tests {
104104

105105
let code = String::from("True;False;a=True;return True;");
106106
match aw_query::query(&code, &interval, &ds).unwrap() {
107-
aw_query::DataType::Bool(b) => assert_eq!(b, true),
107+
aw_query::DataType::Bool(b) => assert!(b),
108108
ref data => panic!("Wrong datatype, {data:?}"),
109109
};
110110
}
@@ -129,42 +129,42 @@ mod query_tests {
129129
// number comparison true
130130
let code = String::from("return 1==1;");
131131
match aw_query::query(&code, &interval, &ds).unwrap() {
132-
aw_query::DataType::Bool(b) => assert_eq!(b, true),
132+
aw_query::DataType::Bool(b) => assert!(b),
133133
ref data => panic!("Wrong datatype, {data:?}"),
134134
};
135135

136136
// number comparison false
137137
let code = String::from("return 2==1;");
138138
match aw_query::query(&code, &interval, &ds).unwrap() {
139-
aw_query::DataType::Bool(b) => assert_eq!(b, false),
139+
aw_query::DataType::Bool(b) => assert!(!b),
140140
ref data => panic!("Wrong datatype, {data:?}"),
141141
};
142142

143143
// string comparison true
144144
let code = String::from(r#"return "a"=="a";"#);
145145
match aw_query::query(&code, &interval, &ds).unwrap() {
146-
aw_query::DataType::Bool(b) => assert_eq!(b, true),
146+
aw_query::DataType::Bool(b) => assert!(b),
147147
ref data => panic!("Wrong datatype, {data:?}"),
148148
};
149149

150150
// string comparison false
151151
let code = String::from(r#"return "a"=="b";"#);
152152
match aw_query::query(&code, &interval, &ds).unwrap() {
153-
aw_query::DataType::Bool(b) => assert_eq!(b, false),
153+
aw_query::DataType::Bool(b) => assert!(!b),
154154
ref data => panic!("Wrong datatype, {data:?}"),
155155
};
156156

157157
// bool comparison true
158158
let code = String::from("return True==True;");
159159
match aw_query::query(&code, &interval, &ds).unwrap() {
160-
aw_query::DataType::Bool(b) => assert_eq!(b, true),
160+
aw_query::DataType::Bool(b) => assert!(b),
161161
ref data => panic!("Wrong datatype, {data:?}"),
162162
};
163163

164164
// bool comparison false
165165
let code = String::from("return False==True;");
166166
match aw_query::query(&code, &interval, &ds).unwrap() {
167-
aw_query::DataType::Bool(b) => assert_eq!(b, false),
167+
aw_query::DataType::Bool(b) => assert!(!b),
168168
ref data => panic!("Wrong datatype, {data:?}"),
169169
};
170170

aw-server/src/endpoints/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ pub fn build_rocket(server_state: ServerState, config: AWConfig) -> rocket::Rock
165165
"/api/0/settings",
166166
routes![
167167
settings::setting_get,
168-
settings::settings_list_get,
169168
settings::setting_set,
170-
settings::setting_delete
169+
settings::setting_delete,
170+
settings::settings_get,
171171
],
172172
)
173173
.mount("/", rocket_cors::catch_all_options_routes());

0 commit comments

Comments
 (0)