• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 //! This module defines the common data structure of the database module.
17 
18 use std::{cmp::Ordering, collections::HashMap};
19 
20 use asset_definition::{DataType, ErrCode, Value, WrapType};
21 
22 /// A Map type containing tag-value pairs that describe the attributes of an DB field.
23 pub type DbMap = HashMap<&'static str, Value>;
24 
25 /// Table name of asset database.
26 pub const TABLE_NAME: &str = "asset_table";
27 
28 /// Table name for cloud adapt.
29 pub(crate) const ADAPT_CLOUD_TABLE: &str = "adapt_cloud_table";
30 
31 /// Version V1 number for upgrade database
32 pub const DB_UPGRADE_VERSION_V1: u32 = 0;
33 /// Version V2 number for upgrade database
34 pub const DB_UPGRADE_VERSION_V2: u32 = 1;
35 /// Version V3 number for upgrade database
36 pub const DB_UPGRADE_VERSION_V3: u32 = 2;
37 /// Version V4 number for upgrade database
38 pub const DB_UPGRADE_VERSION_V4: u32 = 3;
39 /// Latest version number for upgrade database
40 pub const DB_UPGRADE_VERSION: u32 = 4;
41 
42 /// Version 1 number
43 pub const DB_DATA_VERSION_V1: u32 = 1;
44 /// Version 2 number
45 pub const DB_DATA_VERSION_V2: u32 = 2;
46 /// Version 3 number
47 pub const DB_DATA_VERSION_V3: u32 = 3;
48 /// Latest data version number.
49 pub const DB_DATA_VERSION: u32 = 4;
50 /// Column name of asset database.
51 pub mod column {
52     /// Column name of the primary key Id.
53     pub const ID: &str = "Id";
54     /// Column name of secret cipher.
55     pub const SECRET: &str = "Secret";
56     /// Column name of data alias.
57     pub const ALIAS: &str = "Alias";
58     /// Column name of data owner.
59     pub const OWNER: &str = "Owner";
60     /// Column name of owner type.
61     pub const OWNER_TYPE: &str = "OwnerType";
62     /// Column name of (developerId + "," + groupId) of a group.
63     pub const GROUP_ID: &str = "GroupId";
64     /// Column name of data synchronization type.
65     pub const SYNC_TYPE: &str = "SyncType";
66     /// Column name of data accessibility
67     pub const ACCESSIBILITY: &str = "Accessibility";
68     /// Column name of the user authentication type supported by the data
69     pub const AUTH_TYPE: &str = "AuthType";
70     /// Column name of data creation time.
71     pub const CREATE_TIME: &str = "CreateTime";
72     /// Column name of the data update time.
73     pub const UPDATE_TIME: &str = "UpdateTime";
74     /// Column name of the data persistence attribute.
75     pub const IS_PERSISTENT: &str = "IsPersistent";
76     /// Column name of the data version number.
77     pub const VERSION: &str = "Version";
78     /// Column name of if data require password set
79     pub const REQUIRE_PASSWORD_SET: &str = "RequirePasswordSet";
80     /// Column name of the first critical data label.
81     pub const CRITICAL1: &str = "DataLabelCritical_1";
82     /// Column name of the second critical data label.
83     pub const CRITICAL2: &str = "DataLabelCritical_2";
84     /// Column name of the third critical data label.
85     pub const CRITICAL3: &str = "DataLabelCritical_3";
86     /// Column name of the fourth critical data label.
87     pub const CRITICAL4: &str = "DataLabelCritical_4";
88     /// Column name of the first normal data label.
89     pub const NORMAL1: &str = "DataLabelNormal_1";
90     /// Column name of the second normal data label.
91     pub const NORMAL2: &str = "DataLabelNormal_2";
92     /// Column name of the third normal data label.
93     pub const NORMAL3: &str = "DataLabelNormal_3";
94     /// Column name of the fourth normal data label.
95     pub const NORMAL4: &str = "DataLabelNormal_4";
96     /// Column name of the first normal local data label.
97     pub const NORMAL_LOCAL1: &str = "DataLabelNormalLocal_1";
98     /// Column name of the second normal local data label.
99     pub const NORMAL_LOCAL2: &str = "DataLabelNormalLocal_2";
100     /// Column name of the third normal local data label.
101     pub const NORMAL_LOCAL3: &str = "DataLabelNormalLocal_3";
102     /// Column name of the fourth normal local data label.
103     pub const NORMAL_LOCAL4: &str = "DataLabelNormalLocal_4";
104     /// Column name of the first normal local data label.
105     pub const GLOBAL_ID: &str = "GlobalId";
106     /// Column name of the second normal local data label.
107     pub const CLOUD_VERSION: &str = "CloudVersion";
108     /// Column name of the third normal local data label.
109     pub const LOCAL_STATUS: &str = "LocalStatus";
110     /// Column name of the fourth normal local data label.
111     pub const SYNC_STATUS: &str = "SyncStatus";
112     /// Column name of the ext data info.
113     pub const EXT_INFO: &str = "ExtInfo";
114     /// Column name of the wrap type info.
115     pub const WRAP_TYPE: &str = "WrapType";
116 }
117 
118 /// Column name of asset database.
119 pub mod adapt_column {
120     /// Column name of the global id.
121     pub const OLD_GLOBAL_ID: &str = "OldGlobalId";
122     /// Column name of the new global id.
123     pub const NEW_GLOBAL_ID: &str = "NewGlobalId";
124     /// Column name of the new data CloudVersion.
125     pub const NEW_CLOUD_VERSION: &str = "NewCloudVersion";
126 }
127 
128 #[repr(C)]
129 #[derive(Clone, Copy)]
130 pub(crate) struct ColumnInfo {
131     pub(crate) name: &'static str,
132     pub(crate) data_type: DataType,
133     pub(crate) is_primary_key: bool,
134     pub(crate) not_null: bool,
135 }
136 
137 pub(crate) const COLUMN_INFO: &[ColumnInfo] = &[
138     ColumnInfo { name: column::ID, data_type: DataType::Number, is_primary_key: true, not_null: true },
139     ColumnInfo { name: column::SECRET, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
140     ColumnInfo { name: column::ALIAS, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
141     ColumnInfo { name: column::OWNER, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
142     ColumnInfo { name: column::OWNER_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
143     ColumnInfo { name: column::GROUP_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
144     ColumnInfo { name: column::SYNC_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
145     ColumnInfo { name: column::ACCESSIBILITY, data_type: DataType::Number, is_primary_key: false, not_null: true },
146     ColumnInfo { name: column::AUTH_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
147     ColumnInfo { name: column::CREATE_TIME, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
148     ColumnInfo { name: column::UPDATE_TIME, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
149     ColumnInfo { name: column::IS_PERSISTENT, data_type: DataType::Bool, is_primary_key: false, not_null: true },
150     ColumnInfo { name: column::VERSION, data_type: DataType::Number, is_primary_key: false, not_null: true },
151     ColumnInfo { name: column::REQUIRE_PASSWORD_SET, data_type: DataType::Bool, is_primary_key: false, not_null: true },
152     ColumnInfo { name: column::CRITICAL1, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
153     ColumnInfo { name: column::CRITICAL2, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
154     ColumnInfo { name: column::CRITICAL3, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
155     ColumnInfo { name: column::CRITICAL4, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
156     ColumnInfo { name: column::NORMAL1, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
157     ColumnInfo { name: column::NORMAL2, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
158     ColumnInfo { name: column::NORMAL3, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
159     ColumnInfo { name: column::NORMAL4, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
160     ColumnInfo { name: column::NORMAL_LOCAL1, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
161     ColumnInfo { name: column::NORMAL_LOCAL2, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
162     ColumnInfo { name: column::NORMAL_LOCAL3, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
163     ColumnInfo { name: column::NORMAL_LOCAL4, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
164     ColumnInfo { name: column::GLOBAL_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
165     ColumnInfo { name: column::CLOUD_VERSION, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
166     ColumnInfo { name: column::LOCAL_STATUS, data_type: DataType::Number, is_primary_key: false, not_null: true },
167     ColumnInfo { name: column::SYNC_STATUS, data_type: DataType::Number, is_primary_key: false, not_null: true },
168     ColumnInfo { name: column::EXT_INFO, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
169     ColumnInfo { name: column::WRAP_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
170 ];
171 
172 pub(crate) const ADAPT_CLOUD_COLUMN_INFO: &[ColumnInfo] = &[
173     ColumnInfo { name: adapt_column::OLD_GLOBAL_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
174     ColumnInfo { name: adapt_column::NEW_GLOBAL_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
175     ColumnInfo { name: adapt_column::NEW_CLOUD_VERSION, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
176 ];
177 
178 pub(crate) const COMBINE_COLUMN_INFO: &[ColumnInfo] = &[
179     ColumnInfo { name: column::ID, data_type: DataType::Number, is_primary_key: true, not_null: true },
180     ColumnInfo { name: column::SECRET, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
181     ColumnInfo { name: column::ALIAS, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
182     ColumnInfo { name: column::OWNER, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
183     ColumnInfo { name: column::OWNER_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
184     ColumnInfo { name: column::GROUP_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
185     ColumnInfo { name: column::SYNC_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
186     ColumnInfo { name: column::ACCESSIBILITY, data_type: DataType::Number, is_primary_key: false, not_null: true },
187     ColumnInfo { name: column::AUTH_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
188     ColumnInfo { name: column::CREATE_TIME, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
189     ColumnInfo { name: column::UPDATE_TIME, data_type: DataType::Bytes, is_primary_key: false, not_null: true },
190     ColumnInfo { name: column::IS_PERSISTENT, data_type: DataType::Bool, is_primary_key: false, not_null: true },
191     ColumnInfo { name: column::VERSION, data_type: DataType::Number, is_primary_key: false, not_null: true },
192     ColumnInfo { name: column::REQUIRE_PASSWORD_SET, data_type: DataType::Bool, is_primary_key: false, not_null: true },
193     ColumnInfo { name: column::CRITICAL1, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
194     ColumnInfo { name: column::CRITICAL2, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
195     ColumnInfo { name: column::CRITICAL3, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
196     ColumnInfo { name: column::CRITICAL4, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
197     ColumnInfo { name: column::NORMAL1, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
198     ColumnInfo { name: column::NORMAL2, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
199     ColumnInfo { name: column::NORMAL3, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
200     ColumnInfo { name: column::NORMAL4, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
201     ColumnInfo { name: column::NORMAL_LOCAL1, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
202     ColumnInfo { name: column::NORMAL_LOCAL2, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
203     ColumnInfo { name: column::NORMAL_LOCAL3, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
204     ColumnInfo { name: column::NORMAL_LOCAL4, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
205     ColumnInfo { name: column::GLOBAL_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
206     ColumnInfo { name: column::CLOUD_VERSION, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
207     ColumnInfo { name: column::LOCAL_STATUS, data_type: DataType::Number, is_primary_key: false, not_null: true },
208     ColumnInfo { name: column::SYNC_STATUS, data_type: DataType::Number, is_primary_key: false, not_null: true },
209     ColumnInfo { name: column::EXT_INFO, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
210     ColumnInfo { name: column::WRAP_TYPE, data_type: DataType::Number, is_primary_key: false, not_null: true },
211     ColumnInfo { name: adapt_column::OLD_GLOBAL_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
212     ColumnInfo { name: adapt_column::NEW_GLOBAL_ID, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
213     ColumnInfo { name: adapt_column::NEW_CLOUD_VERSION, data_type: DataType::Bytes, is_primary_key: false, not_null: false },
214 ];
215 
216 pub(crate) struct UpgradeColumnInfo {
217     pub(crate) base_info: ColumnInfo,
218     pub(crate) default_value: Option<Value>,
219 }
220 
221 pub(crate) const UPGRADE_COLUMN_INFO_V2: &[UpgradeColumnInfo] = &[
222     UpgradeColumnInfo {
223         base_info: ColumnInfo {
224             name: column::NORMAL_LOCAL1,
225             data_type: DataType::Bytes,
226             is_primary_key: false,
227             not_null: false,
228         },
229         default_value: None,
230     },
231     UpgradeColumnInfo {
232         base_info: ColumnInfo {
233             name: column::NORMAL_LOCAL2,
234             data_type: DataType::Bytes,
235             is_primary_key: false,
236             not_null: false,
237         },
238         default_value: None,
239     },
240     UpgradeColumnInfo {
241         base_info: ColumnInfo {
242             name: column::NORMAL_LOCAL3,
243             data_type: DataType::Bytes,
244             is_primary_key: false,
245             not_null: false,
246         },
247         default_value: None,
248     },
249     UpgradeColumnInfo {
250         base_info: ColumnInfo {
251             name: column::NORMAL_LOCAL4,
252             data_type: DataType::Bytes,
253             is_primary_key: false,
254             not_null: false,
255         },
256         default_value: None,
257     },
258     UpgradeColumnInfo {
259         base_info: ColumnInfo {
260             name: column::GLOBAL_ID,
261             data_type: DataType::Bytes,
262             is_primary_key: false,
263             not_null: false,
264         },
265         default_value: None,
266     },
267     UpgradeColumnInfo {
268         base_info: ColumnInfo {
269             name: column::CLOUD_VERSION,
270             data_type: DataType::Bytes,
271             is_primary_key: false,
272             not_null: false,
273         },
274         default_value: None,
275     },
276     UpgradeColumnInfo {
277         base_info: ColumnInfo {
278             name: column::LOCAL_STATUS,
279             data_type: DataType::Number,
280             is_primary_key: false,
281             not_null: true,
282         },
283         default_value: Some(Value::Number(0)),
284     },
285     UpgradeColumnInfo {
286         base_info: ColumnInfo {
287             name: column::SYNC_STATUS,
288             data_type: DataType::Number,
289             is_primary_key: false,
290             not_null: true,
291         },
292         default_value: Some(Value::Number(0)),
293     },
294 ];
295 
296 pub(crate) const UPGRADE_COLUMN_INFO_V3: &[UpgradeColumnInfo] = &[UpgradeColumnInfo {
297     base_info: ColumnInfo {
298         name: column::EXT_INFO,
299         data_type: DataType::Bytes,
300         is_primary_key: false,
301         not_null: false,
302     },
303     default_value: None,
304 }];
305 
306 pub(crate) const UPGRADE_COLUMN_INFO_V4: &[UpgradeColumnInfo] = &[];
307 
308 pub(crate) const UPGRADE_COLUMN_INFO: &[UpgradeColumnInfo] = &[UpgradeColumnInfo {
309     base_info: ColumnInfo {
310         name: column::WRAP_TYPE,
311         data_type: DataType::Number,
312         is_primary_key: false,
313         not_null: true,
314     },
315     default_value: Some(Value::Number(WrapType::Never as u32)),
316 }];
317 
318 /// Options for batch query.
319 #[repr(C)]
320 pub struct QueryOptions {
321     /// The offset of the query result.
322     pub offset: Option<u32>,
323     /// Maximum number of query results.
324     pub limit: Option<u32>,
325     /// ordering: Ordering::Greater => ASC and Ordering::Less => DESC
326     pub order: Option<Ordering>,
327     /// Columns used for sorting.
328     pub order_by: Option<Vec<&'static str>>,
329     /// Add extra to where.
330     pub amend: Option<String>,
331 }
332 
333 pub(crate) const SQLITE_OK: i32 = 0;
334 pub(crate) const SQLITE_NOMEM: i32 = 7;
335 pub(crate) const SQLITE_CORRUPT: i32 = 11;
336 pub(crate) const SQLITE_NOTADB: i32 = 26;
337 /// Another row willed queried by function: sqlite3_step().
338 pub(crate) const SQLITE_ROW: i32 = 100;
339 /// End the execution of function sqlite3_step().
340 pub(crate) const SQLITE_DONE: i32 = 101;
341 
sqlite_err_handle(ret: i32) -> ErrCode342 pub(crate) fn sqlite_err_handle(ret: i32) -> ErrCode {
343     match ret {
344         SQLITE_CORRUPT | SQLITE_NOTADB => ErrCode::DataCorrupted,
345         SQLITE_NOMEM => ErrCode::OutOfMemory,
346         _ => ErrCode::DatabaseError,
347     }
348 }
349