27 #include "../../core/utility.h"
35 const size_t cardinality,
36 const bool read_write)
37 : logger(
"DatabaseConnector", std::cerr)
45 const size_t cardinality,
46 const bool read_write,
47 const std::string& log_level)
48 : logger(
"DatabaseConnector", std::cerr, log_level)
61 std::stringstream query;
62 std::stringstream unique;
63 query <<
"CREATE TABLE";
67 query <<
" IF NOT EXISTS";
69 query <<
" _" << n <<
"_gram (";
70 for (
int i = n - 1; i >= 0; i--) {
72 unique <<
"word_" << i <<
", ";
73 query <<
"word_" << i <<
" TEXT, ";
76 query <<
"word TEXT, count INTEGER, UNIQUE(" << unique.str() <<
") );";
89 std::string query =
"SELECT SUM(count) FROM _1_gram;";
93 logger << DEBUG <<
"NgramTable:";
94 for (
size_t i = 0; i < result.size(); i++) {
95 for (
size_t j = 0; j < result[i].size(); j++) {
96 logger << DEBUG << result[i][j] <<
'\t';
106 std::stringstream query;
107 query <<
"SELECT count "
108 <<
"FROM _" << ngram.size() <<
"_gram"
113 logger << DEBUG <<
"NgramTable:";
114 for (
size_t i = 0; i < result.size(); i++) {
115 for (
size_t j = 0; j < result[i].size(); j++) {
116 logger << DEBUG << result[i][j] <<
'\t';
126 std::stringstream query;
128 <<
"FROM _" << ngram.size() <<
"_gram"
130 <<
" ORDER BY count DESC";
134 query <<
" LIMIT " << limit <<
';';
142 std::stringstream query;
144 <<
"FROM _" << ngram.size() <<
"_gram"
146 <<
" ORDER BY count DESC";
150 query <<
" LIMIT " << limit <<
';';
164 logger << DEBUG <<
"Updated ngram to " << count <<
endl;
182 std::stringstream query;
184 query <<
"INSERT INTO _" << ngram.size() <<
"_gram "
193 std::stringstream query;
195 query <<
"UPDATE _" << ngram.size() <<
"_gram "
196 <<
"SET count = " << count
204 std::stringstream where_clause;
205 where_clause <<
" WHERE";
206 for (
size_t i = 0; i < ngram.size(); i++) {
207 if (i < ngram.size() - 1) {
208 where_clause <<
" word_" << ngram.size() - i - 1 <<
" = '"
211 where_clause <<
" word = '" <<
sanitizeString(ngram[ngram.size() - 1]) <<
"'";
214 return where_clause.str();
221 std::stringstream where_clause;
222 where_clause <<
" WHERE";
223 for (
size_t i = 0; i < ngram.size(); i++) {
224 if (i < ngram.size() - 1) {
225 where_clause <<
" word_" << ngram.size() - i - 1 <<
" = '"
228 where_clause <<
" word LIKE '" <<
sanitizeString(ngram[ngram.size() - 1]) <<
"%'";
231 return where_clause.str();
236 std::stringstream where_clause;
237 where_clause <<
" WHERE";
238 for (
size_t i = 0; i < ngram.size(); i++) {
239 if (i < ngram.size() - 1) {
240 where_clause <<
" word_" << ngram.size() - i - 1 <<
" = '"
244 where_clause <<
" word LIKE '" <<
sanitizeString(ngram[ngram.size() - 1]) <<
"%'";
246 std::string true_prefix =
sanitizeString(ngram[ngram.size() - 1]);
247 where_clause <<
" (";
248 for (
int j = 0; filter[j] != 0; j++) {
251 where_clause <<
" OR ";
253 where_clause <<
" word LIKE '" << true_prefix << filter[j] <<
"%'";
260 return where_clause.str();
266 assert(cardinality > 0);
268 std::stringstream result;
269 for (
int i = cardinality - 1; i >= 0; i--) {
271 result <<
"word_" << i <<
", ";
273 result <<
"word, count";
282 std::stringstream values_clause;
283 values_clause <<
"VALUES(";
284 for (
size_t i = 0; i < ngram.size(); i++) {
285 if (i < ngram.size() - 1) {
288 values_clause <<
"'" <<
sanitizeString(ngram[i]) <<
"', " << count <<
")";
291 return values_clause.str();
297 std::size_t searchPos = 0;
299 std::string result(str);
300 while((pos = result.find(
"'", searchPos)) != std::string::npos)
302 result.replace(pos, 1,
"''");
318 if (table.size() > 0) {
319 if (table[0].size() > 0) {
320 count = atoi(table[0][0].c_str());
324 logger << DEBUG <<
"table: ";
325 for (
size_t i = 0; i < table.size(); i++) {
326 for (
size_t j = 0; j < table[i].size(); j++) {
327 logger << DEBUG << table[i][j] <<
'\t';
332 return (count > 0 ? count : 0);
374 return prev_filename;
382 const std::string start_marker =
"${";
383 const std::string end_marker =
"}";
385 std::list<std::string> variables;
387 std::string::size_type pos_start = filepath.find (start_marker);
388 while (pos_start != std::string::npos)
390 std::string::size_type pos_end = filepath.find (end_marker, pos_start);
391 if (pos_end != std::string::npos) {
392 variables.push_back (filepath.substr(pos_start + start_marker.size(), pos_end - end_marker.size() - pos_start - 1));
395 pos_start = filepath.find (start_marker, pos_end);
398 for (std::list<std::string>::const_iterator it = variables.begin();
399 it != variables.end();
410 std::string variable_token =
"${" + variable_name +
"}";
412 for (std::string::size_type pos = filepath.find (variable_token);
413 pos != std::string::npos;
414 pos = filepath.find (variable_token, pos))
416 const char* value = getenv(variable_name.c_str());
419 filepath.replace (pos,
420 variable_token.size(),
426 if (variable_name ==
"HOME")
428 value = getenv(
"USERPROFILE");
431 filepath.replace (pos,
432 variable_token.size(),
441 filepath.replace (pos,
442 variable_token.size(),
std::string get_database_filename() const
virtual void beginTransaction() const
std::string set_database_filename(const std::string &filename)
std::string buildSelectLikeClause(const int cardinality) const
NgramTable getNgramLikeTableFiltered(const Ngram ngram, const char **filter, int limit=-1) const
std::string buildWhereLikeClauseFiltered(const Ngram ngram, const char **filter) const
int getUnigramCountsSum() const
std::string buildWhereLikeClause(const Ngram ngram) const
size_t get_cardinality() const
void createNgramTable(const size_t cardinality) const
int getNgramCount(const Ngram ngram) const
void set_read_write_mode(const bool read_write)
void removeNgram(const Ngram ngram) const
std::string sanitizeString(const std::string) const
void set_cardinality(const size_t cardinality)
std::string database_filename
DatabaseConnector(const std::string database_name, const size_t cardinality, const bool read_write)
virtual void endTransaction() const
std::string buildValuesClause(const Ngram ngram, const int count) const
static void create_directory(const std::string &dir)
void updateNgram(const Ngram ngram, const int count) const
virtual NgramTable executeSql(const std::string query) const =0
std::vector< Ngram > NgramTable
int extractFirstInteger(const NgramTable &) const
void insertNgram(const Ngram ngram, const int count) const
virtual ~DatabaseConnector()
void substitute_variable_in_string(const std::string &variable_name, std::string &filepath) const
bool get_read_write_mode() const
static std::string dirname(const std::string &)
virtual void rollbackTransaction() const
int incrementNgramCount(const Ngram ngram) const
NgramTable getNgramLikeTable(const Ngram ngram, int limit=-1) const
std::string expand_variables(std::string filename) const
static bool is_directory_usable(const std::string &dir)
std::string buildWhereClause(const Ngram ngram) const
const Logger< _charT, _Traits > & endl(const Logger< _charT, _Traits > &lgr)