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  #define LOG_TAG "RelationalAsset"
16  #include "relational_asset.h"
17  
18  #include "logger.h"
19  #include "relational_store_error_code.h"
20  #include "securec.h"
21  #include <cstdlib>
22  
23  using namespace OHOS::RdbNdk;
24  constexpr int ASSET_TRANSFORM_BASE = 10;
OH_Data_Asset_SetName(Data_Asset * asset,const char * name)25  int OH_Data_Asset_SetName(Data_Asset *asset, const char *name)
26  {
27      if (asset == nullptr || name == nullptr) {
28          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
29      }
30      asset->asset_.name = name;
31      return OH_Rdb_ErrCode::RDB_OK;
32  }
33  
OH_Data_Asset_SetUri(Data_Asset * asset,const char * uri)34  int OH_Data_Asset_SetUri(Data_Asset *asset, const char *uri)
35  {
36      if (asset == nullptr || uri == nullptr) {
37          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
38      }
39  
40      asset->asset_.uri = uri;
41      return OH_Rdb_ErrCode::RDB_OK;
42  }
43  
OH_Data_Asset_SetPath(Data_Asset * asset,const char * path)44  int OH_Data_Asset_SetPath(Data_Asset *asset, const char *path)
45  {
46      if (asset == nullptr || path == nullptr) {
47          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
48      }
49  
50      asset->asset_.path = path;
51      return OH_Rdb_ErrCode::RDB_OK;
52  }
53  
OH_Data_Asset_SetCreateTime(Data_Asset * asset,int64_t createTime)54  int OH_Data_Asset_SetCreateTime(Data_Asset *asset, int64_t createTime)
55  {
56      if (asset == nullptr) {
57          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
58      }
59  
60      asset->asset_.createTime = std::to_string(createTime);
61      return OH_Rdb_ErrCode::RDB_OK;
62  }
63  
OH_Data_Asset_SetModifyTime(Data_Asset * asset,int64_t modifyTime)64  int OH_Data_Asset_SetModifyTime(Data_Asset *asset, int64_t modifyTime)
65  {
66      if (asset == nullptr) {
67          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
68      }
69  
70      asset->asset_.modifyTime = std::to_string(modifyTime);
71      return OH_Rdb_ErrCode::RDB_OK;
72  }
73  
OH_Data_Asset_SetSize(Data_Asset * asset,size_t size)74  int OH_Data_Asset_SetSize(Data_Asset *asset, size_t size)
75  {
76      if (asset == nullptr) {
77          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
78      }
79  
80      asset->asset_.size = std::to_string(size);
81      return OH_Rdb_ErrCode::RDB_OK;
82  }
83  
OH_Data_Asset_SetStatus(Data_Asset * asset,Data_AssetStatus status)84  int OH_Data_Asset_SetStatus(Data_Asset *asset, Data_AssetStatus status)
85  {
86      if (asset == nullptr) {
87          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
88      }
89  
90      asset->asset_.status = status;
91      return OH_Rdb_ErrCode::RDB_OK;
92  }
93  
OH_Data_Asset_GetName(Data_Asset * asset,char * name,size_t * length)94  int OH_Data_Asset_GetName(Data_Asset *asset, char *name, size_t *length)
95  {
96      if (asset == nullptr) {
97          LOG_ERROR("Asset get name error: asset is NULL ? %{public}d.", (asset == nullptr));
98          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
99      }
100      size_t nameLength = asset->asset_.name.size();
101      if (nameLength >= *length) {
102          LOG_ERROR("Asset get name error: length is too small ? %{public}d.", (nameLength >= *length));
103          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
104      }
105      errno_t result = strcpy_s(name, *length, asset->asset_.name.c_str());
106      if (result != EOK) {
107          LOG_ERROR("strcpy_s failed, result is %{public}d", result);
108          return OH_Rdb_ErrCode::RDB_ERR;
109      }
110      *length = nameLength;
111      return OH_Rdb_ErrCode::RDB_OK;
112  }
113  
OH_Data_Asset_GetUri(Data_Asset * asset,char * uri,size_t * length)114  int OH_Data_Asset_GetUri(Data_Asset *asset, char *uri, size_t *length)
115  {
116      if (asset == nullptr) {
117          LOG_ERROR("Asset get uri error: asset is NULL ? %{public}d.", (asset == nullptr));
118          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
119      }
120      size_t uriLength = asset->asset_.uri.size();
121      if (uriLength >= *length) {
122          LOG_ERROR("Asset get uri error: length is too small ? %{public}d.", (uriLength >= *length));
123          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
124      }
125  
126      errno_t result = strcpy_s(uri, *length, asset->asset_.uri.c_str());
127      if (result != EOK) {
128          LOG_ERROR("strcpy_s failed, result is %{public}d", result);
129          return OH_Rdb_ErrCode::RDB_ERR;
130      }
131      *length = uriLength;
132      return OH_Rdb_ErrCode::RDB_OK;
133  }
134  
OH_Data_Asset_GetPath(Data_Asset * asset,char * path,size_t * length)135  int OH_Data_Asset_GetPath(Data_Asset *asset, char *path, size_t *length)
136  {
137      if (asset == nullptr) {
138          LOG_ERROR("Asset get path error: asset is NULL ? %{public}d.", (asset == nullptr));
139          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
140      }
141      size_t pathLength = asset->asset_.path.size();
142      if (pathLength >= *length) {
143          LOG_ERROR("Asset get path error: length is too small ? %{public}d.", (pathLength >= *length));
144          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
145      }
146      errno_t result = strcpy_s(path, *length, asset->asset_.path.c_str());
147      if (result != EOK) {
148          LOG_ERROR("strcpy_s failed, result is %{public}d", result);
149          return OH_Rdb_ErrCode::RDB_ERR;
150      }
151      *length = pathLength;
152      return OH_Rdb_ErrCode::RDB_OK;
153  }
154  
OH_Data_Asset_GetCreateTime(Data_Asset * asset,int64_t * createTime)155  int OH_Data_Asset_GetCreateTime(Data_Asset *asset, int64_t *createTime)
156  {
157      if (asset == nullptr) {
158          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
159      }
160      char *endPtr;
161      *createTime = strtol(asset->asset_.createTime.c_str(), &endPtr, ASSET_TRANSFORM_BASE);
162      if (*endPtr != '\0') {
163          LOG_ERROR("GetCreateTime failed.");
164          return OH_Rdb_ErrCode::RDB_ERR;
165      }
166      return OH_Rdb_ErrCode::RDB_OK;
167  }
168  
OH_Data_Asset_GetModifyTime(Data_Asset * asset,int64_t * modifyTime)169  int OH_Data_Asset_GetModifyTime(Data_Asset *asset, int64_t *modifyTime)
170  {
171      if (asset == nullptr) {
172          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
173      }
174      char *endPtr;
175      *modifyTime = strtol(asset->asset_.modifyTime.c_str(), &endPtr, ASSET_TRANSFORM_BASE);
176      if (*endPtr != '\0') {
177          LOG_ERROR("GetModifyTime failed.");
178          return OH_Rdb_ErrCode::RDB_ERR;
179      }
180      return OH_Rdb_ErrCode::RDB_OK;
181  }
182  
OH_Data_Asset_GetSize(Data_Asset * asset,size_t * size)183  int OH_Data_Asset_GetSize(Data_Asset *asset, size_t *size)
184  {
185      if (asset == nullptr) {
186          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
187      }
188      char *endPtr;
189      *size = strtol(asset->asset_.size.c_str(), &endPtr, ASSET_TRANSFORM_BASE);
190      if (*endPtr != '\0') {
191          LOG_ERROR("GetModifyTime failed.");
192          return OH_Rdb_ErrCode::RDB_ERR;
193      }
194      return OH_Rdb_ErrCode::RDB_OK;
195  }
196  
OH_Data_Asset_GetStatus(Data_Asset * asset,Data_AssetStatus * status)197  int OH_Data_Asset_GetStatus(Data_Asset *asset, Data_AssetStatus *status)
198  {
199      if (asset == nullptr) {
200          return OH_Rdb_ErrCode::RDB_E_INVALID_ARGS;
201      }
202      *status = static_cast<Data_AssetStatus>(asset->asset_.status);
203      return OH_Rdb_ErrCode::RDB_OK;
204  }
205  
OH_Data_Asset_CreateOne()206  Data_Asset *OH_Data_Asset_CreateOne()
207  {
208      return new (std::nothrow) Data_Asset();
209  }
210  
OH_Data_Asset_DestroyOne(Data_Asset * asset)211  int OH_Data_Asset_DestroyOne(Data_Asset *asset)
212  {
213      delete asset;
214      asset = nullptr;
215      return OH_Rdb_ErrCode::RDB_OK;
216  }
217  
OH_Data_Asset_CreateMultiple(uint32_t count)218  Data_Asset **OH_Data_Asset_CreateMultiple(uint32_t count)
219  {
220      auto assets = new Data_Asset *[count];
221      for (uint32_t i = 0; i < count; ++i) {
222          assets[i] = new Data_Asset();
223      }
224      return assets;
225  }
226  
OH_Data_Asset_DestroyMultiple(Data_Asset ** assets,uint32_t count)227  int OH_Data_Asset_DestroyMultiple(Data_Asset **assets, uint32_t count)
228  {
229      for (uint32_t i = 0; i < count; ++i) {
230          delete assets[i];
231      }
232      delete[] assets;
233      assets = nullptr;
234      return OH_Rdb_ErrCode::RDB_OK;
235  }
236