From d35bffb950d7cdfc24c72ef098c3018befad14d6 Mon Sep 17 00:00:00 2001
From: warptangent <warptangent@inbox.com>
Date: Sat, 16 May 2015 01:29:02 -0700
Subject: [PATCH] Allow BlockchainLMDB to be opened in read-only mode

Have blockchain_export use read-only mode when source is BlockchainLMDB.
---
 src/blockchain_db/lmdb/db_lmdb.cpp             | 8 ++++++--
 src/blockchain_utilities/blockchain_export.cpp | 7 +++++--
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index 5126db400..201386e47 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -678,9 +678,13 @@ void BlockchainLMDB::open(const std::string& filename, const int mdb_flags)
   if (auto result = mdb_env_open(m_env, filename.c_str(), mdb_flags, 0644))
     throw0(DB_ERROR(std::string("Failed to open lmdb environment: ").append(mdb_strerror(result)).c_str()));
 
-  // get a read/write MDB_txn
+  int txn_flags = 0;
+  if (mdb_flags & MDB_RDONLY)
+    txn_flags |= MDB_RDONLY;
+
+  // get a read/write MDB_txn, depending on mdb_flags
   mdb_txn_safe txn;
-  if (mdb_txn_begin(m_env, NULL, 0, txn))
+  if (mdb_txn_begin(m_env, NULL, txn_flags, txn))
     throw0(DB_ERROR("Failed to create a transaction for the db"));
 
   // open necessary databases, and set properties as needed
diff --git a/src/blockchain_utilities/blockchain_export.cpp b/src/blockchain_utilities/blockchain_export.cpp
index 6f67c61c3..ec885ea98 100644
--- a/src/blockchain_utilities/blockchain_export.cpp
+++ b/src/blockchain_utilities/blockchain_export.cpp
@@ -129,11 +129,14 @@ int main(int argc, char* argv[])
   BlockchainDB* db = new BlockchainLMDB();
   boost::filesystem::path folder(m_config_folder);
   folder /= db->get_db_name();
-  LOG_PRINT_L0("Loading blockchain from folder " << folder.string() << " ...");
+  int lmdb_flags = 0;
+  lmdb_flags |= MDB_RDONLY;
   const std::string filename = folder.string();
+
+  LOG_PRINT_L0("Loading blockchain from folder " << filename << " ...");
   try
   {
-    db->open(filename);
+    db->open(filename, lmdb_flags);
   }
   catch (const std::exception& e)
   {