Apply meyer's singleton to programming interface
authorSangwan Kwon <sangwan.kwon@samsung.com>
Wed, 12 Jun 2019 23:47:23 +0000 (08:47 +0900)
committerSangwan Kwon <sangwan.kwon@samsung.com>
Tue, 9 Jul 2019 23:53:47 +0000 (08:53 +0900)
- Re-design API more simply

Signed-off-by: Sangwan Kwon <sangwan.kwon@samsung.com>
include/osquery/manager.h
interface-draft.md
osquery/manager/manager.cpp
osquery/manager/manager_tests.cpp

index f691da81119acc79ceb8b6610c3defc9075948bd..b46ae5b829c406c0214ccb02f3f5799fa8375899 100644 (file)
@@ -36,22 +36,24 @@ using Rows = std::vector<Row>;
 
 class OsqueryManager final {
 public:
-       ~OsqueryManager(void) noexcept;
+       OsqueryManager(const OsqueryManager&) = delete;
+       OsqueryManager& operator=(const OsqueryManager&) = delete;
 
-       OsqueryManager(const OsqueryManager &) = delete;
-       OsqueryManager(OsqueryManager &&) = delete;
-       OsqueryManager &operator=(const OsqueryManager &) = delete;
-       OsqueryManager &operator=(OsqueryManager &&) = delete;
-
-       static std::shared_ptr<OsqueryManager> Load();
-
-       Rows execute(const std::string& query) const;
-
-       std::vector<std::string> tables(void) const noexcept;
-       std::vector<std::string> columns(const std::string& table) const noexcept;
+       /// TBD: Consider error handling.
+       static Rows execute(const std::string& query);
+       static std::vector<std::string> tables(void) noexcept;
+       static std::vector<std::string> columns(const std::string& table) noexcept;
 
 private:
        OsqueryManager();
+       ~OsqueryManager() noexcept;
+
+       static OsqueryManager& instance();
+
+       /// TODO(Sangwan): Apply pimpl idiom.
+       Rows executeInternal(const std::string& query) const;
+       std::vector<std::string> tablesInternal(void) const noexcept;
+       std::vector<std::string> columnsInternal(const std::string& table) const noexcept;
 };
 
 } // namespace osquery
index ba50497da63e20fad9c899b74bb2bc4804dfcbd5..370011584fe8902a6d5e55d9b01fdb9730af1fea 100644 (file)
   // 1. Write query as std::string
   std::string query = "SELECT subject_label, object_label FROM smack WHERE access_type = 'read'";
    
-  // 2. Load OsqueryManager
-  auto manager = OsqueryManager::Load();
+  // 2. Execute query by using OsqueryManager
+  auto rows = OsqueryManager::execute(query);
    
-  // 3. Execute query by using OsqueryManager
-  auto rows = manager->execute(query);
-   
-  // 4. Get result
+  // 3. Get result
   for (const auto& row : rows) {
       std::string slabel = row["subject_label"];
       std::string olabel = row["object_label];
@@ -51,7 +48,7 @@
   using namespace osquerypp;
   
   // 1. Write callback function
-  auto  onDeny = [&](const EventContext& ec, const Row& row)
+  auto onDeny = [&](const EventContext& ec, const Row& row)
     {
       // get data of event table
       std::cout << row["action"] << std::endl;
@@ -60,9 +57,6 @@
       std::cout << row["object_label"] << std::endl;
     }
     
-  // 2. Load OsqueryManager
-  auto manager = OsqueryManager::Load();
-   
-  // 3. Register callback with event_table by using OsqueryManager
-  manager->subscribe("smack_deny_events", onDeny);
+  // 2. Register callback with event_table by using OsqueryManager
+  OsqueryManager::subscribe("smack_deny_events", onDeny);
 ```
index 592dbf8b05624cc1045416533bdffbff57eaf302..7524fad9931dd456d3b88645e705d92b57c9f73e 100644 (file)
@@ -41,7 +41,7 @@ OsqueryManager::OsqueryManager()
        if (!logDir.empty() && !(pathExists(logDir).ok()))
                boost::filesystem::create_directories(logDir);
 
-       // TODO(sangwan.kwon): Get debug mode at build time
+       // TODO(Sangwan): Get debug mode at build time
        Flag::updateValue("verbose_debug", "true");
 
        const char* cargv[] = {"tizen-osquery"};
@@ -56,13 +56,20 @@ OsqueryManager::~OsqueryManager(void) noexcept
        osquery::shutdownOsquery();
 }
 
-std::shared_ptr<OsqueryManager> OsqueryManager::Load()
+OsqueryManager& OsqueryManager::instance()
 {
-       static std::shared_ptr<OsqueryManager> manager(new OsqueryManager);
+       static OsqueryManager manager;
        return manager;
 }
 
-Rows OsqueryManager::execute(const std::string& query) const
+Rows OsqueryManager::execute(const std::string& query)
+{
+       LOG(INFO) << "Execute query: " << query;
+
+       return instance().executeInternal(query);
+}
+
+Rows OsqueryManager::executeInternal(const std::string& query) const
 {
        LOG(INFO) << "Execute query: " << query;
 
@@ -74,12 +81,22 @@ Rows OsqueryManager::execute(const std::string& query) const
        return results;
 }
 
-std::vector<std::string> OsqueryManager::tables(void) const noexcept 
+std::vector<std::string> OsqueryManager::tables(void) noexcept 
+{
+       return instance().tablesInternal();
+}
+
+std::vector<std::string> OsqueryManager::columns(const std::string& table) noexcept
+{
+       return instance().columnsInternal(table);
+}
+
+std::vector<std::string> OsqueryManager::tablesInternal(void) const noexcept 
 {
        return SQL::getTableNames();
 }
 
-std::vector<std::string> OsqueryManager::columns(const std::string& table) const noexcept
+std::vector<std::string> OsqueryManager::columnsInternal(const std::string& table) const noexcept
 {
        std::stringstream query;
        query << "SELECT * FROM " << table;
index 6f308a7cff725b5506b1057e5fab363faff6569e..b52b63b3f68fd0fcc33d98da77942204a70c0157 100644 (file)
@@ -23,16 +23,9 @@ using namespace osquery;
 
 class ManagerTests : public testing::Test {};
 
-TEST_F(ManagerTests, test_manager_load) {
-       auto manager = OsqueryManager::Load();
-       EXPECT_TRUE(manager != nullptr);
-}
-
 TEST_F(ManagerTests, test_manager_execute) {
-       auto manager = OsqueryManager::Load();
-       
        std::string query = "SELECT * FROM time";
-       auto rows = manager->execute(query);
+       auto rows = OsqueryManager::execute(query);
        EXPECT_EQ(rows.size(), 1);
 
        VLOG(1) << "[Test] time table rows:";
@@ -42,8 +35,7 @@ TEST_F(ManagerTests, test_manager_execute) {
 }
 
 TEST_F(ManagerTests, test_manager_tables) {
-       auto manager = OsqueryManager::Load();
-       auto tables = manager->tables();
+       auto tables = OsqueryManager::tables();
        EXPECT_TRUE(tables.size() > 0);
 
        VLOG(1) << "[Test] Enabled tables:";
@@ -52,8 +44,7 @@ TEST_F(ManagerTests, test_manager_tables) {
 }
 
 TEST_F(ManagerTests, test_manager_columns) {
-       auto manager = OsqueryManager::Load();
-       auto columns = manager->columns("time");
+       auto columns = OsqueryManager::columns("time");
        EXPECT_TRUE(columns.size() > 0);
 
        VLOG(1) << "[Test] Enabled columns of time table:";