lib: show offset and rectype in HexDumpParser
[barry.git] / src / backup.cc
blobdc4b86f5ccf52759143c7c828c9762c9c5720688
1 ///
2 /// \file backup.cc
3 /// Special parser class to support creation of Barry Backup files
4 ///
6 /*
7 Copyright (C) 2010, 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 std::cout << "Closing Backup parser" << std::endl;
45 try {
46 Close();
48 catch( Barry::BackupError & ) {
49 // throw it away
53 void Backup::Close()
55 if( m_tar.get() ) try {
56 m_tar->Close();
57 m_tar.reset();
59 catch( reuse::TarFile::TarError &te ) {
60 throw Barry::BackupError(te.what());
65 //////////////////////////////////////////////////////////////////////////////
66 // Barry::Parser overrides
68 void Backup::ParseRecord(const Barry::DBData &data,
69 const Barry::IConverter *ic)
71 m_current_dbname = data.GetDBName();
73 std::ostringstream oss;
74 oss << std::hex << data.GetUniqueId()
75 << " " << (unsigned int)data.GetRecType();
76 m_tar_id_text = oss.str();
78 if( m_current_dbname.size() == 0 )
79 throw Barry::BackupError("Backup: No database name available");
80 if( m_tar_id_text.size() == 0 )
81 throw Barry::BackupError("Backup: No unique ID available!");
83 m_record_data.assign(
84 (const char*)data.GetData().GetData() + data.GetOffset(),
85 data.GetData().GetSize() - data.GetOffset());
87 // save to tarball
88 std::string tarname = m_current_dbname + "/" + m_tar_id_text;
89 std::cout << "Saving: " << tarname << std::endl;
90 m_tar->AppendFile(tarname.c_str(), m_record_data);
93 } // namespace Barry