Mercurial > hg > orthanc-databases
diff PostgreSQL/Plugins/StoragePlugin.cpp @ 20:aacb651833f5
merge
author | am@osimis.io |
---|---|
date | Tue, 10 Jul 2018 11:08:19 +0200 |
parents | 9e419261f1c9 |
children | 17f849b2af34 |
line wrap: on
line diff
--- a/PostgreSQL/Plugins/StoragePlugin.cpp Tue Jul 10 11:05:37 2018 +0200 +++ b/PostgreSQL/Plugins/StoragePlugin.cpp Tue Jul 10 11:08:19 2018 +0200 @@ -20,180 +20,9 @@ #include "../../Framework/Plugins/StorageBackend.h" - -#include "../../Framework/Common/FileValue.h" -#include "../../Framework/PostgreSQL/PostgreSQLDatabase.h" -#include "../../Framework/PostgreSQL/PostgreSQLLargeObject.h" -#include "../../Framework/PostgreSQL/PostgreSQLTransaction.h" - -#include <Plugins/Samples/Common/OrthancPluginCppWrapper.h> -#include <Core/Logging.h> - - -namespace OrthancDatabases -{ - class PostgreSQLStorageArea : public StorageBackend - { - private: - class Factory : public IDatabaseFactory - { - private: - PostgreSQLStorageArea& that_; - - public: - Factory(PostgreSQLStorageArea& that) : - that_(that) - { - } - - virtual Dialect GetDialect() const - { - return Dialect_PostgreSQL; - } - - virtual IDatabase* Open() - { - return that_.OpenInternal(); - } - }; - - OrthancPluginContext* context_; - PostgreSQLParameters parameters_; - bool clearAll_; - - IDatabase* OpenInternal() - { - std::auto_ptr<PostgreSQLDatabase> db(new PostgreSQLDatabase(parameters_)); - - db->Open(); - - if (parameters_.HasLock()) - { - db->AdvisoryLock(43 /* some arbitrary constant */); - } - - if (clearAll_) - { - db->ClearAll(); - } - - { - PostgreSQLTransaction t(*db); - - if (!db->DoesTableExist("StorageArea")) - { - db->Execute("CREATE TABLE IF NOT EXISTS StorageArea(" - "uuid VARCHAR NOT NULL PRIMARY KEY," - "content OID NOT NULL," - "type INTEGER NOT NULL)"); - - // Automatically remove the large objects associated with the table - db->Execute("CREATE OR REPLACE RULE StorageAreaDelete AS ON DELETE " - "TO StorageArea DO SELECT lo_unlink(old.content);"); - } - - t.Commit(); - } - - return db.release(); - } - - public: - PostgreSQLStorageArea(const PostgreSQLParameters& parameters) : - StorageBackend(new Factory(*this)), - parameters_(parameters), - clearAll_(false) - { - } +#include "PostgreSQLStorageArea.h" - void SetClearAll(bool clear) - { - clearAll_ = clear; - } - - - virtual void Create(DatabaseManager::Transaction& transaction, - const std::string& uuid, - const void* content, - size_t size, - OrthancPluginContentType type) - { - std::auto_ptr<FileValue> file(new FileValue(content, size)); - - { - DatabaseManager::CachedStatement statement( - STATEMENT_FROM_HERE, GetManager(), - "INSERT INTO StorageArea VALUES (${uuid}, ${content}, ${type})"); - - statement.SetParameterType("uuid", ValueType_Utf8String); - statement.SetParameterType("content", ValueType_File); - statement.SetParameterType("type", ValueType_Integer64); - - Dictionary args; - args.SetUtf8Value("uuid", uuid); - args.SetValue("content", file.release()); - args.SetIntegerValue("type", type); - - statement.Execute(args); - } - } - - - virtual void Read(void*& content, - size_t& size, - DatabaseManager::Transaction& transaction, - const std::string& uuid, - OrthancPluginContentType type) - { - DatabaseManager::CachedStatement statement( - STATEMENT_FROM_HERE, GetManager(), - "SELECT content FROM StorageArea WHERE uuid=$1 AND type=$2"); - - statement.SetParameterType("uuid", ValueType_Utf8String); - statement.SetParameterType("type", ValueType_Integer64); - - Dictionary args; - args.SetUtf8Value("uuid", uuid); - args.SetIntegerValue("type", type); - - statement.Execute(args); - - if (statement.IsDone()) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); - } - else if (statement.GetResultFieldsCount() != 1 || - statement.GetResultField(0).GetType() != ValueType_File) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_Database); - } - else - { - const FileValue& value = dynamic_cast<const FileValue&>(statement.GetResultField(0)); - ReadFromString(content, size, value.GetContent()); - } - } - - - virtual void Remove(DatabaseManager::Transaction& transaction, - const std::string& uuid, - OrthancPluginContentType type) - { - DatabaseManager::CachedStatement statement( - STATEMENT_FROM_HERE, GetManager(), - "DELETE FROM StorageArea WHERE uuid=${uuid} AND type=${type}"); - - statement.SetParameterType("uuid", ValueType_Utf8String); - statement.SetParameterType("type", ValueType_Integer64); - - Dictionary args; - args.SetUtf8Value("uuid", uuid); - args.SetIntegerValue("type", type); - - statement.Execute(args); - } - }; -} +#include <Core/Logging.h> static bool DisplayPerformanceWarning()