Commit ce701d78 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

allow external queries by default, add --disable_external_backends_switch,...

allow external queries by default, add --disable_external_backends_switch, make mysql code conditional on FNORD_ENABLE_MYSQL
parent 1d2e108e
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -160,9 +160,9 @@ install(TARGETS fnordmetric-server DESTINATION bin)

find_package(MySQL)
if(MYSQL_FOUND)
  include_directories(${MYSQL_INCLUDE_DIRS})
  target_link_libraries(fnordmetric-cli mysqlclient)
  target_link_libraries(fnordmetric-server mysqlclient)
#  include_directories(${MYSQL_INCLUDE_DIRS})
#  target_link_libraries(fnordmetric-cli mysqlclient)
#  target_link_libraries(fnordmetric-server mysqlclient)
endif()

if(ENABLE_TESTS)
+15 −1
Original line number Diff line number Diff line
/**
 * This file is part of the "FnordMetric" project
 *   Copyright (c) 2011-2014 Paul Asmuth, Google Inc.
 *   Copyright (c) 2014 Paul Asmuth, Google Inc.
 *
 * FnordMetric is free software: you can redistribute it and/or modify it under
 * the terms of the GNU General Public License v3.0. You should have received a
 * copy of the GNU General Public License along with this program. If not, see
 * <http://www.gnu.org/licenses/>.
 */
#include <fnordmetric/environment.h>
#include <fnordmetric/metricdb/httpapi.h>
#include <fnordmetric/query/queryservice.h>
#include <fnordmetric/metricdb/metricrepository.h>
#include <fnordmetric/metricdb/metrictablerepository.h>
#include <fnordmetric/util/stringutil.h>
#include <fnordmetric/sql/backends/csv/csvbackend.h>
#include <fnordmetric/sql/backends/mysql/mysqlbackend.h>

namespace fnordmetric {
namespace metricdb {
@@ -241,6 +244,17 @@ void HTTPAPI::executeQuery(
  std::unique_ptr<query::TableRepository> table_repo(
      new MetricTableRepository(metric_repo_));


  if (!env()->flags()->isSet("disable_external_backends")) {
    query_service.registerBackend(
        std::unique_ptr<fnordmetric::query::Backend>(
            new fnordmetric::query::mysql_backend::MySQLBackend));

    query_service.registerBackend(
        std::unique_ptr<fnordmetric::query::Backend>(
            new fnordmetric::query::csv_backend::CSVBackend));
  }

  query::QueryService::kFormat resp_format = query::QueryService::FORMAT_JSON;
  std::string format_param;
  if (util::URI::getParam(params, "format", &format_param)) {
+9 −1
Original line number Diff line number Diff line
@@ -188,7 +188,6 @@ int main(int argc, const char** argv) {
      "One of 'disk', 'inmemory', 'mysql' or 'hbase'. Default: 'disk'",
      "<name>");

  // flags
  env()->flags()->defineFlag(
      "datadir",
      cli::FlagParser::T_STRING,
@@ -198,6 +197,15 @@ int main(int argc, const char** argv) {
      "Store the database in this directory (disk backend only)",
      "<path>");

  env()->flags()->defineFlag(
      "disable_external_backends",
      cli::FlagParser::T_SWITCH,
      false,
      NULL,
      NULL,
      NULL,
      "Disable queries against external backends like CSV files or MySQL");

  env()->flags()->defineFlag(
      "verbose",
      cli::FlagParser::T_SWITCH,
+2 −0
Original line number Diff line number Diff line
@@ -28,12 +28,14 @@ static std::mutex global_mysql_init_lock;
static bool global_mysql_initialized = false;

MySQLBackend::MySQLBackend() {
#ifdef FNORD_ENABLE_MYSQL
  global_mysql_init_lock.lock();
  if (!global_mysql_initialized) {
    mysql_library_init(0, NULL, NULL); // FIXPAUl mysql_library_end();
    global_mysql_initialized = true;
  }
  global_mysql_init_lock.unlock();
#endif
}

bool MySQLBackend::openTables(
+22 −1
Original line number Diff line number Diff line
@@ -22,15 +22,23 @@ std::unique_ptr<MySQLConnection> MySQLConnection::openConnection(
}

MySQLConnection::MySQLConnection() : mysql_(nullptr) {
#ifdef FNORD_ENABLE_MYSQL
  mysql_ = mysql_init(NULL);

  if (mysql_ == nullptr) {
    RAISE(kRuntimeError, "mysql_init() failed\n");
  }
#else
  RAISE(kRuntimeError, "fnordmetric was compiled without libmysqlclient");
#endif
}

MySQLConnection::~MySQLConnection() {
#ifdef FNORD_ENABLE_MYSQL
  mysql_close(mysql_);
#else
  RAISE(kRuntimeError, "fnordmetric was compiled without libmysqlclient");
#endif
}

void MySQLConnection::connect(const util::URI& uri) {
@@ -88,6 +96,7 @@ void MySQLConnection::connect(
    const std::string& database,
    const std::string& username,
    const std::string& password) {
#ifdef FNORD_ENABLE_MYSQL
  auto ret = mysql_real_connect(
      mysql_,
      host.c_str(),
@@ -104,11 +113,17 @@ void MySQLConnection::connect(
      "mysql_real_connect() failed: %s\n",
      mysql_error(mysql_));
  }
#else
  RAISE(kRuntimeError, "fnordmetric was compiled without libmysqlclient");
#endif
}


std::vector<std::string> MySQLConnection::describeTable(
    const std::string& table_name) {
  std::vector<std::string> columns;

#ifdef FNORD_ENABLE_MYSQL
  MYSQL_RES* res = mysql_list_fields(mysql_, table_name.c_str(), NULL);
  if (res == nullptr) {
    RAISE(
@@ -117,7 +132,6 @@ std::vector<std::string> MySQLConnection::describeTable(
      mysql_error(mysql_));
  }

  std::vector<std::string> columns;
  auto num_cols = mysql_num_fields(res);
  for (int i = 0; i < num_cols; ++i) {
    MYSQL_FIELD* col = mysql_fetch_field_direct(res, i);
@@ -125,12 +139,16 @@ std::vector<std::string> MySQLConnection::describeTable(
  }

  mysql_free_result(res);
#else
  RAISE(kRuntimeError, "fnordmetric was compiled without libmysqlclient");
#endif
  return columns;
}

void MySQLConnection::executeQuery(
    const std::string& query,
    std::function<bool (const std::vector<std::string>&)> row_callback) {
#ifdef FNORD_ENABLE_MYSQL
  if (env()->verbose()) {
    fnord::util::LogEntry entry;
    entry.append("__severity__", "DEBUG");
@@ -182,6 +200,9 @@ void MySQLConnection::executeQuery(
  }

  mysql_free_result(result);
#else
  RAISE(kRuntimeError, "fnordmetric was compiled without libmysqlclient");
#endif
}

}
Loading