make destructor from all model::table protected to prevent misuse because of reference counting

This commit is contained in:
einhornimmond 2021-07-15 11:53:12 +02:00 committed by einhorn_b
parent 3e9cc2442b
commit 9b21695387
11 changed files with 33 additions and 16 deletions

View File

@ -70,10 +70,13 @@ namespace controller {
Poco::AutoPtr<EmailVerificationCode> EmailVerificationCode::loadOrCreate(int user_id, model::table::EmailOptInType type)
{
model::table::EmailOptIn db;
auto db = new model::table::EmailOptIn();
std::vector<std::string> fields = { "user_id", "email_opt_in_type_id" };
std::vector<int> field_values = { user_id, (int)type };
auto results = db.loadFromDB<int, model::table::EmailOptInTuple>(fields, field_values);
auto results = db->loadFromDB<int, model::table::EmailOptInTuple>(fields, field_values);
db->release();
db = nullptr;
if (results.size() > 0) {
return Poco::AutoPtr<EmailVerificationCode>(new EmailVerificationCode(new model::table::EmailOptIn(results[0])));
}

View File

@ -136,7 +136,7 @@ namespace controller {
{
auto db = new model::table::User();
if (0 == db->loadFromDB("id", user_id)) {
delete db;
db->release();
return nullptr;
}
auto user = new User(db);

View File

@ -16,7 +16,7 @@ namespace model {
AppAccessToken(int user_id, const Poco::UInt64& code);
AppAccessToken(const AppAccessCodeTuple& tuple);
AppAccessToken();
~AppAccessToken();
// generic db operations
const char* getTableName() const { return "app_access_tokens"; }
@ -32,6 +32,8 @@ namespace model {
size_t update();
protected:
~AppAccessToken();
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);
Poco::Data::Statement _insertIntoDB(Poco::Data::Session session);

View File

@ -31,14 +31,15 @@ namespace model {
{
public:
ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData);
~ElopageBuy();
// generic db operations
const char* getTableName() const { return "elopage_buys"; }
std::string toString();
protected:
~ElopageBuy();
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _insertIntoDB(Poco::Data::Session session);

View File

@ -26,7 +26,7 @@ namespace model {
EmailOptIn(const Poco::UInt64& code, EmailOptInType type);
EmailOptIn(const EmailOptInTuple& tuple);
EmailOptIn();
~EmailOptIn();
// generic db operations
const char* getTableName() const { return "email_opt_in"; }
@ -46,6 +46,8 @@ namespace model {
static const char* typeToString(EmailOptInType type);
static EmailOptInType stringToType(const std::string& typeString);
protected:
~EmailOptIn();
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);
Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName);

View File

@ -15,8 +15,7 @@ namespace model {
Group();
Group(const std::string& alias, const std::string& name, const std::string& url, const std::string& host, const std::string& home, const std::string& description);
Group(GroupTuple userTuple);
~Group();
// generic db operations
const char* getTableName() const { return "groups"; }
std::string toString();
@ -35,6 +34,8 @@ namespace model {
inline void setHome(const std::string& home) { UNIQUE_LOCK; mHome = home; }
protected:
~Group();
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadAllFromDB(Poco::Data::Session session);
Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName);

View File

@ -32,7 +32,7 @@ namespace model {
public:
ModelBase(int id) :mID(id), mReferenceCount(1) {}
ModelBase() : mID(0), mReferenceCount(1) {}
virtual ~ModelBase();
virtual const char* getTableName() const = 0;
//! called from within of some catch to give more information for debugging, don't lock mutex!
@ -90,6 +90,8 @@ namespace model {
void duplicate();
void release();
protected:
virtual ~ModelBase();
virtual Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session) = 0;
virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName) = 0;
virtual Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::vector<std::string>& fieldNames, MysqlConditionType conditionType = MYSQL_CONDITION_AND);
@ -105,6 +107,9 @@ namespace model {
mutable std::shared_mutex mSharedMutex;
private:
};
template<class T>

View File

@ -28,7 +28,6 @@ namespace model {
PendingTask(int userId, std::string serializedProtoRequest, TaskType type);
PendingTask(const PendingTaskTuple& tuple);
~PendingTask();
// generic db operations
const char* getTableName() const { return "pending_tasks"; }
@ -65,6 +64,8 @@ namespace model {
static const char* typeToString(TaskType type);
protected:
~PendingTask();
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadAllFromDB(Poco::Data::Session session);
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);

View File

@ -38,7 +38,7 @@ namespace model {
User();
User(UserTuple tuple);
User(const std::string& email, const std::string& first_name, const std::string& last_name, int group_id, Poco::UInt64 passwordHashed = 0, std::string languageKey = "de");
~User();
// generic db operations
const char* getTableName() const { return "users"; }
@ -97,6 +97,7 @@ namespace model {
Poco::JSON::Object getJson();
protected:
~User();
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);

View File

@ -15,8 +15,7 @@ namespace model {
UserBackup(int user_id, const std::string& passphrase, ServerConfig::Mnemonic_Types type);
UserBackup(const UserBackupsTuple& tuple);
UserBackup();
~UserBackup();
// generic db operations
const char* getTableName() const { return "user_backups"; }
std::string toString();
@ -29,6 +28,7 @@ namespace model {
protected:
~UserBackup();
//! \brief call from constructor if mMnemonicType -1
//!

View File

@ -23,7 +23,6 @@ namespace model {
UserRole(int user_id, RoleType type);
UserRole(const UserRolesTuple& tuple);
UserRole();
~UserRole();
// generic db operations
const char* getTableName() const { return "user_roles"; }
@ -35,7 +34,9 @@ namespace model {
inline void setUserId(int user_Id) { mUserId = user_Id; }
static const char* typeToString(RoleType type);
protected:
protected:
~UserRole();
Poco::Data::Statement _loadFromDB(Poco::Data::Session session, const std::string& fieldName);
Poco::Data::Statement _loadIdFromDB(Poco::Data::Session session);
Poco::Data::Statement _loadMultipleFromDB(Poco::Data::Session session, const std::string& fieldName);