-
Notifications
You must be signed in to change notification settings - Fork 7
/
hits_model.cc
142 lines (116 loc) · 3.49 KB
/
hits_model.cc
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
/* Copyright (c) 2011 Akamai Technologies, Inc. */
#include "system.hh"
#include "cgen.h"
#include "sqlite3_compat.h"
#include "binder.h"
#include "hits_model.h"
static const char* const sql_t_hits = \
"CREATE TABLE IF NOT EXISTS hits ("
"cp INTEGER, pathid INTEGER, featid INTEGER, sampleid INTEGER,"
"PRIMARY KEY (pathid, featid, sampleid));";
static const char* const sql_i_hits = "INSERT INTO hits VALUES (?,?,?,?);";
static const char* const sql_s_hits = "SELECT ROWID from hits WHERE "
"cp = ? and pathid = ? and featid = ? and sampleid = ?;";
static const char* const sql_idx_hits_cp = "CREATE INDEX "
"IF NOT EXISTS idx_hits_cp ON hits (cp);";
static const char* const sql_idx_hits_pathid = "CREATE INDEX "
"IF NOT EXISTS idx_hits_pathid ON hits (pathid);";
static const char* const sql_idx_hits_featid = "CREATE INDEX "
"IF NOT EXISTS idx_hits_featid ON hits (featid);";
HitsModel::HitsModel() : cp_(-1), pathid_(-1), featid_(-1), sampleid_(-1) {}
int HitsModel::InitTable(sqlite3* db)
{
db_ = db;
int ret = 0;
TST(db == NULL, errno = EINVAL,
"db must not be NULL", err);
LET(ret = sqlite3_exec(db_, sql_t_hits, NULL, NULL, NULL), ret != SQLITE_OK,
"unable to create hits table", err, DBERR);
LET(ret = sqlite3_exec(db_, sql_idx_hits_cp, NULL, NULL, NULL), ret != SQLITE_OK,
"unable to create hits cp index", err, DBERR);
LET(ret = sqlite3_exec(db_, sql_idx_hits_pathid, NULL, NULL, NULL), ret != SQLITE_OK,
"unable to create hits pathid index", err, DBERR);
LET(ret = sqlite3_exec(db_, sql_idx_hits_featid, NULL, NULL, NULL), ret != SQLITE_OK,
"unable to create hits featid index", err, DBERR);
return 0;
err:
return 1;
}
int HitsModel::cp() const
{
return cp_;
}
void HitsModel::set_cp(int cp)
{
cp_ = cp;
}
sqlite3_int64 HitsModel::pathid() const
{
return pathid_;
}
void HitsModel::set_pathid(sqlite3_int64 pathid)
{
pathid_ = pathid;
}
sqlite3_int64 HitsModel::featid() const
{
return featid_;
}
void HitsModel::set_featid(sqlite3_int64 featid)
{
featid_ = featid;
}
sqlite3_int64 HitsModel::sampleid() const
{
return sampleid_;
}
void HitsModel::set_sampleid(sqlite3_int64 sampleid)
{
sampleid_ = sampleid;
}
int HitsModel::InitStatements()
{
sqlite3* const & db = db_;
int ret = 0;
TST(db == NULL, errno = EINVAL,
"db must not be NULL", err);
LET(ret = sqlite3_prepare_v2(db, sql_i_hits, -1, &insert_, NULL), ret != SQLITE_OK,
"unable to HitsModel insert_", err, DBERR);
LET(ret = sqlite3_prepare_v2(db, sql_s_hits, -1, &select_, NULL), ret != SQLITE_OK,
"unable to HitsModel select_", err, DBERR);
return 0;
err:
return 1;
}
int HitsModel::Bind(sqlite3_stmt* stmt)
{
TST(cp_ == -1, errno = EINVAL,
"HitsModel::cp_ must not be -1", err);
TST(pathid_ == -1, errno = EINVAL,
"HitsModel::pathid_ must not be -1", err);
TST(featid_ == -1, errno = EINVAL,
"HitsModel::featid_ must not be -1", err);
TST(sampleid_ == -1, errno = EINVAL,
"HitsModel::sampleid_ must not be -1", err);
TST(stmt == NULL, errno = EINVAL,
"stmt must not be NULL", err);
CHK(sqlite3_bind_int(stmt, 1, cp_) != SQLITE_OK,
"unable to bind cp to stmt[1]", err);
CHK(sqlite3_bind_int64(stmt, 2, pathid_) != SQLITE_OK,
"unable to bind pathid to stmt[2]", err);
CHK(sqlite3_bind_int64(stmt, 3, featid_) != SQLITE_OK,
"unable to bind featid to stmt[3]", err);
CHK(sqlite3_bind_int64(stmt, 4, sampleid_) != SQLITE_OK,
"unable to bind sampleid to stmt[4]", err);
return 0;
err:
return 1;
}
int HitsModel::BindInsert()
{
return Bind(insert_);
}
int HitsModel::BindSelect()
{
return Bind(select_);
}