in src/main/cpp/fixedwindowrollingpolicy.cpp [257:369]
bool FixedWindowRollingPolicy::purge(int lowIndex, int highIndex, Pool& p) const
{
int suffixLength = 0;
std::vector<FileRenameActionPtr> renames;
LogString buf;
ObjectPtr obj = std::make_shared<Integer>(lowIndex);
formatFileName(obj, buf, p);
LogString lowFilename(buf);
if (lowFilename.compare(lowFilename.length() - 3, 3, LOG4CXX_STR(".gz")) == 0)
{
suffixLength = 3;
}
else if (lowFilename.compare(lowFilename.length() - 4, 4, LOG4CXX_STR(".zip")) == 0)
{
suffixLength = 4;
}
for (int i = lowIndex; i <= highIndex; i++)
{
File toRenameCompressed;
toRenameCompressed.setPath(lowFilename);
File toRenameBase;
toRenameBase.setPath(lowFilename.substr(0, lowFilename.length() - suffixLength));
File* toRename = &toRenameCompressed;
bool isBase = false;
bool exists = toRenameCompressed.exists(p);
if (suffixLength > 0)
{
if (exists)
{
if (toRenameBase.exists(p))
{
toRenameBase.deleteFile(p);
}
}
else
{
toRename = &toRenameBase;
exists = toRenameBase.exists(p);
isBase = true;
}
}
if (exists)
{
//
// if at upper index then
// attempt to delete last file
// if that fails then abandon purge
if (i == highIndex)
{
if (!toRename->deleteFile(p))
{
return false;
}
break;
}
//
// if intermediate index
// add a rename action to the list
buf.erase(buf.begin(), buf.end());
obj = std::make_shared<Integer>(i + 1);
formatFileName(obj, buf, p);
LogString highFilename(buf);
LogString renameTo(highFilename);
if (isBase)
{
renameTo =
highFilename.substr(0, highFilename.length() - suffixLength);
}
renames.push_back(std::make_shared<FileRenameAction>(*toRename, File().setPath(renameTo), true));
lowFilename = highFilename;
}
else
{
break;
}
}
//
// work renames backwards
//
for (std::vector<FileRenameActionPtr>::reverse_iterator iter = renames.rbegin();
iter != renames.rend();
iter++)
{
try
{
if (!(*iter)->execute(p))
{
return false;
}
}
catch (std::exception&)
{
LogLog::warn(LOG4CXX_STR("Exception during purge in RollingFileAppender"));
return false;
}
}
return true;
}