lib: fixed parsing of recurring VEVENTS: DAILY and interval support
[barry/progweb.git] / src / backup.cc
blob9c720b5b9b107f9d00f2e4fc3d493f95e337b443
1 ///
2 /// \file backup.cc
3 /// Special parser class to support creation of Barry Backup files
4 ///
6 /*
7 Copyright (C) 2010-2012, Net Direct Inc. (http://www.netdirect.ca/)
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
18 See the GNU General Public License in the COPYING file at the
19 root directory of this project for more details.
22 #include "backup.h"
23 #include "tarfile.h"
24 #include "error.h"
25 #include <sstream>
26 #include <iomanip>
27 #include <iostream>
29 namespace Barry {
31 Backup::Backup(const std::string &tarpath)
33 try {
34 m_tar.reset( new reuse::TarFile(tarpath.c_str(), true,
35 &reuse::gztar_ops_nonthread, true) );
37 catch( reuse::TarFile::TarError &te ) {
38 throw Barry::BackupError(te.what());
42 Backup::~Backup()
44 try {
45 Close();
47 catch( Barry::BackupError & ) {
48 // throw it away
52 void Backup::Close()
54 if( m_tar.get() ) try {
55 m_tar->Close();
56 m_tar.reset();
58 catch( reuse::TarFile::TarError &te ) {
59 throw Barry::BackupError(te.what());
63 void Backup::ClearStats()
65 m_stats.clear();
69 //////////////////////////////////////////////////////////////////////////////
70 // Barry::Parser overrides
72 void Backup::ParseRecord(const Barry::DBData &data,
73 const Barry::IConverter *ic)
75 m_current_dbname = data.GetDBName();
77 std::ostringstream oss;
78 oss << std::hex << data.GetUniqueId()
79 << " " << (unsigned int)data.GetRecType();
80 m_tar_id_text = oss.str();
82 if( m_current_dbname.size() == 0 )
83 throw Barry::BackupError("Backup: No database name available");
84 if( m_tar_id_text.size() == 0 )
85 throw Barry::BackupError("Backup: No unique ID available!");
87 m_record_data.assign(
88 (const char*)data.GetData().GetData() + data.GetOffset(),
89 data.GetData().GetSize() - data.GetOffset());
91 // save to tarball
92 std::string tarname = m_current_dbname + "/" + m_tar_id_text;
93 m_tar->AppendFile(tarname.c_str(), m_record_data);
95 // add stats
96 m_stats[m_current_dbname]++;
99 } // namespace Barry