50101688df
The goal of the DataBlob base class is encapsulating read/write access to permanent data storage *on demand*. Comparing it to files, it is more like a path name than a file handle. boost::shared_ptr are used a) because it automates deletion of the actual data streams and b) some implementations of DataBlob might have to share access to these instances. One possible implementation (included in this patch) is indeed a plain file. It writes into a temporary file and only renames it to the final path name on success, which emulates the behavior of the FileConfigNode. The actual implementation of this renaming was moved into a separate class, the SafeOstream. Another (to be added later) is a chunk of data inside a larger file. This is needed for embedding different .ini style files inside one large text file, as required for MBC #1208).
51 lines
1.5 KiB
C++
51 lines
1.5 KiB
C++
/*
|
|
* Copyright (C) 2008-2009 Patrick Ohly <patrick.ohly@gmx.de>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) version 3.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA
|
|
*/
|
|
|
|
#include <syncevo/SafeOstream.h>
|
|
#include <syncevo/SyncContext.h>
|
|
|
|
#include <syncevo/declarations.h>
|
|
SE_BEGIN_CXX
|
|
|
|
SafeOstream::SafeOstream(const std::string filename) :
|
|
m_filename(filename)
|
|
{
|
|
size_t pos = filename.rfind('/');
|
|
if (pos == filename.npos) {
|
|
m_tmpFilename = ".#";
|
|
m_tmpFilename += filename;
|
|
} else {
|
|
m_tmpFilename.assign(filename, 0, pos + 1);
|
|
m_tmpFilename += ".#";
|
|
m_tmpFilename += filename.substr(pos + 1);
|
|
}
|
|
open(m_tmpFilename.c_str());
|
|
}
|
|
|
|
SafeOstream::~SafeOstream()
|
|
{
|
|
close();
|
|
if (bad() ||
|
|
rename(m_tmpFilename.c_str(), m_filename.c_str())) {
|
|
SyncContext::throwError(m_tmpFilename, errno);
|
|
}
|
|
}
|
|
|
|
SE_END_CXX
|
|
|