From e405cd7eae6af29026c0a51c1b975e7f94fe0482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Bj=C3=A4reholt?= Date: Mon, 9 Sep 2019 08:59:04 +0200 Subject: [PATCH] datastore: Don't copy buckets events into bucket_cache --- src/datastore/datastore.rs | 33 +++++++++++++++++++-------------- src/models/bucket.rs | 2 +- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/datastore/datastore.rs b/src/datastore/datastore.rs index e9b58994..44651c79 100644 --- a/src/datastore/datastore.rs +++ b/src/datastore/datastore.rs @@ -221,7 +221,7 @@ impl DatastoreWorker { }; let response = match request { Commands::CreateBucket(bucket) => { - match ds.create_bucket(&transaction, bucket.clone()) { + match ds.create_bucket(&transaction, bucket) { Ok(_) => Ok(Responses::Empty()), Err(e) => Err(e) } @@ -374,27 +374,32 @@ impl DatastoreInstance { match res { Ok(_) => { - let rowid = conn.last_insert_rowid(); - let mut inserted_bucket = bucket.clone(); - inserted_bucket.bid = Some(rowid); - - info!("Created bucket {}", inserted_bucket.id); - self.buckets_cache.insert(bucket.id.clone(), inserted_bucket); + info!("Created bucket {}", bucket.id); + // Get and set rowid + let rowid : i64 = conn.last_insert_rowid(); + bucket.bid = Some(rowid); + // Take out events from struct before caching + let events = bucket.events; + bucket.events = None; + // Cache bucket + self.buckets_cache.insert(bucket.id.clone(), bucket.clone()); self.commit = true; + // Insert events + if let Some(events) = events { + self.insert_events(conn, &bucket.id, events)?; + bucket.events = None; + } + Ok(()) }, // FIXME: This match is ugly, is it possible to write it in a cleaner way? Err(err) => match err { rusqlite::Error::SqliteFailure { 0: sqlerr, 1: _} => match sqlerr.code { - rusqlite::ErrorCode::ConstraintViolation => { return Err(DatastoreError::BucketAlreadyExists); }, - _ => return Err(DatastoreError::InternalError(format!("Failed to execute create_bucket SQL statement: {}", err))) + rusqlite::ErrorCode::ConstraintViolation => Err(DatastoreError::BucketAlreadyExists), + _ => Err(DatastoreError::InternalError(format!("Failed to execute create_bucket SQL statement: {}", err))) }, - _ => return Err(DatastoreError::InternalError(format!("Failed to execute create_bucket SQL statement: {}", err))) + _ => Err(DatastoreError::InternalError(format!("Failed to execute create_bucket SQL statement: {}", err))) } - }; - if let Some(events) = bucket.events { - self.insert_events(conn, &bucket.id, events)?; } - return Ok(()); } fn delete_bucket(&mut self, conn: &Connection, bucket_id: &str) -> Result<(), DatastoreError>{ diff --git a/src/models/bucket.rs b/src/models/bucket.rs index 75e2bf81..eabc26a2 100644 --- a/src/models/bucket.rs +++ b/src/models/bucket.rs @@ -21,7 +21,7 @@ pub struct Bucket { pub data: Map, #[serde(default, skip_deserializing)] pub metadata: BucketMetadata, - pub events: Option>, + pub events: Option>, /* Should only be set during import/export */ } #[derive(Serialize, Deserialize, Clone, Debug)]