Skip to content

Commit

Permalink
properly implemented cleaning old logs (#fixes 207)
Browse files Browse the repository at this point in the history
  • Loading branch information
naxuroqa committed Jul 9, 2014
1 parent d642abe commit fd90315
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 31 deletions.
49 changes: 29 additions & 20 deletions src/core/MessageLog.vala
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace Venom {
public abstract string myId {get; set;}
public abstract void on_message(Contact c, string message, bool issender);
public abstract GLib.List<Message>? retrieve_history(Contact c);
public abstract void delete_history(Contact c);
public abstract void sanitize_database();
public abstract void connect_to(ToxSession session);
public abstract void disconnect_from(ToxSession session);
}
Expand All @@ -33,7 +33,7 @@ namespace Venom {
public string myId {get; set;}
public void on_message(Contact c, string message, bool issender) {}
public GLib.List<Message>? retrieve_history(Contact c) { return null; }
public void delete_history(Contact c) {}
public void sanitize_database() {}
public void connect_to(ToxSession session) {}
public void disconnect_from(ToxSession session) {}
}
Expand All @@ -54,16 +54,17 @@ namespace Venom {
private unowned Sqlite.Database db;
private Sqlite.Statement insert_statement;
private Sqlite.Statement select_statement;
private Sqlite.Statement delete_statement;

private static string TABLE_USER = "$USER";
private static string TABLE_CONTACT = "$CONTACT";
private static string TABLE_MESSAGE = "$MESSAGE";
private static string TABLE_TIME = "$TIME";
private static string TABLE_SENDER = "$SENDER";
private static string TABLE_OLDEST = "$OLDEST";

private static string STATEMENT_INSERT_HISTORY = "INSERT INTO History (userHash, contactHash, message, timestamp, issent) VALUES (%s, %s, %s, %s, %s);".printf(TABLE_USER, TABLE_CONTACT, TABLE_MESSAGE, TABLE_TIME, TABLE_SENDER);
private static string STATEMENT_SELECT_HISTORY = "SELECT * FROM History WHERE userHash = %s AND contactHash = %s AND timestamp > %s;".printf(TABLE_USER, TABLE_CONTACT, TABLE_OLDEST);
private static string STATEMENT_SELECT_HISTORY = "SELECT * FROM History WHERE userHash = %s AND contactHash = %s;".printf(TABLE_USER, TABLE_CONTACT);
private static string STATEMENT_SANITIZE_DATABASE = "DELETE FROM History WHERE timestamp < %s;".printf(TABLE_TIME);

private static string QUERY_TABLE_HISTORY = """
CREATE TABLE IF NOT EXISTS History (
Expand All @@ -78,7 +79,8 @@ namespace Venom {

public SqliteMessageLog(Sqlite.Database db) throws SqliteDbError {
this.db = db;
init_db ();
init_db();
sanitize_database();
Logger.log(LogLevel.DEBUG, "SQLite database created.");
}

Expand Down Expand Up @@ -125,12 +127,9 @@ namespace Venom {

public GLib.List<Message>? retrieve_history(Contact c) {
string cId = Tools.bin_to_hexstring(c.public_key);
DateTime earliestTime = new DateTime.now_utc();
earliestTime = earliestTime.add_days(-Settings.instance.days_to_log);
try {
SqliteTools.put_text(select_statement , TABLE_USER, myId);
SqliteTools.put_text(select_statement , TABLE_CONTACT, cId);
SqliteTools.put_int64(select_statement, TABLE_OLDEST, earliestTime.to_unix());
} catch (SqliteStatementError e) {
Logger.log(LogLevel.ERROR, "Error retrieving logs from sqlite database: " + e.message);
return null;
Expand All @@ -155,8 +154,21 @@ namespace Venom {
return messages;
}

public void delete_history(Contact c) {
//TODO
public void sanitize_database() {
if(Settings.instance.log_indefinitely) {
return;
}
Logger.log(LogLevel.INFO, "Sanitizing database...");
DateTime timestamp = new DateTime.now_utc().add_days(-Settings.instance.days_to_log);
try {
SqliteTools.put_int64(delete_statement, TABLE_TIME, timestamp.to_unix());
} catch (SqliteStatementError e) {
Logger.log(LogLevel.ERROR, "Error sanitizing sqlite database: " + e.message);
return;
}

delete_statement.step();
delete_statement.reset();
}

private void init_db() throws SqliteDbError {
Expand All @@ -167,22 +179,19 @@ namespace Venom {
throw new SqliteDbError.QUERY(_("Error creating message log table: %s\n"), errmsg);
}

const string index_query = """
CREATE UNIQUE INDEX IF NOT EXISTS main_index ON History (userHash, contactHash, timestamp);
""";

if (db.exec (index_query, null, out errmsg) != Sqlite.OK) {
throw new SqliteDbError.QUERY(_("Error executing index query: %d: %s\n"), db.errcode (), errmsg);
}

//prepare insert statement for adding new history messages
if (db.prepare_v2 (STATEMENT_INSERT_HISTORY, STATEMENT_INSERT_HISTORY.length, out insert_statement) != Sqlite.OK) {
throw new SqliteDbError.QUERY(_("Error creating message insert statement: %d: %s\n"), db.errcode (), db.errmsg());
throw new SqliteDbError.QUERY("Error creating message insert statement: %d: %s\n", db.errcode (), db.errmsg());
}

//prepare select statement to get history. Will execute on indexed data
if (db.prepare_v2 (STATEMENT_SELECT_HISTORY, STATEMENT_SELECT_HISTORY.length, out select_statement) != Sqlite.OK) {
throw new SqliteDbError.QUERY(_("Error creating message select statement: %d: %s\n"), db.errcode (), db.errmsg());
throw new SqliteDbError.QUERY("Error creating message select statement: %d: %s\n", db.errcode (), db.errmsg());
}

//prepare delete statement
if (db.prepare_v2 (STATEMENT_SANITIZE_DATABASE, STATEMENT_SANITIZE_DATABASE.length, out delete_statement) != Sqlite.OK) {
throw new SqliteDbError.QUERY("Error creating message delete statement: %d: %s\n", db.errcode (), db.errmsg());
}
}

Expand Down
2 changes: 2 additions & 0 deletions src/core/Settings.vala
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ namespace Venom {

public const string MESSAGE_LOGGING_KEY = "enable-logging";
public const string DAYS_TO_LOG_KEY = "days-to-log";
public const string LOG_INDEFINITELY_KEY = "log-indefinitely";
public const string URGENCY_NOTIFICATION_KEY = "enable-urgency-notification";
public const string TRAY_KEY = "enable-tray";
public const string NOTIFY_KEY = "enable-notify";
Expand All @@ -34,6 +35,7 @@ namespace Venom {

public bool enable_logging { get; set; default = false; }
public bool enable_urgency_notification { get; set; default = true; }
public bool log_indefinitely { get; set; default = true; }
public int days_to_log { get; set; default = 180; }
public bool dec_binary_prefix { get; set; default = true; }
public bool send_typing_status { get; set; default = false; }
Expand Down
11 changes: 1 addition & 10 deletions src/ui/SettingsWindow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,11 @@ namespace Venom {
dialog = builder.get_object("dialog") as Gtk.Dialog;
dialog.set_transient_for(parent);

Gtk.SpinButton history_delete_spinbutton = builder.get_object("history_delete_spinbutton") as Gtk.SpinButton;

Settings settings = Settings.instance;

settings.bind_property(Settings.MESSAGE_LOGGING_KEY, builder.get_object("keep_history_checkbutton"), "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property(Settings.MESSAGE_LOGGING_KEY, builder.get_object("history_box"), "sensitive", BindingFlags.SYNC_CREATE);
settings.bind_property(Settings.DAYS_TO_LOG_KEY, builder.get_object("history_keep_radio"), "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL,
(binding, srcval, ref targetval) => { if((int)srcval < 0) targetval.set_boolean(true); return true; },
(binding, srcval, ref targetval) => { if((bool)srcval) targetval.set_int(-1); return true; }
);
settings.bind_property(Settings.DAYS_TO_LOG_KEY, builder.get_object("history_delete_radio"), "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL,
(binding, srcval, ref targetval) => { if((int)srcval >= 0) targetval.set_boolean(true); return true; },
(binding, srcval, ref targetval) => { if((bool)srcval) targetval.set_int((int)history_delete_spinbutton.value); return true; }
);
settings.bind_property(Settings.LOG_INDEFINITELY_KEY, builder.get_object("history_keep_radio"), "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property(Settings.DAYS_TO_LOG_KEY, builder.get_object("history_delete_spinbutton"), "value", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property(Settings.SEND_TYPING_STATUS_KEY, builder.get_object("send_typing_checkbutton"), "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property(Settings.SHOW_TYPING_STATUS_KEY, builder.get_object("show_typing_checkbutton"), "active", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
Expand Down
1 change: 0 additions & 1 deletion src/ui/settings_window.ui
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@
<object class="GtkRadioButton" id="history_keep_radio">
<property name="label" translatable="yes">indefinitely</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0</property>
Expand Down

2 comments on commit fd90315

@naxuroqa
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixes #207

@naxuroqa
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixes #141

Please sign in to comment.