1 /*
2  * Copyright (c) 2024 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 "relational_store_ffi.h"
17 #include "relational_store_utils.h"
18 #include "napi_rdb_js_utils.h"
19 #include "rdb_errno.h"
20 #include "cj_lambda.h"
21 #include <cstdlib>
22 #include <cstdint>
23 
24 using namespace OHOS::FFI;
25 
26 namespace OHOS {
27 namespace Relational {
28 extern "C" {
FfiOHOSRelationalStoreGetRdbStore(OHOS::AbilityRuntime::Context * context,StoreConfig config,int32_t * errCode)29     int64_t FfiOHOSRelationalStoreGetRdbStore(OHOS::AbilityRuntime::Context* context, StoreConfig config,
30         int32_t *errCode)
31     {
32         return GetRdbStore(context, config, errCode);
33     }
34 
FfiOHOSRelationalStoreDeleteRdbStore(OHOS::AbilityRuntime::Context * context,const char * name,int32_t * errCode)35     void FfiOHOSRelationalStoreDeleteRdbStore(OHOS::AbilityRuntime::Context* context, const char* name,
36         int32_t *errCode)
37     {
38         DeleteRdbStore(context, name, errCode);
39     }
40 
FfiOHOSRelationalStoreDeleteRdbStoreConfig(OHOS::AbilityRuntime::Context * context,StoreConfig config,int32_t * errCode)41     void FfiOHOSRelationalStoreDeleteRdbStoreConfig(OHOS::AbilityRuntime::Context* context, StoreConfig config,
42         int32_t *errCode)
43     {
44         DeleteRdbStoreConfig(context, config, errCode);
45     }
46 
FfiOHOSRelationalStoreRdbPredicatesConstructor(const char * tableName)47     int64_t FfiOHOSRelationalStoreRdbPredicatesConstructor(const char* tableName)
48     {
49         auto nativeRdbPredicates = FFIData::Create<RdbPredicatesImpl>(tableName);
50         if (nativeRdbPredicates == nullptr) {
51             return -1;
52         }
53         return nativeRdbPredicates->GetID();
54     }
55 
FfiOHOSRelationalStoreInDevices(int64_t id,const char ** devicesArray,int64_t devicesSize)56     int32_t FfiOHOSRelationalStoreInDevices(int64_t id, const char** devicesArray, int64_t devicesSize)
57     {
58         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
59         if (nativeRdbPredicates == nullptr) {
60             return -1;
61         }
62         nativeRdbPredicates->InDevices(devicesArray, devicesSize);
63         return 0;
64     }
65 
FfiOHOSRelationalStoreInAllDevices(int64_t id)66     int32_t FfiOHOSRelationalStoreInAllDevices(int64_t id)
67     {
68         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
69         if (nativeRdbPredicates == nullptr) {
70             return -1;
71         }
72         nativeRdbPredicates->InAllDevices();
73         return 0;
74     }
75 
FfiOHOSRelationalStoreBeginWrap(int64_t id)76     int32_t FfiOHOSRelationalStoreBeginWrap(int64_t id)
77     {
78         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
79         if (nativeRdbPredicates == nullptr) {
80             return -1;
81         }
82         nativeRdbPredicates->BeginWrap();
83         return 0;
84     }
85 
FfiOHOSRelationalStoreEndWrap(int64_t id)86     int32_t FfiOHOSRelationalStoreEndWrap(int64_t id)
87     {
88         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
89         if (nativeRdbPredicates == nullptr) {
90             return -1;
91         }
92         nativeRdbPredicates->EndWrap();
93         return 0;
94     }
95 
FfiOHOSRelationalStoreOr(int64_t id)96     int32_t FfiOHOSRelationalStoreOr(int64_t id)
97     {
98         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
99         if (nativeRdbPredicates == nullptr) {
100             return -1;
101         }
102         nativeRdbPredicates->Or();
103         return 0;
104     }
105 
FfiOHOSRelationalStoreAnd(int64_t id)106     int32_t FfiOHOSRelationalStoreAnd(int64_t id)
107     {
108         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
109         if (nativeRdbPredicates == nullptr) {
110             return -1;
111         }
112         nativeRdbPredicates->And();
113         return 0;
114     }
115 
FfiOHOSRelationalStoreContains(int64_t id,const char * field,const char * value)116     int32_t FfiOHOSRelationalStoreContains(int64_t id, const char* field, const char* value)
117     {
118         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
119         if (nativeRdbPredicates == nullptr) {
120             return -1;
121         }
122         nativeRdbPredicates->Contains(field, value);
123         return 0;
124     }
125 
FfiOHOSRelationalStoreBeginsWith(int64_t id,const char * field,const char * value)126     int32_t FfiOHOSRelationalStoreBeginsWith(int64_t id, const char* field, const char* value)
127     {
128         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
129         if (nativeRdbPredicates == nullptr) {
130             return -1;
131         }
132         nativeRdbPredicates->BeginsWith(field, value);
133         return 0;
134     }
135 
FfiOHOSRelationalStoreEndsWith(int64_t id,const char * field,const char * value)136     int32_t FfiOHOSRelationalStoreEndsWith(int64_t id, const char* field, const char* value)
137     {
138         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
139         if (nativeRdbPredicates == nullptr) {
140             return -1;
141         }
142         nativeRdbPredicates->EndsWith(field, value);
143         return 0;
144     }
145 
FfiOHOSRelationalStoreIsNull(int64_t id,const char * field)146     int32_t FfiOHOSRelationalStoreIsNull(int64_t id, const char* field)
147     {
148         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
149         if (nativeRdbPredicates == nullptr) {
150             return -1;
151         }
152         nativeRdbPredicates->IsNull(field);
153         return 0;
154     }
155 
FfiOHOSRelationalStoreIsNotNull(int64_t id,const char * field)156     int32_t FfiOHOSRelationalStoreIsNotNull(int64_t id, const char* field)
157     {
158         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
159         if (nativeRdbPredicates == nullptr) {
160             return -1;
161         }
162         nativeRdbPredicates->IsNotNull(field);
163         return 0;
164     }
165 
FfiOHOSRelationalStoreLike(int64_t id,const char * field,const char * value)166     int32_t FfiOHOSRelationalStoreLike(int64_t id, const char* field, const char* value)
167     {
168         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
169         if (nativeRdbPredicates == nullptr) {
170             return -1;
171         }
172         nativeRdbPredicates->Like(field, value);
173         return 0;
174     }
175 
FfiOHOSRelationalStoreGlob(int64_t id,const char * field,const char * value)176     int32_t FfiOHOSRelationalStoreGlob(int64_t id, const char* field, const char* value)
177     {
178         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
179         if (nativeRdbPredicates == nullptr) {
180             return -1;
181         }
182         nativeRdbPredicates->Glob(field, value);
183         return 0;
184     }
185 
FfiOHOSRelationalStoreOrderByAsc(int64_t id,const char * field)186     int32_t FfiOHOSRelationalStoreOrderByAsc(int64_t id, const char* field)
187     {
188         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
189         if (nativeRdbPredicates == nullptr) {
190             return -1;
191         }
192         nativeRdbPredicates->OrderByAsc(field);
193         return 0;
194     }
195 
FfiOHOSRelationalStoreOrderByDesc(int64_t id,const char * field)196     int32_t FfiOHOSRelationalStoreOrderByDesc(int64_t id, const char* field)
197     {
198         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
199         if (nativeRdbPredicates == nullptr) {
200             return -1;
201         }
202         nativeRdbPredicates->OrderByDesc(field);
203         return 0;
204     }
205 
FfiOHOSRelationalStoreDistinct(int64_t id)206     int32_t FfiOHOSRelationalStoreDistinct(int64_t id)
207     {
208         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
209         if (nativeRdbPredicates == nullptr) {
210             return -1;
211         }
212         nativeRdbPredicates->Distinct();
213         return 0;
214     }
215 
FfiOHOSRelationalStoreLimitAs(int64_t id,int32_t value)216     int32_t FfiOHOSRelationalStoreLimitAs(int64_t id, int32_t value)
217     {
218         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
219         if (nativeRdbPredicates == nullptr) {
220             return -1;
221         }
222         nativeRdbPredicates->LimitAs(value);
223         return 0;
224     }
225 
FfiOHOSRelationalStoreOffsetAs(int64_t id,int32_t rowOffset)226     int32_t FfiOHOSRelationalStoreOffsetAs(int64_t id, int32_t rowOffset)
227     {
228         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
229         if (nativeRdbPredicates == nullptr) {
230             return -1;
231         }
232         nativeRdbPredicates->OffsetAs(rowOffset);
233         return 0;
234     }
235 
FfiOHOSRelationalStoreGroupBy(int64_t id,const char ** fieldsArray,int64_t fieldsSize)236     int32_t FfiOHOSRelationalStoreGroupBy(int64_t id, const char** fieldsArray, int64_t fieldsSize)
237     {
238         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
239         if (nativeRdbPredicates == nullptr) {
240             return -1;
241         }
242         nativeRdbPredicates->GroupBy(fieldsArray, fieldsSize);
243         return 0;
244     }
245 
FfiOHOSRelationalStoreIndexedBy(int64_t id,const char * field)246     int32_t FfiOHOSRelationalStoreIndexedBy(int64_t id, const char* field)
247     {
248         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
249         if (nativeRdbPredicates == nullptr) {
250             return -1;
251         }
252         nativeRdbPredicates->IndexedBy(field);
253         return 0;
254     }
255 
FfiOHOSRelationalStoreLessThanOrEqualTo(int64_t id,const char * field,ValueType value)256     int32_t FfiOHOSRelationalStoreLessThanOrEqualTo(int64_t id, const char* field, ValueType value)
257     {
258         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
259         if (nativeRdbPredicates == nullptr) {
260             return -1;
261         }
262         nativeRdbPredicates->LessThanOrEqualTo(field, value);
263         return 0;
264     }
265 
FfiOHOSRelationalStoreEqualTo(int64_t id,const char * field,ValueType value)266     int32_t FfiOHOSRelationalStoreEqualTo(int64_t id, const char* field, ValueType value)
267     {
268         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
269         if (nativeRdbPredicates == nullptr) {
270             return -1;
271         }
272         nativeRdbPredicates->EqualTo(field, value);
273         return 0;
274     }
275 
276 
FfiOHOSRelationalStoreGreaterThanOrEqualTo(int64_t id,const char * field,ValueType value)277     int32_t FfiOHOSRelationalStoreGreaterThanOrEqualTo(int64_t id, const char* field, ValueType value)
278     {
279         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
280         if (nativeRdbPredicates == nullptr) {
281             return -1;
282         }
283         nativeRdbPredicates->GreaterThanOrEqualTo(field, value);
284         return 0;
285     }
286 
FfiOHOSRelationalStoreGreaterThan(int64_t id,const char * field,ValueType value)287     int32_t FfiOHOSRelationalStoreGreaterThan(int64_t id, const char* field, ValueType value)
288     {
289         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
290         if (nativeRdbPredicates == nullptr) {
291             return -1;
292         }
293         nativeRdbPredicates->GreaterThan(field, value);
294         return 0;
295     }
296 
FfiOHOSRelationalStoreNotBetween(int64_t id,const char * field,ValueType lowValue,ValueType highValue)297     int32_t FfiOHOSRelationalStoreNotBetween(int64_t id, const char* field, ValueType lowValue, ValueType highValue)
298     {
299         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
300         if (nativeRdbPredicates == nullptr) {
301             return -1;
302         }
303         nativeRdbPredicates->NotBetween(field, lowValue, highValue);
304         return 0;
305     }
306 
FfiOHOSRelationalStoreLessThan(int64_t id,const char * field,ValueType value)307     int32_t FfiOHOSRelationalStoreLessThan(int64_t id, const char* field, ValueType value)
308     {
309         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
310         if (nativeRdbPredicates == nullptr) {
311             return -1;
312         }
313         nativeRdbPredicates->LessThan(field, value);
314         return 0;
315     }
316 
FfiOHOSRelationalStoreBetween(int64_t id,const char * field,ValueType lowValue,ValueType highValue)317     int32_t FfiOHOSRelationalStoreBetween(int64_t id, const char* field, ValueType lowValue, ValueType highValue)
318     {
319         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
320         if (nativeRdbPredicates == nullptr) {
321             return -1;
322         }
323         nativeRdbPredicates->Between(field, lowValue, highValue);
324         return 0;
325     }
326 
FfiOHOSRelationalStoreIn(int64_t id,const char * field,ValueType * values,int64_t valuesSize)327     int32_t FfiOHOSRelationalStoreIn(int64_t id, const char* field, ValueType* values, int64_t valuesSize)
328     {
329         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
330         if (nativeRdbPredicates == nullptr) {
331             return -1;
332         }
333         nativeRdbPredicates->In(field, values, valuesSize);
334         return 0;
335     }
336 
FfiOHOSRelationalStoreNotIn(int64_t id,const char * field,ValueType * values,int64_t valuesSize)337     int32_t FfiOHOSRelationalStoreNotIn(int64_t id, const char* field, ValueType* values, int64_t valuesSize)
338     {
339         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
340         if (nativeRdbPredicates == nullptr) {
341             return -1;
342         }
343         nativeRdbPredicates->NotIn(field, values, valuesSize);
344         return 0;
345     }
346 
FfiOHOSRelationalStoreNotEqualTo(int64_t id,const char * field,ValueType value)347     int32_t FfiOHOSRelationalStoreNotEqualTo(int64_t id, const char* field, ValueType value)
348     {
349         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(id);
350         if (nativeRdbPredicates == nullptr) {
351             return -1;
352         }
353         nativeRdbPredicates->NotEqualTo(field, value);
354         return 0;
355     }
356 
FfiOHOSRelationalStoreQuery(int64_t id,int64_t predicatesId,char ** columns,int64_t columnsSize,int32_t * errCode)357     int64_t FfiOHOSRelationalStoreQuery(int64_t id, int64_t predicatesId, char** columns, int64_t columnsSize,
358         int32_t *errCode)
359     {
360         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
361         if (nativeRdbStore == nullptr) {
362             *errCode = -1;
363             return -1;
364         }
365         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(predicatesId);
366         if (nativeRdbPredicates == nullptr) {
367             *errCode = -1;
368             return -1;
369         }
370         auto resultSet = nativeRdbStore->Query(*nativeRdbPredicates, columns, columnsSize);
371         if (resultSet == nullptr) {
372             *errCode = RelationalStoreJsKit::E_INNER_ERROR;
373             return -1;
374         } else {
375             *errCode = RelationalStoreJsKit::OK;
376         }
377         auto nativeResultSet = FFIData::Create<ResultSetImpl>(resultSet);
378         if (nativeResultSet == nullptr) {
379             *errCode = -1;
380             return -1;
381         }
382         return nativeResultSet->GetID();
383     }
384 
FfiOHOSRelationalStoreRemoteQuery(int64_t id,char * device,int64_t predicatesId,char ** columns,int64_t columnsSize)385     int64_t FfiOHOSRelationalStoreRemoteQuery(int64_t id, char* device, int64_t predicatesId, char** columns,
386         int64_t columnsSize)
387     {
388         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
389         if (nativeRdbStore == nullptr) {
390             return -1;
391         }
392         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(predicatesId);
393         if (nativeRdbPredicates == nullptr) {
394             return -1;
395         }
396         auto resultSet = nativeRdbStore->RemoteQuery(device, *nativeRdbPredicates, columns, columnsSize);
397         if (resultSet == nullptr) {
398             return -1;
399         }
400         auto nativeResultSet = FFIData::Create<ResultSetImpl>(resultSet);
401         if (nativeResultSet == nullptr) {
402             return -1;
403         }
404         return nativeResultSet->GetID();
405     }
406 
FfiOHOSRelationalStoreDelete(int64_t id,int64_t predicatesId,int32_t * errCode)407     int64_t FfiOHOSRelationalStoreDelete(int64_t id, int64_t predicatesId, int32_t *errCode)
408     {
409         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
410         if (nativeRdbStore == nullptr) {
411             *errCode = -1;
412             return -1;
413         }
414         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(predicatesId);
415         if (nativeRdbPredicates == nullptr) {
416             *errCode = -1;
417             return -1;
418         }
419         return nativeRdbStore->Delete(*nativeRdbPredicates, errCode);
420     }
421 
FfiOHOSRelationalStoreSetDistributedTables(int64_t id,char ** tables,int64_t tablesSize)422     int32_t FfiOHOSRelationalStoreSetDistributedTables(int64_t id, char** tables, int64_t tablesSize)
423     {
424         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
425         if (nativeRdbStore == nullptr) {
426             return -1;
427         }
428         nativeRdbStore->SetDistributedTables(tables, tablesSize);
429         return 0;
430     }
431 
FfiOHOSRelationalStoreSetDistributedTablesType(int64_t id,char ** tables,int64_t tablesSize,int32_t type)432     int32_t FfiOHOSRelationalStoreSetDistributedTablesType(int64_t id, char** tables, int64_t tablesSize, int32_t type)
433     {
434         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
435         if (nativeRdbStore == nullptr) {
436             return -1;
437         }
438         nativeRdbStore->SetDistributedTables(tables, tablesSize, type);
439         return 0;
440     }
441 
FfiOHOSRelationalStoreSetDistributedTablesConfig(int64_t id,char ** tables,int64_t tablesSize,int32_t type,DistributedRdb::DistributedConfig & distributedConfig)442     int32_t FfiOHOSRelationalStoreSetDistributedTablesConfig(int64_t id, char** tables, int64_t tablesSize,
443         int32_t type, DistributedRdb::DistributedConfig &distributedConfig)
444     {
445         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
446         if (nativeRdbStore == nullptr) {
447             return -1;
448         }
449         nativeRdbStore->SetDistributedTables(tables, tablesSize, type, distributedConfig);
450         return 0;
451     }
452 
FfiOHOSRelationalStoreObtainDistributedTableName(int64_t id,const char * device,char * table)453     char* FfiOHOSRelationalStoreObtainDistributedTableName(int64_t id, const char* device, char* table)
454     {
455         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
456         if (nativeRdbStore == nullptr) {
457             return nullptr;
458         }
459         return nativeRdbStore->ObtainDistributedTableName(device, table);
460     }
461 
FfiOHOSRelationalStoreBackUp(int64_t id,const char * destName)462     int32_t FfiOHOSRelationalStoreBackUp(int64_t id, const char* destName)
463     {
464         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
465         if (nativeRdbStore == nullptr) {
466             return -1;
467         }
468         return nativeRdbStore->Backup(destName);
469     }
470 
FfiOHOSRelationalStoreReStore(int64_t id,const char * srcName)471     int32_t FfiOHOSRelationalStoreReStore(int64_t id, const char* srcName)
472     {
473         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
474         if (nativeRdbStore == nullptr) {
475             return -1;
476         }
477         return nativeRdbStore->Restore(srcName);
478     }
479 
FfiOHOSRelationalStoreCommit(int64_t id)480     int32_t FfiOHOSRelationalStoreCommit(int64_t id)
481     {
482         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
483         if (nativeRdbStore == nullptr) {
484             return -1;
485         }
486         return nativeRdbStore->Commit();
487     }
488 
FfiOHOSRelationalStoreRollBack(int64_t id)489     int32_t FfiOHOSRelationalStoreRollBack(int64_t id)
490     {
491         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
492         if (nativeRdbStore == nullptr) {
493             return -1;
494         }
495         return nativeRdbStore->RollBack();
496     }
497 
FfiOHOSRelationalStoreBeginTransaction(int64_t id)498     int32_t FfiOHOSRelationalStoreBeginTransaction(int64_t id)
499     {
500         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
501         if (nativeRdbStore == nullptr) {
502             return -1;
503         }
504         return nativeRdbStore->BeginTransaction();
505     }
506 
FfiOHOSRelationalStoreInsert(int64_t id,const char * table,ValuesBucket valuesBucket,int32_t conflict,int32_t * errCode)507     int64_t FfiOHOSRelationalStoreInsert(int64_t id, const char* table, ValuesBucket valuesBucket, int32_t conflict,
508         int32_t *errCode)
509     {
510         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
511         if (nativeRdbStore == nullptr) {
512             *errCode = -1;
513             return -1;
514         }
515         return nativeRdbStore->Insert(table, valuesBucket, conflict, errCode);
516     }
517 
FfiOHOSRelationalStoreUpdate(int64_t id,ValuesBucket valuesBucket,int64_t predicatesId,NativeRdb::ConflictResolution conflictResolution,int32_t * errCode)518     int64_t FfiOHOSRelationalStoreUpdate(int64_t id, ValuesBucket valuesBucket, int64_t predicatesId,
519         NativeRdb::ConflictResolution conflictResolution, int32_t *errCode)
520     {
521         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
522         auto nativeRdbSPredicates = FFIData::GetData<RdbPredicatesImpl>(predicatesId);
523         if (nativeRdbStore == nullptr || nativeRdbSPredicates == nullptr) {
524             *errCode = -1;
525             return -1;
526         }
527         return nativeRdbStore->Update(valuesBucket, *nativeRdbSPredicates, conflictResolution, errCode);
528     }
529 
FfiOHOSRelationalStoreExecuteSql(int64_t id,const char * sql,int32_t * errCode)530     void FfiOHOSRelationalStoreExecuteSql(int64_t id, const char* sql, int32_t *errCode)
531     {
532         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
533         if (nativeRdbStore == nullptr) {
534             *errCode = -1;
535             return;
536         }
537         nativeRdbStore->ExecuteSql(sql, errCode);
538     }
539 
FfiOHOSRelationalStoreSync(int64_t id,int32_t mode,int64_t predicatesId,int32_t * errCode)540     CArrSyncResult FfiOHOSRelationalStoreSync(int64_t id, int32_t mode, int64_t predicatesId, int32_t *errCode)
541     {
542         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
543         auto nativeRdbPredicates = FFIData::GetData<RdbPredicatesImpl>(predicatesId);
544         if (nativeRdbStore == nullptr || nativeRdbPredicates == nullptr) {
545             *errCode = -1;
546             return CArrSyncResult{nullptr, nullptr, 0};
547         }
548         return nativeRdbStore->Sync(mode, *nativeRdbPredicates);
549     }
550 
FfiOHOSRelationalStoreGetAllColumnNames(int64_t id)551     CArrStr FfiOHOSRelationalStoreGetAllColumnNames(int64_t id)
552     {
553         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
554         if (nativeResultSet == nullptr) {
555             return CArrStr{nullptr, 0};
556         }
557         return nativeResultSet->GetAllColumnNames();
558     }
559 
FfiOHOSRelationalStoreGetColumnCount(int64_t id,int32_t * errCode)560     int32_t FfiOHOSRelationalStoreGetColumnCount(int64_t id, int32_t *errCode)
561     {
562         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
563         if (nativeResultSet == nullptr) {
564             *errCode = -1;
565             return -1;
566         }
567         return nativeResultSet->GetColumnCount();
568     }
569 
FfiOHOSRelationalStoreGetRowCount(int64_t id,int32_t * errCode)570     int32_t FfiOHOSRelationalStoreGetRowCount(int64_t id, int32_t *errCode)
571     {
572         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
573         if (nativeResultSet == nullptr) {
574             *errCode = -1;
575             return -1;
576         }
577         return nativeResultSet->GetRowCount();
578     }
579 
FfiOHOSRelationalStoreGetRowIndex(int64_t id,int32_t * errCode)580     int32_t FfiOHOSRelationalStoreGetRowIndex(int64_t id, int32_t *errCode)
581     {
582         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
583         if (nativeResultSet == nullptr) {
584             *errCode = -1;
585             return -1;
586         }
587         return nativeResultSet->GetRowIndex();
588     }
589 
FfiOHOSRelationalStoreIsAtFirstRow(int64_t id,int32_t * errCode)590     bool FfiOHOSRelationalStoreIsAtFirstRow(int64_t id, int32_t *errCode)
591     {
592         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
593         if (nativeResultSet == nullptr) {
594             *errCode = -1;
595             return false;
596         }
597         *errCode = 0;
598         return nativeResultSet->IsAtFirstRow();
599     }
600 
FfiOHOSRelationalStoreIsAtLastRow(int64_t id,int32_t * errCode)601     bool FfiOHOSRelationalStoreIsAtLastRow(int64_t id, int32_t *errCode)
602     {
603         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
604         if (nativeResultSet == nullptr) {
605             *errCode = -1;
606             return false;
607         }
608         *errCode = 0;
609         return nativeResultSet->IsAtLastRow();
610     }
611 
FfiOHOSRelationalStoreIsEnded(int64_t id,int32_t * errCode)612     bool FfiOHOSRelationalStoreIsEnded(int64_t id, int32_t *errCode)
613     {
614         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
615         if (nativeResultSet == nullptr) {
616             *errCode = -1;
617             return false;
618         }
619         *errCode = 0;
620         return nativeResultSet->IsEnded();
621     }
622 
FfiOHOSRelationalStoreIsStarted(int64_t id,int32_t * errCode)623     bool FfiOHOSRelationalStoreIsStarted(int64_t id, int32_t *errCode)
624     {
625         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
626         if (nativeResultSet == nullptr) {
627             *errCode = -1;
628             return false;
629         }
630         *errCode = 0;
631         return nativeResultSet->IsStarted();
632     }
633 
FfiOHOSRelationalStoreIsClosed(int64_t id,int32_t * errCode)634     bool FfiOHOSRelationalStoreIsClosed(int64_t id, int32_t *errCode)
635     {
636         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
637         if (nativeResultSet == nullptr) {
638             *errCode = -1;
639             return false;
640         }
641         *errCode = 0;
642         return nativeResultSet->IsClosed();
643     }
644 
645 
FfiOHOSRelationalStoreGetDouble(int64_t id,int32_t columnIndex,int32_t * rtnCode)646     double FfiOHOSRelationalStoreGetDouble(int64_t id, int32_t columnIndex, int32_t* rtnCode)
647     {
648         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
649         if (nativeResultSet == nullptr) {
650             *rtnCode = -1;
651             return -1;
652         }
653         return nativeResultSet->GetDouble(columnIndex, rtnCode);
654     }
655 
FfiOHOSRelationalStoreGoToRow(int64_t id,int32_t position,int32_t * rtnCode)656     bool FfiOHOSRelationalStoreGoToRow(int64_t id, int32_t position, int32_t* rtnCode)
657     {
658         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
659         if (nativeResultSet == nullptr) {
660             *rtnCode = -1;
661             return false;
662         }
663         return nativeResultSet->GoToRow(position, rtnCode);
664     }
665 
FfiOHOSRelationalStoreGoToPreviousRow(int64_t id,int32_t * rtnCode)666     bool FfiOHOSRelationalStoreGoToPreviousRow(int64_t id, int32_t* rtnCode)
667     {
668         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
669         if (nativeResultSet == nullptr) {
670             *rtnCode = -1;
671             return false;
672         }
673         return nativeResultSet->GoToPreviousRow(rtnCode);
674     }
675 
FfiOHOSRelationalStoreGoToLastRow(int64_t id,int32_t * rtnCode)676     bool FfiOHOSRelationalStoreGoToLastRow(int64_t id, int32_t* rtnCode)
677     {
678         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
679         if (nativeResultSet == nullptr) {
680             *rtnCode = -1;
681             return false;
682         }
683         return nativeResultSet->GoToLastRow(rtnCode);
684     }
685 
FfiOHOSRelationalStoreGetColumnName(int64_t id,int32_t columnIndex,int32_t * rtnCode)686     char* FfiOHOSRelationalStoreGetColumnName(int64_t id, int32_t columnIndex, int32_t* rtnCode)
687     {
688         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
689         if (nativeResultSet == nullptr) {
690             *rtnCode = -1;
691             return nullptr;
692         }
693         return nativeResultSet->GetColumnName(columnIndex, rtnCode);
694     }
695 
FfiOHOSRelationalStoreIsColumnNull(int64_t id,int32_t columnIndex,int32_t * rtnCode)696     bool FfiOHOSRelationalStoreIsColumnNull(int64_t id, int32_t columnIndex, int32_t* rtnCode)
697     {
698         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
699         if (nativeResultSet == nullptr) {
700             *rtnCode = -1;
701             return false;
702         }
703         return nativeResultSet->IsColumnNull(columnIndex, rtnCode);
704     }
705 
FfiOHOSRelationalStoreGetAsset(int64_t id,int32_t columnIndex,int32_t * rtnCode)706     Asset FfiOHOSRelationalStoreGetAsset(int64_t id, int32_t columnIndex, int32_t* rtnCode)
707     {
708         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
709         if (nativeResultSet == nullptr) {
710             *rtnCode = -1;
711             return Asset{nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, 0};
712         }
713         return nativeResultSet->GetAsset(columnIndex, rtnCode);
714     }
715 
FfiOHOSRelationalStoreClose(int64_t id)716     int32_t FfiOHOSRelationalStoreClose(int64_t id)
717     {
718         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
719         if (nativeResultSet == nullptr) {
720             return -1;
721         }
722         return nativeResultSet->Close();
723     }
724 
FfiOHOSRelationalStoreGetColumnIndex(int64_t id,char * columnName,int32_t * rtnCode)725     int32_t FfiOHOSRelationalStoreGetColumnIndex(int64_t id, char* columnName, int32_t* rtnCode)
726     {
727         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
728         if (nativeResultSet == nullptr) {
729             *rtnCode = -1;
730             return -1;
731         }
732         return nativeResultSet->GetColumnIndex(columnName, rtnCode);
733     }
734 
FfiOHOSRelationalStoreGetString(int64_t id,int32_t columnIndex,int32_t * rtnCode)735     char* FfiOHOSRelationalStoreGetString(int64_t id, int32_t columnIndex, int32_t* rtnCode)
736     {
737         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
738         if (nativeResultSet == nullptr) {
739             *rtnCode = -1;
740             return nullptr;
741         }
742         return nativeResultSet->GetString(columnIndex, rtnCode);
743     }
744 
FfiOHOSRelationalStoreGoToFirstRow(int64_t id,int32_t * rtnCode)745     bool FfiOHOSRelationalStoreGoToFirstRow(int64_t id, int32_t* rtnCode)
746     {
747         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
748         if (nativeResultSet == nullptr) {
749             *rtnCode = -1;
750             return false;
751         }
752         return nativeResultSet->GoToFirstRow(rtnCode);
753     }
754 
FfiOHOSRelationalStoreGetLong(int64_t id,int32_t columnIndex,int32_t * rtnCode)755     int64_t FfiOHOSRelationalStoreGetLong(int64_t id, int32_t columnIndex, int32_t* rtnCode)
756     {
757         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
758         if (nativeResultSet == nullptr) {
759             *rtnCode = -1;
760             return -1;
761         }
762         return nativeResultSet->GetLong(columnIndex, rtnCode);
763     }
764 
FfiOHOSRelationalStoreGoToNextRow(int64_t id,int32_t * rtnCode)765     bool FfiOHOSRelationalStoreGoToNextRow(int64_t id, int32_t* rtnCode)
766     {
767         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
768         if (nativeResultSet == nullptr) {
769             *rtnCode = -1;
770             return false;
771         }
772         return nativeResultSet->GoToNextRow(rtnCode);
773     }
774 
FfiOHOSRelationalStoreGetBlob(int64_t id,int32_t columnIndex,int32_t * rtnCode)775     CArrUI8 FfiOHOSRelationalStoreGetBlob(int64_t id, int32_t columnIndex, int32_t* rtnCode)
776     {
777         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
778         if (nativeResultSet == nullptr) {
779             *rtnCode = -1;
780             return CArrUI8{nullptr, 0};
781         }
782         return nativeResultSet->GetBlob(columnIndex, rtnCode);
783     }
784 
FfiOHOSRelationalStoreGoTo(int64_t id,int32_t offset,int32_t * rtnCode)785     bool FfiOHOSRelationalStoreGoTo(int64_t id, int32_t offset, int32_t* rtnCode)
786     {
787         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
788         if (nativeResultSet == nullptr) {
789             *rtnCode = -1;
790             return false;
791         }
792         return nativeResultSet->GoTo(offset, rtnCode);
793     }
794 
FfiOHOSRelationalStoreGetAssets(int64_t id,int32_t columnIndex,int32_t * rtnCode)795     Assets FfiOHOSRelationalStoreGetAssets(int64_t id, int32_t columnIndex, int32_t* rtnCode)
796     {
797         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
798         if (nativeResultSet == nullptr) {
799             *rtnCode = -1;
800             return Assets{nullptr, 0};
801         }
802         return nativeResultSet->GetAssets(columnIndex, rtnCode);
803     }
804 
FfiOHOSRelationalStoreGetRow(int64_t id,int32_t * errCode)805     ValuesBucket FfiOHOSRelationalStoreGetRow(int64_t id, int32_t *errCode)
806     {
807         auto nativeResultSet = FFIData::GetData<ResultSetImpl>(id);
808         if (nativeResultSet == nullptr) {
809             *errCode = -1;
810             return ValuesBucket{nullptr, nullptr, 0};
811         }
812         return nativeResultSet->GetRow(errCode);
813     }
814 
FfiOHOSRelationalStoreCleanDirtyData(int64_t id,const char * tableName,uint64_t cursor)815     int32_t FfiOHOSRelationalStoreCleanDirtyData(int64_t id, const char* tableName, uint64_t cursor)
816     {
817         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
818         if (nativeRdbStore == nullptr) {
819             return -1;
820         }
821         return nativeRdbStore->CleanDirtyData(tableName, cursor);
822     }
823 
FfiOHOSRelationalStoreBatchInsert(int64_t id,const char * tableName,ValuesBucket * values,int64_t valuesSize,int64_t * insertNum)824     int32_t FfiOHOSRelationalStoreBatchInsert(int64_t id, const char* tableName, ValuesBucket* values,
825         int64_t valuesSize, int64_t* insertNum)
826     {
827         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
828         if (nativeRdbStore == nullptr) {
829             return -1;
830         }
831         return nativeRdbStore->BatchInsert(*insertNum, tableName, values, valuesSize);
832     }
833 
FfiOHOSRelationalStoreQuerySql(int64_t id,const char * sql,ValueType * bindArgs,int64_t size,int32_t * errCode)834     int64_t FfiOHOSRelationalStoreQuerySql(int64_t id, const char *sql, ValueType *bindArgs, int64_t size,
835         int32_t* errCode)
836     {
837         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
838         if (nativeRdbStore == nullptr) {
839             *errCode = RelationalStoreJsKit::E_INNER_ERROR;
840             return -1;
841         }
842         auto resultSet = nativeRdbStore->QuerySql(sql, bindArgs, size);
843         if (resultSet == nullptr) {
844             *errCode = RelationalStoreJsKit::E_INNER_ERROR;
845             return -1;
846         } else {
847             *errCode = RelationalStoreJsKit::OK;
848         }
849         auto nativeResultSet = FFIData::Create<ResultSetImpl>(resultSet);
850         if (nativeResultSet == nullptr) {
851             *errCode = -1;
852             return -1;
853         }
854         return nativeResultSet->GetID();
855     }
856 
FfiOHOSRelationalStoreExecuteSqlBindArgs(int64_t id,char * sql,ValueType * bindArgs,int64_t bindArgsSize,int32_t * errCode)857     void FfiOHOSRelationalStoreExecuteSqlBindArgs(int64_t id, char* sql, ValueType* bindArgs, int64_t bindArgsSize,
858         int32_t *errCode)
859     {
860         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
861         if (nativeRdbStore == nullptr) {
862             *errCode = -1;
863             return;
864         }
865         nativeRdbStore->ExecuteSql(sql, bindArgs, bindArgsSize, errCode);
866     }
867 
FfiOHOSRelationalStoreOn(int64_t id,const char * event,bool interProcess,void (* callback)(),void (* callbackRef)())868     int32_t FfiOHOSRelationalStoreOn(int64_t id, const char *event, bool interProcess,
869         void (*callback)(), void (*callbackRef)())
870     {
871         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
872         if (nativeRdbStore == nullptr) {
873             return -1;
874         }
875         auto onChange = [lambda = CJLambda::Create(callbackRef)]() -> void { lambda(); };
876         return nativeRdbStore->RegisterObserver(event, interProcess, (std::function<void()>*)(callback), onChange);
877     }
878 
FfiOHOSRelationalStoreOff(int64_t id,const char * event,bool interProcess,void (* callback)())879     int32_t FfiOHOSRelationalStoreOff(int64_t id, const char *event, bool interProcess, void (*callback)())
880     {
881         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
882         if (nativeRdbStore == nullptr) {
883             return -1;
884         }
885         return nativeRdbStore->UnRegisterObserver(event, interProcess, (std::function<void()>*)(callback));
886     }
887 
FfiOHOSRelationalStoreOffAll(int64_t id,const char * event,bool interProcess)888     int32_t FfiOHOSRelationalStoreOffAll(int64_t id, const char *event, bool interProcess)
889     {
890         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
891         if (nativeRdbStore == nullptr) {
892             return -1;
893         }
894         return nativeRdbStore->UnRegisterAllObserver(event, interProcess);
895     }
896 
FfiOHOSRelationalStoreEmit(int64_t id,const char * event)897     int32_t FfiOHOSRelationalStoreEmit(int64_t id, const char *event)
898     {
899         auto nativeRdbStore = FFIData::GetData<RdbStoreImpl>(id);
900         if (nativeRdbStore == nullptr) {
901             return -1;
902         }
903         return nativeRdbStore->Emit(event);
904     }
905 }
906 }
907 }
908