1115cd2caSopenharmony_ci/*
2115cd2caSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3115cd2caSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4115cd2caSopenharmony_ci * you may not use this file except in compliance with the License.
5115cd2caSopenharmony_ci * You may obtain a copy of the License at
6115cd2caSopenharmony_ci *
7115cd2caSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8115cd2caSopenharmony_ci *
9115cd2caSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10115cd2caSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11115cd2caSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12115cd2caSopenharmony_ci * See the License for the specific language governing permissions and
13115cd2caSopenharmony_ci * limitations under the License.
14115cd2caSopenharmony_ci */
15115cd2caSopenharmony_ci
16115cd2caSopenharmony_ci#ifndef SQL_ANALYZER_H
17115cd2caSopenharmony_ci#define SQL_ANALYZER_H
18115cd2caSopenharmony_ci
19115cd2caSopenharmony_ci#include <string>
20115cd2caSopenharmony_ci
21115cd2caSopenharmony_ci#include "values_bucket.h"
22115cd2caSopenharmony_ci
23115cd2caSopenharmony_ci#include "common.h"
24115cd2caSopenharmony_ci
25115cd2caSopenharmony_cinamespace OHOS {
26115cd2caSopenharmony_cinamespace Contacts {
27115cd2caSopenharmony_ciclass SqlAnalyzer {
28115cd2caSopenharmony_cipublic:
29115cd2caSopenharmony_ci    SqlAnalyzer();
30115cd2caSopenharmony_ci    ~SqlAnalyzer();
31115cd2caSopenharmony_ci
32115cd2caSopenharmony_ci    bool CheckValuesBucket(const OHOS::NativeRdb::ValuesBucket &value);
33115cd2caSopenharmony_ci    bool FindIllegalWords(std::string sql);
34115cd2caSopenharmony_ci    bool StrCheck(char &ch, std::size_t strlen, std::string sql, std::size_t &pos);
35115cd2caSopenharmony_ci    bool CharCheck(char &ch, std::string sql, std::size_t &pos);
36115cd2caSopenharmony_ci
37115cd2caSopenharmony_ciprivate:
38115cd2caSopenharmony_ci    inline bool IsNumber(char ch)
39115cd2caSopenharmony_ci    {
40115cd2caSopenharmony_ci        return (ch >= '0' && ch <= '9');
41115cd2caSopenharmony_ci    }
42115cd2caSopenharmony_ci    inline bool IsLetter(char ch)
43115cd2caSopenharmony_ci    {
44115cd2caSopenharmony_ci        return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '_');
45115cd2caSopenharmony_ci    }
46115cd2caSopenharmony_ci    inline bool IsLetterNumber(char ch)
47115cd2caSopenharmony_ci    {
48115cd2caSopenharmony_ci        return IsNumber(ch) || IsLetter(ch);
49115cd2caSopenharmony_ci    }
50115cd2caSopenharmony_ci    inline char PickChar(std::string str, std::size_t index)
51115cd2caSopenharmony_ci    {
52115cd2caSopenharmony_ci        if (index < str.length()) {
53115cd2caSopenharmony_ci            return str.at(index);
54115cd2caSopenharmony_ci        }
55115cd2caSopenharmony_ci        return '\0';
56115cd2caSopenharmony_ci    }
57115cd2caSopenharmony_ci    inline int IsInStr(char ch, std::string str)
58115cd2caSopenharmony_ci    {
59115cd2caSopenharmony_ci        std::size_t pos = str.find(ch);
60115cd2caSopenharmony_ci        if (pos == std::string::npos) {
61115cd2caSopenharmony_ci            return OPERATION_ERROR;
62115cd2caSopenharmony_ci        }
63115cd2caSopenharmony_ci        return 0;
64115cd2caSopenharmony_ci    }
65115cd2caSopenharmony_ci    std::string ParseSpecial(std::string originString)
66115cd2caSopenharmony_ci    {
67115cd2caSopenharmony_ci        std::vector<char> needsTransform = {'\'', '\"', ';', '_', '-', '\\', '%', '[', ']', '/', '*', '`'};
68115cd2caSopenharmony_ci        std::string parsedString;
69115cd2caSopenharmony_ci        for (unsigned int i = 0; i < originString.size(); i++) {
70115cd2caSopenharmony_ci            char curChar = originString.at(i);
71115cd2caSopenharmony_ci            if (std::find(needsTransform.begin(), needsTransform.end(), curChar) != needsTransform.end()) {
72115cd2caSopenharmony_ci                parsedString += '\\' + curChar;
73115cd2caSopenharmony_ci            } else {
74115cd2caSopenharmony_ci                parsedString += curChar;
75115cd2caSopenharmony_ci            }
76115cd2caSopenharmony_ci        }
77115cd2caSopenharmony_ci        return parsedString;
78115cd2caSopenharmony_ci    }
79115cd2caSopenharmony_ci};
80115cd2caSopenharmony_ci} // namespace Contacts
81115cd2caSopenharmony_ci} // namespace OHOS
82115cd2caSopenharmony_ci#endif // SQL_ANALYZER_H
83