| 1 | // |
| 2 | // ArchiveStrategy.cpp |
| 3 | // |
| 4 | // Library: Data |
| 5 | // Package: Logging |
| 6 | // Module: ArchiveStrategy |
| 7 | // |
| 8 | // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. |
| 9 | // and Contributors. |
| 10 | // |
| 11 | // SPDX-License-Identifier: BSL-1.0 |
| 12 | // |
| 13 | |
| 14 | |
| 15 | #include "Poco/Data/ArchiveStrategy.h" |
| 16 | #include "Poco/Ascii.h" |
| 17 | |
| 18 | namespace Poco { |
| 19 | namespace Data { |
| 20 | |
| 21 | |
| 22 | using namespace Keywords; |
| 23 | |
| 24 | // |
| 25 | // ArchiveStrategy |
| 26 | // |
| 27 | |
| 28 | |
| 29 | const std::string ArchiveStrategy::DEFAULT_ARCHIVE_DESTINATION = "T_POCO_LOG_ARCHIVE" ; |
| 30 | |
| 31 | |
| 32 | ArchiveStrategy::ArchiveStrategy(const std::string& connector, |
| 33 | const std::string& connect, |
| 34 | const std::string& source, |
| 35 | const std::string& destination): |
| 36 | _connector(connector), |
| 37 | _connect(connect), |
| 38 | _source(source), |
| 39 | _destination(destination) |
| 40 | { |
| 41 | open(); |
| 42 | } |
| 43 | |
| 44 | |
| 45 | ArchiveStrategy::~ArchiveStrategy() |
| 46 | { |
| 47 | } |
| 48 | |
| 49 | |
| 50 | void ArchiveStrategy::open() |
| 51 | { |
| 52 | if (_connector.empty() || _connect.empty()) |
| 53 | throw IllegalStateException("Connector and connect string must be non-empty." ); |
| 54 | |
| 55 | _pSession = new Session(_connector, _connect); |
| 56 | } |
| 57 | |
| 58 | |
| 59 | // |
| 60 | // ArchiveByAgeStrategy |
| 61 | // |
| 62 | |
| 63 | |
| 64 | ArchiveByAgeStrategy::ArchiveByAgeStrategy(const std::string& connector, |
| 65 | const std::string& connect, |
| 66 | const std::string& sourceTable, |
| 67 | const std::string& destinationTable): |
| 68 | ArchiveStrategy(connector, connect, sourceTable, destinationTable) |
| 69 | { |
| 70 | initStatements(); |
| 71 | } |
| 72 | |
| 73 | |
| 74 | ArchiveByAgeStrategy::~ArchiveByAgeStrategy() |
| 75 | { |
| 76 | } |
| 77 | |
| 78 | |
| 79 | void ArchiveByAgeStrategy::archive() |
| 80 | { |
| 81 | if (!session().isConnected()) open(); |
| 82 | |
| 83 | DateTime now; |
| 84 | _archiveDateTime = now - _maxAge; |
| 85 | getCountStatement().execute(); |
| 86 | if (_archiveCount > 0) |
| 87 | { |
| 88 | getCopyStatement().execute(); |
| 89 | getDeleteStatement().execute(); |
| 90 | } |
| 91 | } |
| 92 | |
| 93 | |
| 94 | void ArchiveByAgeStrategy::initStatements() |
| 95 | { |
| 96 | std::string src = getSource(); |
| 97 | std::string dest = getDestination(); |
| 98 | |
| 99 | setCountStatement(); |
| 100 | _archiveCount = 0; |
| 101 | std::string sql; |
| 102 | Poco::format(sql, "SELECT COUNT(*) FROM %s WHERE DateTime < ?" , src); |
| 103 | getCountStatement() << sql, into(_archiveCount), use(_archiveDateTime); |
| 104 | |
| 105 | setCopyStatement(); |
| 106 | sql.clear(); |
| 107 | Poco::format(sql, "INSERT INTO %s SELECT * FROM %s WHERE DateTime < ?" , dest, src); |
| 108 | getCopyStatement() << sql, use(_archiveDateTime); |
| 109 | |
| 110 | setDeleteStatement(); |
| 111 | sql.clear(); |
| 112 | Poco::format(sql, "DELETE FROM %s WHERE DateTime < ?" , src); |
| 113 | getDeleteStatement() << sql, use(_archiveDateTime); |
| 114 | } |
| 115 | |
| 116 | |
| 117 | void ArchiveByAgeStrategy::setThreshold(const std::string& age) |
| 118 | { |
| 119 | std::string::const_iterator it = age.begin(); |
| 120 | std::string::const_iterator end = age.end(); |
| 121 | int n = 0; |
| 122 | while (it != end && Ascii::isSpace(*it)) ++it; |
| 123 | while (it != end && Ascii::isDigit(*it)) { n *= 10; n += *it++ - '0'; } |
| 124 | while (it != end && Ascii::isSpace(*it)) ++it; |
| 125 | std::string unit; |
| 126 | while (it != end && Ascii::isAlpha(*it)) unit += *it++; |
| 127 | |
| 128 | Timespan::TimeDiff factor = Timespan::SECONDS; |
| 129 | if (unit == "minutes" ) |
| 130 | factor = Timespan::MINUTES; |
| 131 | else if (unit == "hours" ) |
| 132 | factor = Timespan::HOURS; |
| 133 | else if (unit == "days" ) |
| 134 | factor = Timespan::DAYS; |
| 135 | else if (unit == "weeks" ) |
| 136 | factor = 7*Timespan::DAYS; |
| 137 | else if (unit == "months" ) |
| 138 | factor = 30*Timespan::DAYS; |
| 139 | else if (unit != "seconds" ) |
| 140 | throw InvalidArgumentException("setMaxAge" , age); |
| 141 | |
| 142 | _maxAge = factor * n; |
| 143 | } |
| 144 | |
| 145 | |
| 146 | } } // namespace Poco::Data |
| 147 | |