diff options
Diffstat (limited to 'lib/frame_query.cpp')
-rw-r--r-- | lib/frame_query.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/lib/frame_query.cpp b/lib/frame_query.cpp index 6583da4..3c4a3e8 100644 --- a/lib/frame_query.cpp +++ b/lib/frame_query.cpp | |||
@@ -37,13 +37,19 @@ namespace verbly { | |||
37 | { | 37 | { |
38 | std::stringstream construct; | 38 | std::stringstream construct; |
39 | construct << "SELECT frames.data, groups.data FROM frames INNER JOIN groups ON frames.group_id = groups.group_id"; | 39 | construct << "SELECT frames.data, groups.data FROM frames INNER JOIN groups ON frames.group_id = groups.group_id"; |
40 | std::list<binding> bindings; | ||
40 | 41 | ||
41 | if (!_for_verb.empty()) | 42 | if (!_for_verb.empty()) |
42 | { | 43 | { |
43 | std::list<std::string> clauses(_for_verb.size(), "verb_id = @VERID"); | 44 | std::list<std::string> clauses(_for_verb.size(), "verb_id = ?"); |
44 | construct << " WHERE frames.group_id IN (SELECT group_id FROM verb_groups WHERE "; | 45 | construct << " WHERE frames.group_id IN (SELECT group_id FROM verb_groups WHERE "; |
45 | construct << verbly::implode(std::begin(clauses), std::end(clauses), " OR "); | 46 | construct << verbly::implode(std::begin(clauses), std::end(clauses), " OR "); |
46 | construct << ")"; | 47 | construct << ")"; |
48 | |||
49 | for (auto v : _for_verb) | ||
50 | { | ||
51 | bindings.emplace_back(v._id); | ||
52 | } | ||
47 | } | 53 | } |
48 | 54 | ||
49 | sqlite3_stmt* ppstmt; | 55 | sqlite3_stmt* ppstmt; |
@@ -53,9 +59,27 @@ namespace verbly { | |||
53 | throw std::runtime_error(sqlite3_errmsg(_data.ppdb)); | 59 | throw std::runtime_error(sqlite3_errmsg(_data.ppdb)); |
54 | } | 60 | } |
55 | 61 | ||
56 | for (auto verb : _for_verb) | 62 | int i = 1; |
63 | for (auto& binding : bindings) | ||
57 | { | 64 | { |
58 | sqlite3_bind_int(ppstmt, sqlite3_bind_parameter_index(ppstmt, "@VERID"), verb._id); | 65 | switch (binding.get_type()) |
66 | { | ||
67 | case binding::type::integer: | ||
68 | { | ||
69 | sqlite3_bind_int(ppstmt, i, binding.get_integer()); | ||
70 | |||
71 | break; | ||
72 | } | ||
73 | |||
74 | case binding::type::string: | ||
75 | { | ||
76 | sqlite3_bind_text(ppstmt, i, binding.get_string().c_str(), binding.get_string().length(), SQLITE_STATIC); | ||
77 | |||
78 | break; | ||
79 | } | ||
80 | } | ||
81 | |||
82 | i++; | ||
59 | } | 83 | } |
60 | 84 | ||
61 | std::list<frame> output; | 85 | std::list<frame> output; |