3
private File history_dir;
4
private bool loaded = false;
5
private Sqlite.Database db;
7
public History (File data_dir)
9
history_dir = File.new_for_path (Path.build_filename (data_dir.get_path (), "history", null));
12
public File add (string date, string result) throws Error
16
var tokens = date.split (".");
17
string year = "????", month = "??", day = "??";
18
if (tokens.length == 3)
32
filename = "%s-%s-%s.pgn".printf (year, month, day);
34
filename = "%s-%s-%s-%d.pgn".printf (year, month, day, version);
35
relative_path = Path.build_filename (year, month, day, filename, null);
37
file = File.new_for_path (Path.build_filename (history_dir.get_path (), relative_path, null));
38
DirUtils.create_with_parents (Path.get_dirname (file.get_path ()), 0755);
41
file.create (FileCreateFlags.NONE);
46
if (!(e is IOError.EXISTS))
53
Sqlite.Statement statement;
54
assert (db.prepare_v2 ("INSERT INTO GameTable (date, path, result) VALUES (0, \"%s\", \"%s\")".printf (relative_path, result), -1, out statement) == Sqlite.OK);
55
if (statement.step () != Sqlite.DONE)
56
warning ("Failed to insert game into history index: %s", db.errmsg ());
61
public void remove (File file)
63
var relative_path = history_dir.get_relative_path (file);
65
Sqlite.Statement statement;
66
assert (db.prepare_v2 ("DELETE FROM GameTable WHERE path=\"%s\"".printf (relative_path), -1, out statement) == Sqlite.OK);
67
if (statement.step () != Sqlite.DONE)
68
warning ("Failed to remove game from history index: %s", db.errmsg ());
71
public void update (File file, string fen, string result)
73
var relative_path = history_dir.get_relative_path (file);
75
Sqlite.Statement statement;
76
assert (db.prepare_v2 ("UPDATE GameTable SET fen=\"%s\", result=\"%s\" WHERE path=\"%s\"".printf (fen, result, relative_path), -1, out statement) == Sqlite.OK);
77
if (statement.step () != Sqlite.DONE)
78
warning ("Failed to update game in history index: %s", db.errmsg ());
81
public List<File> get_unfinished ()
85
List<File> values = null;
87
Sqlite.Statement statement;
88
var result = db.prepare_v2 ("SELECT path FROM GameTable WHERE result=\"*\"", -1, out statement);
89
assert (result == Sqlite.OK);
91
while ((result = statement.step ()) == Sqlite.ROW)
93
var path = statement.column_text (0);
94
debug ("%s is unfinished", path);
95
values.append (File.new_for_path (Path.build_filename (history_dir.get_path (), path, null)));
98
if (result != Sqlite.DONE)
99
warning ("Failed to get unfinished games: %s", db.errmsg ());
109
var have_history = history_dir.query_exists ();
110
DirUtils.create_with_parents (history_dir.get_path (), 0755);
112
/* Open the database */
113
if (Sqlite.Database.open_v2 (Path.build_filename (history_dir.get_path (), "index.db"), out db) != Sqlite.OK)
114
warning ("Failed to load history index: %s", db.errmsg ());
117
Sqlite.Statement statement;
118
var result = db.prepare_v2 ("CREATE TABLE IF NOT EXISTS GameTable (id INTEGER PRIMARY KEY, date INTEGER, path TEXT, fen TEXT, result TEXT)", -1, out statement);
119
assert (result == Sqlite.OK);
120
if (statement.step () != Sqlite.DONE)
121
warning ("Failed to create game table: %s", db.errmsg ());
123
/* Migrate from old settings */
124
var old_history_dir = File.new_for_path (Path.build_filename (Environment.get_home_dir (), ".gnome2", "glchess", "history", null));
125
if (!have_history && old_history_dir.query_exists ())
127
debug ("Migrating history from %s to %s", old_history_dir.get_path (), history_dir.get_path ());
130
load_history_recursive (old_history_dir, old_history_dir, false);
134
warning ("Failed to migrate history: %s", e.message);
141
private void load_history_recursive (File base_dir, File dir, bool load_files) throws Error
143
var children = dir.enumerate_children ("standard::*", FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
147
var info = children.next_file ();
151
switch (info.get_file_type ())
153
case FileType.REGULAR:
157
var f = File.new_for_path (Path.build_filename (dir.get_path (), info.get_name (), null));
158
debug ("Migrating %s", f.get_path ());
162
var pgn = new PGN.from_file (f);
163
var game = pgn.games.nth_data (0);
166
var new_file = add (game.date, game.result);
167
f.copy (new_file, FileCopyFlags.OVERWRITE);
171
warning ("Failed to migrate file: %s", e.message);
174
case FileType.DIRECTORY:
175
var path = Path.build_filename (dir.get_path (), info.get_name (), null);
178
load_history_recursive (base_dir, File.new_for_path (path), true);
182
warning ("Couldn't open directory %s: %s", path, e.message);