1
/* Copyright 2011 Yorba Foundation
3
* This software is licensed under the GNU Lesser General Public License
4
* (version 2.1 or later). See the COPYING file in this distribution.
7
namespace DataImports.FSpot.Db {
9
private class FSpotBehaviorEntry {
10
private Utils.VersionNumber version;
11
private FSpotTableBehavior behavior;
13
public FSpotBehaviorEntry(Utils.VersionNumber version, FSpotTableBehavior behavior) {
14
this.version = version;
15
this.behavior = behavior;
18
public Utils.VersionNumber get_version() {
22
public FSpotTableBehavior get_behavior() {
28
* A class that consolidates the behavior of all F-Spot tables (apart from meta)
29
* and is the one place to check whether the database version is supported.
31
public class FSpotDatabaseBehavior : Object {
32
// Minimum unsupported version: any database from that version and above
33
// is not supported as it's too new and support has not been provided
34
// In practice, the code may work with future versions but this cannot be
35
// guaranteed as it hasn't been tested so it's probably better to just
36
// bomb out at that point rather than risk importing incorrect data
37
public static Utils.VersionNumber MIN_UNSUPPORTED_VERSION =
38
new Utils.VersionNumber({ 19 });
39
private static Gee.Map<string, Gee.List<FSpotBehaviorEntry>> behavior_map;
41
private FSpotTableBehavior<FSpotPhotoRow> photos_behavior;
42
private FSpotTableBehavior<FSpotTagRow> tags_behavior;
43
private FSpotTableBehavior<FSpotPhotoTagRow> photo_tags_behavior;
44
private FSpotTableBehavior<FSpotPhotoVersionRow> photo_versions_behavior;
45
private FSpotTableBehavior<FSpotRollRow> rolls_behavior;
47
public static void create_behavior_map() {
48
behavior_map = new Gee.HashMap<string, Gee.List<FSpotBehaviorEntry>>();
50
Gee.List<FSpotBehaviorEntry> photos_list = new Gee.ArrayList<FSpotBehaviorEntry>();
52
photos_list.add(new FSpotBehaviorEntry(
53
new Utils.VersionNumber({ 0 }),
54
FSpotPhotosV0Behavior.get_instance()
57
photos_list.add(new FSpotBehaviorEntry(
58
new Utils.VersionNumber({ 5 }),
59
FSpotPhotosV5Behavior.get_instance()
62
photos_list.add(new FSpotBehaviorEntry(
63
new Utils.VersionNumber({ 7 }),
64
FSpotPhotosV7Behavior.get_instance()
67
photos_list.add(new FSpotBehaviorEntry(
68
new Utils.VersionNumber({ 11 }),
69
FSpotPhotosV11Behavior.get_instance()
72
photos_list.add(new FSpotBehaviorEntry(
73
new Utils.VersionNumber({ 16 }),
74
FSpotPhotosV16Behavior.get_instance()
77
photos_list.add(new FSpotBehaviorEntry(
78
new Utils.VersionNumber({ 17 }),
79
FSpotPhotosV17Behavior.get_instance()
82
photos_list.add(new FSpotBehaviorEntry(
83
new Utils.VersionNumber({ 18 }),
84
FSpotPhotosV18Behavior.get_instance()
86
behavior_map.set(FSpotPhotosTable.TABLE_NAME, photos_list);
88
Gee.List<FSpotBehaviorEntry> tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
90
tags_list.add(new FSpotBehaviorEntry(
91
new Utils.VersionNumber({ 0 }),
92
FSpotTagsV0Behavior.get_instance()
94
behavior_map.set(FSpotTagsTable.TABLE_NAME, tags_list);
96
Gee.List<FSpotBehaviorEntry> photo_tags_list = new Gee.ArrayList<FSpotBehaviorEntry>();
98
photo_tags_list.add(new FSpotBehaviorEntry(
99
new Utils.VersionNumber({ 0 }),
100
FSpotPhotoTagsV0Behavior.get_instance()
102
behavior_map.set(FSpotPhotoTagsTable.TABLE_NAME, photo_tags_list);
103
// photo_versions table
104
Gee.List<FSpotBehaviorEntry> photo_versions_list = new Gee.ArrayList<FSpotBehaviorEntry>();
106
photo_versions_list.add(new FSpotBehaviorEntry(
107
new Utils.VersionNumber({ 0 }),
108
FSpotPhotoVersionsV0Behavior.get_instance()
111
photo_versions_list.add(new FSpotBehaviorEntry(
112
new Utils.VersionNumber({ 9 }),
113
FSpotPhotoVersionsV9Behavior.get_instance()
116
photo_versions_list.add(new FSpotBehaviorEntry(
117
new Utils.VersionNumber({ 16 }),
118
FSpotPhotoVersionsV16Behavior.get_instance()
121
photo_versions_list.add(new FSpotBehaviorEntry(
122
new Utils.VersionNumber({ 17 }),
123
FSpotPhotoVersionsV17Behavior.get_instance()
126
photo_versions_list.add(new FSpotBehaviorEntry(
127
new Utils.VersionNumber({ 18 }),
128
FSpotPhotoVersionsV18Behavior.get_instance()
130
behavior_map.set(FSpotPhotoVersionsTable.TABLE_NAME, photo_versions_list);
132
Gee.List<FSpotBehaviorEntry> rolls_list = new Gee.ArrayList<FSpotBehaviorEntry>();
134
rolls_list.add(new FSpotBehaviorEntry(
135
new Utils.VersionNumber({ 0 }),
136
FSpotRollsV0Behavior.get_instance()
139
rolls_list.add(new FSpotBehaviorEntry(
140
new Utils.VersionNumber({ 5 }),
141
FSpotRollsV5Behavior.get_instance()
143
behavior_map.set(FSpotRollsTable.TABLE_NAME, rolls_list);
146
public static FSpotTableBehavior? find_behavior(string table_name, Utils.VersionNumber version) {
147
FSpotTableBehavior behavior = null;
148
Gee.List<FSpotBehaviorEntry> behavior_list = behavior_map.get(table_name);
149
if (behavior_list != null)
150
foreach (FSpotBehaviorEntry entry in behavior_list) {
151
if (version.compare_to(entry.get_version()) >= 0)
152
behavior = entry.get_behavior();
155
warning("Could not find behavior list for table %s", table_name);
159
public FSpotDatabaseBehavior(Utils.VersionNumber version) throws Spit.DataImports.DataImportError {
160
if (version.compare_to(MIN_UNSUPPORTED_VERSION) >= 0)
161
throw new Spit.DataImports.DataImportError.UNSUPPORTED_VERSION("Version %s is not yet supported", version.to_string());
163
FSpotTableBehavior? photos_generic_behavior = find_behavior(FSpotPhotosTable.TABLE_NAME, version);
164
if (photos_generic_behavior != null)
165
photos_behavior = photos_generic_behavior as FSpotTableBehavior<FSpotPhotoRow>;
166
FSpotTableBehavior? tags_generic_behavior = find_behavior(FSpotTagsTable.TABLE_NAME, version);
167
if (tags_generic_behavior != null)
168
tags_behavior = tags_generic_behavior as FSpotTableBehavior<FSpotTagRow>;
169
FSpotTableBehavior? photo_tags_generic_behavior = find_behavior(FSpotPhotoTagsTable.TABLE_NAME, version);
170
if (photo_tags_generic_behavior != null)
171
photo_tags_behavior = photo_tags_generic_behavior as FSpotTableBehavior<FSpotPhotoTagRow>;
172
FSpotTableBehavior? photo_versions_generic_behavior = find_behavior(FSpotPhotoVersionsTable.TABLE_NAME, version);
173
if (photo_versions_generic_behavior != null)
174
photo_versions_behavior = photo_versions_generic_behavior as FSpotTableBehavior<FSpotPhotoVersionRow>;
175
FSpotTableBehavior? rolls_generic_behavior = find_behavior(FSpotRollsTable.TABLE_NAME, version);
176
if (rolls_generic_behavior != null)
177
rolls_behavior = rolls_generic_behavior as FSpotTableBehavior<FSpotRollRow>;
179
if (photos_behavior == null || tags_behavior == null ||
180
photo_tags_behavior == null || photo_versions_behavior == null ||
181
rolls_behavior == null
183
throw new Spit.DataImports.DataImportError.UNSUPPORTED_VERSION("Version %s is not supported", version.to_string());
186
public FSpotTableBehavior<FSpotPhotoRow> get_photos_behavior() {
187
return photos_behavior;
190
public FSpotTableBehavior<FSpotTagRow> get_tags_behavior() {
191
return tags_behavior;
194
public FSpotTableBehavior<FSpotPhotoTagRow> get_photo_tags_behavior() {
195
return photo_tags_behavior;
198
public FSpotTableBehavior<FSpotPhotoVersionRow> get_photo_versions_behavior() {
199
return photo_versions_behavior;
202
public FSpotTableBehavior<FSpotRollRow> get_rolls_behavior() {
203
return rolls_behavior;