[go: up one dir, main page]

Menu

[r189]: / tags / 0.9 / grop / db.cc  Maximize  Restore  History

Download this file

103 lines (78 with data), 2.1 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
//=======================================================================
// db.cc
//-----------------------------------------------------------------------
// This file is part of the package porg
// Copyright (C) 2015 David Ricart
// For more information visit http://porg.sourceforge.net
//=======================================================================
#include "config.h"
#include "opt.h"
#include "db.h"
#include "util.h"
#include <gtkmm/messagedialog.h>
#include <gtkmm/progressbar.h>
#include <gtkmm/image.h>
#include <glibmm/fileutils.h> // Dir
using std::string;
using namespace Grop;
using namespace Gtk;
float DB::s_total_size = 0;
std::vector<Pkg*> DB::s_pkgs;
bool DB::s_initialized = false;
DB::DB()
{
g_return_if_fail(Opt::initialized());
MessageDialog dialog("Reading database (" + Opt::logdir() + ")", false,
MESSAGE_INFO, BUTTONS_NONE, true);
dialog.set_title("grop :: info");
ProgressBar* progressbar(manage(new ProgressBar()));
dialog.get_message_area()->pack_start(*progressbar);
dialog.set_image(*(manage(new Image(DATADIR "/pixmaps/grop.png"))));
dialog.show_all();
Glib::Dir dir(Opt::logdir());
int pkg_cnt = std::vector<string>(dir.begin(), dir.end()).size();
s_pkgs.reserve(pkg_cnt);
float cnt = 0;
for (Glib::DirIterator d = dir.begin(); d != dir.end(); ++d) {
if (!Glib::file_test(Opt::logdir() + "/" + *d, Glib::FILE_TEST_IS_REGULAR))
continue;
dialog.set_secondary_text(*d);
main_iter();
try
{
Pkg* pkg = new Pkg(*d);
pkg->read_log();
s_pkgs.push_back(pkg);
s_total_size += pkg->size();
}
catch (std::exception const& x)
{
g_warning("%s", x.what());
}
progressbar->set_fraction(cnt++ / pkg_cnt);
main_iter();
}
s_initialized = true;
}
DB::~DB()
{
for (const_iter p(s_pkgs.begin()); p != s_pkgs.end(); delete *p++) ;
}
void DB::init()
{
static DB db;
}
void DB::remove_pkg(Pkg* pkg)
{
g_return_if_fail(pkg != NULL);
pkg->unlog();
for (iter p(s_pkgs.begin()); p != s_pkgs.end(); ++p) {
if (*p == pkg) {
s_total_size -= pkg->size();
s_pkgs.erase(p);
break;
}
}
delete pkg;
pkg = NULL;
}