aboutsummaryrefslogtreecommitdiff
path: root/libbrep/database-lock.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbrep/database-lock.hxx')
-rw-r--r--libbrep/database-lock.hxx43
1 files changed, 43 insertions, 0 deletions
diff --git a/libbrep/database-lock.hxx b/libbrep/database-lock.hxx
new file mode 100644
index 0000000..60d57a4
--- /dev/null
+++ b/libbrep/database-lock.hxx
@@ -0,0 +1,43 @@
+// file : libbrep/database-lock.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef LIBBREP_DATABASE_LOCK_HXX
+#define LIBBREP_DATABASE_LOCK_HXX
+
+#include <odb/pgsql/forward.hxx> // database, transaction
+#include <odb/pgsql/connection.hxx>
+
+#include <libbrep/types.hxx>
+#include <libbrep/utility.hxx>
+
+namespace brep
+{
+ struct database_locked: std::exception
+ {
+ virtual char const*
+ what () const throw () {return "database locked";}
+ };
+
+ // Try to "lock" the PostgreSQL database in the constructor and release the
+ // lock in the destructor. Throw database_locked if the database is already
+ // locked by someone else. May also throw odb::pgsql::database_exception.
+ //
+ // This mechanism is used by the brep loader and schema migration tool to
+ // make sure they don't step on each others toes.
+ //
+ // Note: movable but not copyable.
+ //
+ class database_lock
+ {
+ public:
+ explicit
+ database_lock (odb::pgsql::database&);
+
+ private:
+ odb::pgsql::connection_ptr connection_;
+ unique_ptr<odb::pgsql::transaction> transaction_;
+ };
+}
+
+#endif // LIBBREP_DATABASE_LOCK_HXX