1 /*
2 * Copyright (c) 2021 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 #include "single_ver_schema_database_upgrader.h"
17 #include "db_errno.h"
18 #include "log_print.h"
19
20 namespace DistributedDB {
SingleVerSchemaDatabaseUpgrader(const SchemaObject & newSchema)21 SingleVerSchemaDatabaseUpgrader::SingleVerSchemaDatabaseUpgrader(const SchemaObject &newSchema)
22 : newSchema_(newSchema)
23 {
24 }
25
ExecuteUpgrade()26 int SingleVerSchemaDatabaseUpgrader::ExecuteUpgrade()
27 {
28 // Calling the base class to upgrade the database structure first
29 int errCode = SingleVerDatabaseUpgrader::ExecuteUpgrade();
30 if (errCode != E_OK) {
31 LOGE("[SingleSchemaUp][ExecUp] Upgrade database structure fail, errCode=%d.", errCode);
32 return errCode;
33 }
34 return ExecuteUpgradeSchema();
35 }
36
ExecuteUpgradeSchema()37 int SingleVerSchemaDatabaseUpgrader::ExecuteUpgradeSchema()
38 {
39 // Upgrade value or index according to newSchema and oriDbSchema
40 LOGD("[SingleSchemaUp][ExecUp] Enter.");
41 if (!newSchema_.IsSchemaValid()) {
42 LOGI("[SingleSchemaUp][ExecUp] No schema newly designated.");
43 return E_OK;
44 }
45 SchemaObject oriSchemaObject;
46 int errCode = RestoreSchemaObjectFromDatabase(oriSchemaObject);
47 if (errCode != E_OK) {
48 return errCode;
49 }
50 // Judge and gather upgrade information
51 valueNeedUpgrade_ = false;
52 IndexDifference indexDiffer;
53 if (oriSchemaObject.IsSchemaValid()) {
54 errCode = oriSchemaObject.CompareAgainstSchemaObject(newSchema_, indexDiffer);
55 if (errCode == -E_SCHEMA_EQUAL_EXACTLY) {
56 LOGI("[SingleSchemaUp][ExecUp] NewSchema equal exactly with oriDbSchema.");
57 return E_OK;
58 } else if (errCode == -E_SCHEMA_UNEQUAL_INCOMPATIBLE) {
59 return -E_SCHEMA_MISMATCH;
60 } else if (errCode == -E_SCHEMA_UNEQUAL_COMPATIBLE_UPGRADE) {
61 valueNeedUpgrade_ = true;
62 }
63 // ValueNeedUpgrade false for case E_SCHEMA_UNEQUAL_COMPATIBLE
64 } else {
65 // Upgrade normalDb to schemaDb
66 valueNeedUpgrade_ = true;
67 indexDiffer.increase = newSchema_.GetIndexInfo();
68 }
69 // Remember to upgrade value first, upgrade index later, for both Json-Schema and FlatBuffer-Schema
70 if (valueNeedUpgrade_) {
71 errCode = UpgradeValues();
72 if (errCode != E_OK) {
73 return errCode;
74 }
75 }
76 errCode = UpgradeIndexes(indexDiffer);
77 if (errCode != E_OK) {
78 return errCode;
79 }
80 // Update schema into database file
81 return SetDatabaseSchema(newSchema_.ToSchemaString());
82 }
83
RestoreSchemaObjectFromDatabase(SchemaObject & outOriSchema) const84 int SingleVerSchemaDatabaseUpgrader::RestoreSchemaObjectFromDatabase(SchemaObject &outOriSchema) const
85 {
86 std::string oriDbSchema;
87 int errCode = GetDatabaseSchema(oriDbSchema); // If no schema in db should return E_OK with an empty string
88 if (errCode != E_OK) {
89 return errCode;
90 }
91 if (!oriDbSchema.empty()) {
92 errCode = outOriSchema.ParseFromSchemaString(oriDbSchema);
93 if (errCode != E_OK) {
94 LOGW("[SingleSchemaUp][ExecUp] Schema in dbFile parse fail, regard as no schema.");
95 }
96 }
97 return E_OK;
98 }
99 } // namespace DistributedDB
100