diff options
Diffstat (limited to 'source/game/StarVersioningDatabase.hpp')
-rw-r--r-- | source/game/StarVersioningDatabase.hpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/source/game/StarVersioningDatabase.hpp b/source/game/StarVersioningDatabase.hpp new file mode 100644 index 0000000..859c313 --- /dev/null +++ b/source/game/StarVersioningDatabase.hpp @@ -0,0 +1,87 @@ +#ifndef STAR_VERSIONING_DATABASE_HPP +#define STAR_VERSIONING_DATABASE_HPP + +#include "StarJson.hpp" +#include "StarDataStream.hpp" +#include "StarThread.hpp" +#include "StarVersion.hpp" +#include "StarLuaRoot.hpp" + +namespace Star { + +STAR_STRUCT(VersionedJson); +STAR_CLASS(VersioningDatabase); + +STAR_EXCEPTION(VersionedJsonException, StarException); +STAR_EXCEPTION(VersioningDatabaseException, StarException); + +struct VersionedJson { + static char const* const Magic; + static size_t const MagicStringSize; + + // Writes and reads a binary file containing a versioned json with a magic + // header marking it as a starbound versioned json file. Writes using a + // safe write/flush/swap. + static VersionedJson readFile(String const& filename); + static void writeFile(VersionedJson const& versionedJson, String const& filename); + + // Writes and reads a json containing a versioned json + // This allows embedding versioned metadata within a file + static VersionedJson fromJson(Json const& source); + Json toJson() const; + + bool empty() const; + + // If the identifier does not match the given identifier, throws a + // VersionedJsonException. + void expectIdentifier(String const& expectedIdentifier) const; + + String identifier; + VersionNumber version; + Json content; +}; + +DataStream& operator>>(DataStream& ds, VersionedJson& versionedJson); +DataStream& operator<<(DataStream& ds, VersionedJson const& versionedJson); + +class VersioningDatabase { +public: + VersioningDatabase(); + + // Converts the given content Json to a VersionedJson by marking it with the + // given identifier and the current version configured in the versioning + // config file. + VersionedJson makeCurrentVersionedJson(String const& identifier, Json const& content) const; + + // Returns true if the version in this VersionedJson matches the configured + // current version and does not need updating. + bool versionedJsonCurrent(VersionedJson const& versionedJson) const; + + // Brings the given versioned json up to the current configured latest + // version using update scripts. If successful, returns the up to date + // VersionedJson, otherwise throws VersioningDatabaseException. + VersionedJson updateVersionedJson(VersionedJson const& versionedJson) const; + + // Convenience method, checkts the versionedJson expected identifier and then + // brings the given versionedJson up to date and returns the content. + Json loadVersionedJson(VersionedJson const& versionedJson, String const& expectedIdentifier) const; + +private: + struct VersionUpdateScript { + String script; + VersionNumber fromVersion; + VersionNumber toVersion; + }; + + LuaCallbacks makeVersioningCallbacks() const; + + mutable RecursiveMutex m_mutex; + mutable LuaRoot m_luaRoot; + + StringMap<VersionNumber> m_currentVersions; + StringMap<List<VersionUpdateScript>> m_versionUpdateScripts; +}; + +} + +#endif |