summaryrefslogtreecommitdiff
path: root/src/components/policy/src/policy/sqlite_wrapper/include/sqlite_wrapper/sql_query.h
blob: b477a812dad178e1ca5f4ee182d8dbd89ca37a2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*
 * Copyright (c) 2013, Ford Motor Company
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided with the
 * distribution.
 *
 * Neither the name of the Ford Motor Company nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef SRC_COMPONENTS_POLICY_SQLITE_WRAPPER_INCLUDE_SQLITE_WRAPPER_SQL_QUERY_H_
#define SRC_COMPONENTS_POLICY_SQLITE_WRAPPER_INCLUDE_SQLITE_WRAPPER_SQL_QUERY_H_

#include <stdint.h>
#include <string>
#include "sqlite_wrapper/sql_error.h"
#include "utils/lock.h"

struct sqlite3_stmt;

namespace policy {
namespace dbms {

class SQLDatabase;

/**
 * Provides a means of executing and manipulating SQL statements
 */
class SQLQuery {
 public:
  explicit SQLQuery(SQLDatabase* db);
  ~SQLQuery();

  /**
   * Prepares the SQL query for executing
   * @param query the utf-8 string of SQL query
   * @return true if successfully
   */
  bool Prepare(const std::string& query);

  /**
   * Resets the binds of query for re-executing
   * @return true if successfully
   */
  bool Reset();

  /**
   * Deletes prepared SQL query
   */
  void Finalize();

  /**
   * Executes SQL query without make binds
   * @param query the utf-8 string of SQL query
   * @return true if successfull
   */
  bool Exec(const std::string& query);

  /**
   * Executes prepared SQL query and positions the query on the first record
   * @return true if successfull
   */
  bool Exec();

  /**
   * Retrieves the next record in the result, if available,
   * and positions the query on the retrieved record
   * @return true if record was retrieved successfully, false if a error was
   * or the result is empty or was retrieves last record
   */
  bool Next();

  /**
   * Binds null in the prepared query
   * @param pos position of param in the query
   */
  void Bind(int pos);

  /**
   * Binds int value in the prepared query.
   * @param pos position of param in the query
   * @param value value of param
   */
  void Bind(int pos, int value);

  /**
   * Binds int64_t value in the prepared query.
   * @param pos position of param in the query
   * @param value value of param
   */
  void Bind(int pos, int64_t value);

  /**
   * Binds double value in the prepared query.
   * @param pos position of param in the query
   * @param value value of param
   */
  void Bind(int pos, double value);

  /**
   * Binds bool value in the prepared query.
   * @param pos position of param in the query
   * @param value value of param
   */
  void Bind(int pos, bool value);

  /**
   * Binds string in the prepared query.
   * @param pos position of param in the query
   * @param value utf-8 string
   */
  void Bind(int pos, const std::string& value);

  /**
   * Gets value in the result record
   * @param pos position of value
   * @return boolean value
   */
  bool GetBoolean(int pos) const;

  /**
   * Gets value in the result record
   * @param pos position of value
   * @return integer value
   */
  int GetInteger(int pos) const;

  /**
   * Gets value in the result record
   * @param pos position of value
   * @return double value
   */
  double GetDouble(int pos) const;

  /**
   * Gets value in the result record
   * @param pos position of value
   * @return string value
   */
  std::string GetString(int pos) const;

  /**
   * Checks if value is null
   * @param pos position of value
   * @return true if value is null
   */
  bool IsNull(int pos) const;

  /**
   * Gets last id of insert row
   * @return id of insert row
   */
  int64_t LastInsertId() const;

  /**
   * Gets string of the query
   * @return string of the query
   */
  const std::string& query() const;

  /**
   * Gets information about the last error that occurred on the database
   * @return last error
   */
  SQLError LastError() const;

 private:
  /**
   * The instantiation of database
   */
  SQLDatabase& db_;

  /**
   * The string of query
   */
  std::string query_;

  /**
   * The SQL statement in SQLite
   */
  sqlite3_stmt* statement_;

  /**
   * Lock for guarding statement
   */
  sync_primitives::Lock statement_lock_;

  /**
   * The last error that occurred with this query
   */
  int error_;
};

}  // namespace dbms
}  // namespace policy

#endif  // SRC_COMPONENTS_POLICY_SQLITE_WRAPPER_INCLUDE_SQLITE_WRAPPER_SQL_QUERY_H_