1 /*
2  * Copyright (c) 2022 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 "napi_rdb_const_properties.h"
17 #include "rdb_common.h"
18 #include "rdb_store.h"
19 #include "js_utils.h"
20 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
21 #include "rdb_store_config.h"
22 #include "rdb_types.h"
23 
24 using OHOS::DistributedRdb::SyncMode;
25 using OHOS::DistributedRdb::SubscribeMode;
26 
27 #endif
28 using OHOS::NativeRdb::SecurityLevel;
29 using OHOS::NativeRdb::ConflictResolution;
30 using OHOS::DistributedRdb::ProgressCode;
31 using OHOS::DistributedRdb::DistributedTableType;
32 
33 #define SET_NAPI_PROPERTY(object, prop, value)                         \
34     napi_set_named_property((env), (object), (prop), AppDataMgrJsKit::JSUtils::Convert2JSValue((env), (value)))
35 
36 namespace OHOS::RelationalStoreJsKit {
37 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
38 
ExportSyncMode(napi_env env)39 static napi_value ExportSyncMode(napi_env env)
40 {
41     napi_value syncMode = nullptr;
42     napi_create_object(env, &syncMode);
43 
44     SET_NAPI_PROPERTY(syncMode, "SYNC_MODE_PUSH", int32_t(SyncMode::PUSH));
45     SET_NAPI_PROPERTY(syncMode, "SYNC_MODE_PULL", int32_t(SyncMode::PULL));
46     SET_NAPI_PROPERTY(syncMode, "SYNC_MODE_TIME_FIRST", int32_t(SyncMode::TIME_FIRST));
47     SET_NAPI_PROPERTY(syncMode, "SYNC_MODE_NATIVE_FIRST", int32_t(SyncMode::NATIVE_FIRST));
48     SET_NAPI_PROPERTY(syncMode, "SYNC_MODE_CLOUD_FIRST", int32_t(SyncMode::CLOUD_FIRST));
49     napi_object_freeze(env, syncMode);
50     return syncMode;
51 }
52 
ExportSubscribeType(napi_env env)53 static napi_value ExportSubscribeType(napi_env env)
54 {
55     napi_value subscribeType = nullptr;
56     napi_create_object(env, &subscribeType);
57 
58     SET_NAPI_PROPERTY(subscribeType, "SUBSCRIBE_TYPE_REMOTE", int32_t(SubscribeMode::REMOTE));
59     SET_NAPI_PROPERTY(subscribeType, "SUBSCRIBE_TYPE_CLOUD", int32_t(SubscribeMode::CLOUD));
60     SET_NAPI_PROPERTY(subscribeType, "SUBSCRIBE_TYPE_CLOUD_DETAILS", int32_t(SubscribeMode::CLOUD_DETAIL));
61     SET_NAPI_PROPERTY(subscribeType, "SUBSCRIBE_TYPE_LOCAL_DETAILS", int32_t(SubscribeMode::LOCAL_DETAIL));
62     napi_object_freeze(env, subscribeType);
63     return subscribeType;
64 }
65 
ExportSecurityLevel(napi_env env)66 static napi_value ExportSecurityLevel(napi_env env)
67 {
68     napi_value securityLevel = nullptr;
69     napi_create_object(env, &securityLevel);
70 
71     SET_NAPI_PROPERTY(securityLevel, "S1", int32_t(SecurityLevel::S1));
72     SET_NAPI_PROPERTY(securityLevel, "S2", int32_t(SecurityLevel::S2));
73     SET_NAPI_PROPERTY(securityLevel, "S3", int32_t(SecurityLevel::S3));
74     SET_NAPI_PROPERTY(securityLevel, "S4", int32_t(SecurityLevel::S4));
75     napi_object_freeze(env, securityLevel);
76     return securityLevel;
77 }
78 #endif
79 
ExportProgress(napi_env env)80 static napi_value ExportProgress(napi_env env)
81 {
82     napi_value progress = nullptr;
83     napi_create_object(env, &progress);
84 
85     SET_NAPI_PROPERTY(progress, "SYNC_BEGIN", int32_t(DistributedRdb::Progress::SYNC_BEGIN));
86     SET_NAPI_PROPERTY(progress, "SYNC_IN_PROGRESS", int32_t(DistributedRdb::Progress::SYNC_IN_PROGRESS));
87     SET_NAPI_PROPERTY(progress, "SYNC_FINISH", int32_t(DistributedRdb::Progress::SYNC_FINISH));
88     napi_object_freeze(env, progress);
89     return progress;
90 }
91 
ExportProgressCode(napi_env env)92 static napi_value ExportProgressCode(napi_env env)
93 {
94     napi_value progressCode = nullptr;
95     napi_create_object(env, &progressCode);
96 
97     SET_NAPI_PROPERTY(progressCode, "SUCCESS", int32_t(ProgressCode::SUCCESS));
98     SET_NAPI_PROPERTY(progressCode, "UNKNOWN_ERROR", int32_t(ProgressCode::UNKNOWN_ERROR));
99     SET_NAPI_PROPERTY(progressCode, "NETWORK_ERROR", int32_t(ProgressCode::NETWORK_ERROR));
100     SET_NAPI_PROPERTY(progressCode, "CLOUD_DISABLED", int32_t(ProgressCode::CLOUD_DISABLED));
101     SET_NAPI_PROPERTY(progressCode, "LOCKED_BY_OTHERS", int32_t(ProgressCode::LOCKED_BY_OTHERS));
102     SET_NAPI_PROPERTY(progressCode, "RECORD_LIMIT_EXCEEDED", int32_t(ProgressCode::RECORD_LIMIT_EXCEEDED));
103     SET_NAPI_PROPERTY(progressCode, "NO_SPACE_FOR_ASSET", int32_t(ProgressCode::NO_SPACE_FOR_ASSET));
104     SET_NAPI_PROPERTY(progressCode, "BLOCKED_BY_NETWORK_STRATEGY", int32_t(ProgressCode::BLOCKED_BY_NETWORK_STRATEGY));
105     napi_object_freeze(env, progressCode);
106     return progressCode;
107 }
108 
ExportOrigin(napi_env env)109 static napi_value ExportOrigin(napi_env env)
110 {
111     napi_value origin = nullptr;
112     napi_create_object(env, &origin);
113 
114     SET_NAPI_PROPERTY(origin, "LOCAL", int32_t(NativeRdb::AbsPredicates::Origin::LOCAL));
115     SET_NAPI_PROPERTY(origin, "CLOUD", int32_t(NativeRdb::AbsPredicates::Origin::CLOUD));
116     SET_NAPI_PROPERTY(origin, "REMOTE", int32_t(NativeRdb::AbsPredicates::Origin::REMOTE));
117     napi_object_freeze(env, origin);
118     return origin;
119 }
120 
ExportField(napi_env env)121 static napi_value ExportField(napi_env env)
122 {
123     napi_value field = nullptr;
124     napi_create_object(env, &field);
125 
126     SET_NAPI_PROPERTY(field, "CURSOR_FIELD", std::string(DistributedRdb::Field::CURSOR_FIELD));
127     SET_NAPI_PROPERTY(field, "ORIGIN_FIELD", std::string(DistributedRdb::Field::ORIGIN_FIELD));
128     SET_NAPI_PROPERTY(field, "DELETED_FLAG_FIELD", std::string(DistributedRdb::Field::DELETED_FLAG_FIELD));
129     SET_NAPI_PROPERTY(field, "DATA_STATUS_FIELD", std::string(DistributedRdb::Field::DATA_STATUS_FIELD));
130     SET_NAPI_PROPERTY(field, "OWNER_FIELD", std::string(DistributedRdb::Field::OWNER_FIELD));
131     SET_NAPI_PROPERTY(field, "PRIVILEGE_FIELD", std::string(DistributedRdb::Field::PRIVILEGE_FIELD));
132     SET_NAPI_PROPERTY(field, "SHARING_RESOURCE_FIELD", std::string(DistributedRdb::Field::SHARING_RESOURCE_FIELD));
133     napi_object_freeze(env, field);
134     return field;
135 }
136 
ExportDistributedType(napi_env env)137 static napi_value ExportDistributedType(napi_env env)
138 {
139     napi_value distributedType = nullptr;
140     napi_create_object(env, &distributedType);
141 
142     SET_NAPI_PROPERTY(distributedType, "DISTRIBUTED_DEVICE", int32_t(DistributedTableType::DISTRIBUTED_DEVICE));
143     SET_NAPI_PROPERTY(distributedType, "DISTRIBUTED_CLOUD", int32_t(DistributedTableType::DISTRIBUTED_CLOUD));
144     napi_object_freeze(env, distributedType);
145     return distributedType;
146 }
147 
ExportChangeType(napi_env env)148 static napi_value ExportChangeType(napi_env env)
149 {
150     napi_value changeType = nullptr;
151     napi_create_object(env, &changeType);
152 
153     SET_NAPI_PROPERTY(changeType, "DATA_CHANGE", int32_t(DistributedRdb::Origin::BASIC_DATA));
154     SET_NAPI_PROPERTY(changeType, "ASSET_CHANGE", int32_t(DistributedRdb::Origin::ASSET_DATA));
155     napi_object_freeze(env, changeType);
156     return changeType;
157 }
158 
ExportAssetStatus(napi_env env)159 static napi_value ExportAssetStatus(napi_env env)
160 {
161     napi_value assetStatus = nullptr;
162     napi_create_object(env, &assetStatus);
163 
164     SET_NAPI_PROPERTY(assetStatus, "ASSET_NORMAL", int32_t(NativeRdb::AssetValue::STATUS_NORMAL));
165     SET_NAPI_PROPERTY(assetStatus, "ASSET_INSERT", int32_t(NativeRdb::AssetValue::STATUS_INSERT));
166     SET_NAPI_PROPERTY(assetStatus, "ASSET_UPDATE", int32_t(NativeRdb::AssetValue::STATUS_UPDATE));
167     SET_NAPI_PROPERTY(assetStatus, "ASSET_DELETE", int32_t(NativeRdb::AssetValue::STATUS_DELETE));
168     SET_NAPI_PROPERTY(assetStatus, "ASSET_ABNORMAL", int32_t(NativeRdb::AssetValue::STATUS_ABNORMAL));
169     SET_NAPI_PROPERTY(assetStatus, "ASSET_DOWNLOADING", int32_t(NativeRdb::AssetValue::STATUS_DOWNLOADING));
170     napi_object_freeze(env, assetStatus);
171     return assetStatus;
172 }
173 
ExportConflictResolution(napi_env env)174 static napi_value ExportConflictResolution(napi_env env)
175 {
176     napi_value conflictResolution = nullptr;
177     napi_create_object(env, &conflictResolution);
178 
179     SET_NAPI_PROPERTY(conflictResolution, "ON_CONFLICT_NONE", int32_t(ConflictResolution::ON_CONFLICT_NONE));
180     SET_NAPI_PROPERTY(conflictResolution, "ON_CONFLICT_ROLLBACK", int32_t(ConflictResolution::ON_CONFLICT_ROLLBACK));
181     SET_NAPI_PROPERTY(conflictResolution, "ON_CONFLICT_ABORT", int32_t(ConflictResolution::ON_CONFLICT_ABORT));
182     SET_NAPI_PROPERTY(conflictResolution, "ON_CONFLICT_FAIL", int32_t(ConflictResolution::ON_CONFLICT_FAIL));
183     SET_NAPI_PROPERTY(conflictResolution, "ON_CONFLICT_IGNORE", int32_t(ConflictResolution::ON_CONFLICT_IGNORE));
184     SET_NAPI_PROPERTY(conflictResolution, "ON_CONFLICT_REPLACE", int32_t(ConflictResolution::ON_CONFLICT_REPLACE));
185 
186     napi_object_freeze(env, conflictResolution);
187     return conflictResolution;
188 }
189 
ExportRebuiltType(napi_env env)190 static napi_value ExportRebuiltType(napi_env env)
191 {
192     napi_value rebuiltType = nullptr;
193     napi_create_object(env, &rebuiltType);
194 
195     SET_NAPI_PROPERTY(rebuiltType, "NONE", int32_t(NativeRdb::RebuiltType::NONE));
196     SET_NAPI_PROPERTY(rebuiltType, "REBUILT", int32_t(NativeRdb::RebuiltType::REBUILT));
197     SET_NAPI_PROPERTY(rebuiltType, "REPAIRED", int32_t(NativeRdb::RebuiltType::REPAIRED));
198 
199     napi_object_freeze(env, rebuiltType);
200     return rebuiltType;
201 }
202 
ExportHAMode(napi_env env)203 static napi_value ExportHAMode(napi_env env)
204 {
205     napi_value haMode = nullptr;
206     napi_create_object(env, &haMode);
207 
208     SET_NAPI_PROPERTY(haMode, "SINGLE", int32_t(NativeRdb::HAMode::SINGLE));
209     SET_NAPI_PROPERTY(haMode, "MAIN_REPLICA", int32_t(NativeRdb::HAMode::MAIN_REPLICA));
210     napi_object_freeze(env, haMode);
211     return haMode;
212 }
213 
ExportEncryptionAlgo(napi_env env)214 static napi_value ExportEncryptionAlgo(napi_env env)
215 {
216     napi_value encryptionAlgo = nullptr;
217     napi_create_object(env, &encryptionAlgo);
218 
219     SET_NAPI_PROPERTY(encryptionAlgo, "AES_256_GCM", int32_t(NativeRdb::EncryptAlgo::AES_256_GCM));
220     SET_NAPI_PROPERTY(encryptionAlgo, "AES_256_CBC", int32_t(NativeRdb::EncryptAlgo::AES_256_CBC));
221     napi_object_freeze(env, encryptionAlgo);
222     return encryptionAlgo;
223 }
224 
ExportHmacAlgo(napi_env env)225 static napi_value ExportHmacAlgo(napi_env env)
226 {
227     napi_value hmacAlgo = nullptr;
228     napi_create_object(env, &hmacAlgo);
229 
230     SET_NAPI_PROPERTY(hmacAlgo, "SHA1", int32_t(NativeRdb::HmacAlgo::SHA1));
231     SET_NAPI_PROPERTY(hmacAlgo, "SHA256", int32_t(NativeRdb::HmacAlgo::SHA256));
232     SET_NAPI_PROPERTY(hmacAlgo, "SHA512", int32_t(NativeRdb::HmacAlgo::SHA512));
233     napi_object_freeze(env, hmacAlgo);
234     return hmacAlgo;
235 }
236 
ExportKdfAlgo(napi_env env)237 static napi_value ExportKdfAlgo(napi_env env)
238 {
239     napi_value kdfAlgo = nullptr;
240     napi_create_object(env, &kdfAlgo);
241 
242     SET_NAPI_PROPERTY(kdfAlgo, "KDF_SHA1", int32_t(NativeRdb::KdfAlgo::KDF_SHA1));
243     SET_NAPI_PROPERTY(kdfAlgo, "KDF_SHA256", int32_t(NativeRdb::KdfAlgo::KDF_SHA256));
244     SET_NAPI_PROPERTY(kdfAlgo, "KDF_SHA512", int32_t(NativeRdb::KdfAlgo::KDF_SHA512));
245     napi_object_freeze(env, kdfAlgo);
246     return kdfAlgo;
247 }
248 
ExportTransactionType(napi_env env)249 static napi_value ExportTransactionType(napi_env env)
250 {
251     napi_value transactionType = nullptr;
252     napi_create_object(env, &transactionType);
253 
254     SET_NAPI_PROPERTY(transactionType, "DEFERRED", int32_t(NativeRdb::Transaction::DEFERRED));
255     SET_NAPI_PROPERTY(transactionType, "IMMEDIATE", int32_t(NativeRdb::Transaction::IMMEDIATE));
256     SET_NAPI_PROPERTY(transactionType, "EXCLUSIVE", int32_t(NativeRdb::Transaction::EXCLUSIVE));
257     napi_object_freeze(env, transactionType);
258     return transactionType;
259 }
260 
InitConstProperties(napi_env env,napi_value exports)261 napi_status InitConstProperties(napi_env env, napi_value exports)
262 {
263     const napi_property_descriptor properties[] = {
264         DECLARE_NAPI_PROPERTY("ConflictResolution", ExportConflictResolution(env)),
265 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
266         DECLARE_NAPI_PROPERTY("SyncMode", ExportSyncMode(env)),
267         DECLARE_NAPI_PROPERTY("SubscribeType", ExportSubscribeType(env)),
268         DECLARE_NAPI_PROPERTY("SecurityLevel", ExportSecurityLevel(env)),
269 #endif
270         DECLARE_NAPI_PROPERTY("Progress", ExportProgress(env)),
271         DECLARE_NAPI_PROPERTY("ProgressCode", ExportProgressCode(env)),
272         DECLARE_NAPI_PROPERTY("DistributedType", ExportDistributedType(env)),
273         DECLARE_NAPI_PROPERTY("AssetStatus", ExportAssetStatus(env)),
274         DECLARE_NAPI_PROPERTY("ChangeType", ExportChangeType(env)),
275         DECLARE_NAPI_PROPERTY("Origin", ExportOrigin(env)),
276         DECLARE_NAPI_PROPERTY("Field", ExportField(env)),
277         DECLARE_NAPI_PROPERTY("RebuildType", ExportRebuiltType(env)),
278         DECLARE_NAPI_PROPERTY("HAMode", ExportHAMode(env)),
279         DECLARE_NAPI_PROPERTY("EncryptionAlgo", ExportEncryptionAlgo(env)),
280         DECLARE_NAPI_PROPERTY("HmacAlgo", ExportHmacAlgo(env)),
281         DECLARE_NAPI_PROPERTY("KdfAlgo", ExportKdfAlgo(env)),
282         DECLARE_NAPI_PROPERTY("TransactionType", ExportTransactionType(env)),
283     };
284 
285     size_t count = sizeof(properties) / sizeof(properties[0]);
286     return napi_define_properties(env, exports, count, properties);
287 }
288 } // namespace OHOS::RelationalStoreJsKit