Commit 936e7595 authored by Claudio Saavedra's avatar Claudio Saavedra

ephy-history-service: trim query strings to avoid reaching sqlite limit

Sqlite limits the length of a LIKE pattern to 50000 bytes, therefore
we need to make sure that longer strings are not used as queries.

https://bugzilla.gnome.org/show_bug.cgi?id=674848
parent bb10c338
......@@ -267,3 +267,15 @@ ephy_sqlite_statement_get_column_as_blob (EphySQLiteStatement *self, int column)
{
return sqlite3_column_blob (self->priv->prepared_statement, column);
}
char *
ephy_sqlite_create_match_pattern (const char *match_string)
{
char *string, *pattern;
string = g_strndup (match_string, EPHY_SQLITE_LIMIT_LIKE_PATTERN_LENGTH - 2);
pattern = g_strdup_printf ("%%%s%%", string);
g_free (string);
return pattern;
}
......@@ -68,6 +68,8 @@ double ephy_sqlite_statement_get_column_as_double (EphySQLite
const char* ephy_sqlite_statement_get_column_as_string (EphySQLiteStatement *statement, int column);
const void* ephy_sqlite_statement_get_column_as_blob (EphySQLiteStatement *statement, int column);
char* ephy_sqlite_create_match_pattern (const char *match_string);
G_END_DECLS
#endif /* EPHY_SQLITE_STATEMENT_H */
......
......@@ -29,6 +29,8 @@ typedef enum {
EPHY_SQLITE_COLUMN_TYPE_BLOB
} EphySQLiteColumnType;
#define EPHY_SQLITE_LIMIT_LIKE_PATTERN_LENGTH 50000
G_END_DECLS
#endif /* EPHY_SQLITE_H */
......@@ -318,7 +318,7 @@ ephy_history_service_find_host_rows (EphyHistoryService *self, EphyHistoryQuery
}
for (substring = query->substring_list; substring != NULL; substring = substring->next) {
int j = 4;
char *string = g_strdup_printf ("%%%s%%", (char*)substring->data);
char *string = ephy_sqlite_create_match_pattern ((char*)substring->data);
while (j--)
if (ephy_sqlite_statement_bind_string (statement, i++, string, &error) == FALSE) {
g_error ("Could not build hosts table query statement: %s", error->message);
......
......@@ -311,7 +311,7 @@ ephy_history_service_find_url_rows (EphyHistoryService *self, EphyHistoryQuery *
}
}
for (substring = query->substring_list; substring != NULL; substring = substring->next) {
char *string = g_strdup_printf ("%%%s%%", (char*)substring->data);
char *string = ephy_sqlite_create_match_pattern ((char*)substring->data);
if (ephy_sqlite_statement_bind_string (statement, i++, string, &error) == FALSE) {
g_error ("Could not build urls table query statement: %s", error->message);
g_error_free (error);
......
......@@ -182,7 +182,7 @@ ephy_history_service_find_visit_rows (EphyHistoryService *self, EphyHistoryQuery
}
}
for (substring = query->substring_list; substring != NULL; substring = substring->next) {
char *string = g_strdup_printf ("%%%s%%", (char*)substring->data);
char *string = ephy_sqlite_create_match_pattern ((char*)substring->data);
if (ephy_sqlite_statement_bind_string (statement, i++, string, &error) == FALSE) {
g_error ("Could not build urls table query statement: %s", error->message);
g_error_free (error);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment