~lubuntu-software-center-team/lubuntu-software-center/vala-port

« back to all changes in this revision

Viewing changes to src/db-build/dbbuild.vala

  • Committer: Stephen Smally
  • Date: 2012-07-03 18:17:20 UTC
  • Revision ID: eco.stefi@fastwebnet.it-20120703181720-h3xdrythvthldlzk
added Database building code

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
using PackageKit;
 
3
using SQLHeavy;
 
4
using Menu;
 
5
 
 
6
class AppInstallPackage {
 
7
    public AppInstallDirectory directory { get; private set; }
 
8
    public string name { get; private set; }
 
9
    public string icon { get; private set; }
 
10
    public string summary { get; private set; }
 
11
    public string id { get; private set; }
 
12
    
 
13
    public AppInstallPackage (AppInstallDirectory directory, string name, string icon, string summary, string id) {
 
14
        this.directory = directory;
 
15
        this.name = name;
 
16
        this.icon = icon;
 
17
        this.summary = summary;
 
18
        this.id = id;
 
19
    }
 
20
}
 
21
 
 
22
class AppInstallDirectory {
 
23
    public string name { get; private set; }
 
24
    public string directory { get; private set; }
 
25
    
 
26
    public AppInstallDirectory (string name, string directory) {
 
27
        this.name = name;
 
28
        this.directory = directory;
 
29
    }
 
30
}
 
31
 
 
32
class DbBuilder {
 
33
    private Dir root;
 
34
    private AppInstallDirectory tmp_dir;
 
35
    private Transaction trans;
 
36
    private KeyFile keys;
 
37
    private string desktop_dir;
 
38
    private Gee.HashMap<string, AppInstallPackage> packages;
 
39
    
 
40
    public void add_pkg (string id, Transaction trs) {
 
41
        AppInstallPackage app_pkg = packages[id];
 
42
        if (app_pkg == null) { return; }
 
43
        GLib.debug ("Inserting %s in %s\n", id, app_pkg.directory.name);
 
44
        trs.execute_insert("INSERT INTO '%s' VALUES (:id, :name, :description, :icon);".printf(app_pkg.directory.name),
 
45
                                   ":id", typeof (string), app_pkg.id,
 
46
                                   ":name", typeof (string), app_pkg.name,
 
47
                                   ":description", typeof (string), app_pkg.summary,
 
48
                                   ":icon", typeof (string), app_pkg.icon);
 
49
    }
 
50
    
 
51
    private bool get_if_included (MenuDir dir, string[] categories) {
 
52
        foreach (string in_dir in dir.excluded) {
 
53
            if (in_dir in categories) {
 
54
                return false;
 
55
            }
 
56
        }
 
57
        foreach (string in_dir in dir.included) {
 
58
            if (in_dir in categories) {
 
59
                return true;
 
60
            }
 
61
        }
 
62
        return false;
 
63
    }
 
64
    
 
65
    private string get_safe_key (string val) {
 
66
        try {
 
67
            return keys.get_string ("Desktop Entry", val);
 
68
        } catch (GLib.Error e) {
 
69
            GLib.debug ("Error retrieving key %s: %s\n", val, e.message);
 
70
        }
 
71
        return "";
 
72
    }
 
73
    
 
74
    private void get_apps_from_dir (MenuDir dir) {
 
75
        root.rewind();
 
76
        tmp_dir = new AppInstallDirectory (dir.name, dir.directory);
 
77
        string name;
 
78
        while ((name = root.read_name ()) != null) {
 
79
        if (! name.has_suffix (".desktop")) { continue; }
 
80
            try {
 
81
                keys.load_from_file (desktop_dir+name, 0);
 
82
                if (keys.has_key("Desktop Entry", "Categories") == false) { continue; }
 
83
                
 
84
                string[] categories = keys.get_string_list ("Desktop Entry", "Categories");
 
85
                if (get_if_included (dir, categories)) {
 
86
                    AppInstallPackage pkg = new AppInstallPackage (tmp_dir, get_safe_key ("Name"), get_safe_key ("Icon"), get_safe_key ("Comment"), get_safe_key ("X-AppInstall-Package"));
 
87
                    packages.set (pkg.id, pkg);
 
88
                }
 
89
            } catch {
 
90
                GLib.debug ("%s is not a valid .desktop file", name);
 
91
            }
 
92
        }
 
93
    }
 
94
    
 
95
    public DbBuilder (Database db) {
 
96
        packages = new Gee.HashMap<string, AppInstallPackage> ();
 
97
        
 
98
        desktop_dir = "/usr/share/app-install/desktop/";
 
99
        root = Dir.open (desktop_dir, 0);
 
100
        keys = new KeyFile ();
 
101
        
 
102
        MenuParser parser = new MenuParser ("/usr/share/app-install/desktop/applications.menu");
 
103
        
 
104
        trans = db.begin_transaction ();
 
105
        
 
106
        stdout.printf ("Collecting app-install datas...\n");
 
107
        
 
108
        foreach (unowned MenuDir item in parser.parse ()) {
 
109
            if (item.level == 1) { // We just want the Applications childs
 
110
                trans.execute ("CREATE TABLE '%s' (id, name, summary, icon);".printf (item.name));
 
111
                get_apps_from_dir (item);
 
112
            }
 
113
        }
 
114
    
 
115
        try {
 
116
            trans.commit();
 
117
        } catch (SQLHeavy.Error e) {
 
118
            GLib.error ("Error: %s\n", e.message);
 
119
        }
 
120
    }
 
121
}
 
122
 
 
123
Database db;
 
124
Client client;
 
125
DbBuilder dbbuilder;
 
126
Transaction trans;
 
127
string[] ids;
 
128
 
 
129
void pkg_received (Package pkg) {
 
130
    ids += pkg.get_name ();
 
131
}
 
132
 
 
133
// FIXME: Awful OOP code
 
134
// FIXME: doesn't allow same packages in multiple categories
 
135
 
 
136
int main () {
 
137
    ids = {};
 
138
    if (Environment.get_user_name () != "root") {
 
139
        GLib.error ("This program needs to be run as root!\n");
 
140
    }
 
141
    
 
142
    FileUtils.remove ("/var/cache/lsc-vala.db");
 
143
    db = new Database ("/var/cache/lsc-vala.db");
 
144
    
 
145
    dbbuilder = new DbBuilder (db);
 
146
    
 
147
    client = new Client ();
 
148
    trans = db.begin_transaction ();
 
149
    
 
150
    stdout.printf ("Querying PackageKit...\n");
 
151
    
 
152
    try {
 
153
        Bitfield field;
 
154
        field = Filter.bitfield_from_string ("arch");
 
155
        Results result = client.get_packages(field, null, null);
 
156
        result.get_package_array().foreach ((Func) pkg_received);
 
157
    } catch (GLib.Error e) {
 
158
        GLib.error ("Error: %s\n", e.message);
 
159
    }
 
160
    
 
161
    stdout.printf ("Building database...\n");
 
162
    
 
163
    foreach (string id in ids) {
 
164
       dbbuilder.add_pkg (id, trans);
 
165
    }
 
166
    
 
167
    try {
 
168
        trans.commit();
 
169
    } catch (SQLHeavy.Error e) {
 
170
        GLib.error ("Error: %s\n", e.message);
 
171
    }
 
172
    
 
173
    stdout.printf ("Done, no error reported\n");
 
174
    
 
175
    return 0;
 
176
}