1 // Copyright (C) 2024 Huawei Device Co., Ltd. 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 use cxx::{let_cxx_string, UniquePtr}; 15 16 pub use crate::wrapper::ffi::SecurityLevel; 17 use crate::wrapper::ffi::{NewConfig, RdbStoreConfig}; 18 use crate::RdbStore; 19 20 pub struct OpenConfig { 21 pub(crate) inner: UniquePtr<RdbStoreConfig>, 22 pub(crate) version: i32, 23 pub(crate) callback: Box<dyn OpenCallback>, 24 } 25 26 struct DefaultCallback; 27 impl OpenCallback for DefaultCallback {} 28 29 pub trait OpenCallback { on_create(&mut self, rdb: &mut RdbStore) -> i3230 fn on_create(&mut self, rdb: &mut RdbStore) -> i32 { 31 0 32 } on_upgrade(&mut self, rdb: &mut RdbStore, old_version: i32, new_version: i32) -> i3233 fn on_upgrade(&mut self, rdb: &mut RdbStore, old_version: i32, new_version: i32) -> i32 { 34 0 35 } on_downgrade( &mut self, rdb: &mut RdbStore, current_version: i32, target_version: i32, ) -> i3236 fn on_downgrade( 37 &mut self, 38 rdb: &mut RdbStore, 39 current_version: i32, 40 target_version: i32, 41 ) -> i32 { 42 0 43 } on_open(&mut self, rdb: &mut RdbStore) -> i3244 fn on_open(&mut self, rdb: &mut RdbStore) -> i32 { 45 0 46 } on_corrupt(&mut self, database_file: &str) -> i3247 fn on_corrupt(&mut self, database_file: &str) -> i32 { 48 0 49 } 50 } 51 52 impl OpenConfig { new(path: &str) -> Self53 pub fn new(path: &str) -> Self { 54 Self { 55 inner: NewConfig(path), 56 version: 1, 57 callback: Box::new(DefaultCallback), 58 } 59 } 60 security_level(&mut self, level: SecurityLevel) -> &mut Self61 pub fn security_level(&mut self, level: SecurityLevel) -> &mut Self { 62 self.inner.pin_mut().SetSecurityLevel(level); 63 self 64 } 65 encrypt_status(&mut self, status: bool) -> &mut Self66 pub fn encrypt_status(&mut self, status: bool) -> &mut Self { 67 self.inner.pin_mut().SetEncryptStatus(status); 68 self 69 } 70 bundle_name(&mut self, name: &str) -> &mut Self71 pub fn bundle_name(&mut self, name: &str) -> &mut Self { 72 let_cxx_string!(name = name); 73 self.inner.pin_mut().SetBundleName(&name); 74 self 75 } 76 callback(&mut self, callback: Box<dyn OpenCallback>) -> &mut Self77 pub fn callback(&mut self, callback: Box<dyn OpenCallback>) -> &mut Self { 78 self.callback = callback; 79 self 80 } 81 version(&mut self, version: i32) -> &mut Self82 pub fn version(&mut self, version: i32) -> &mut Self { 83 self.version = version; 84 self 85 } 86 } 87