commit d17500a3b0d60a8eb25a3c6ce1cfe3ab2b7bcdbc Author: Tobias Reisinger Date: Fri Jul 12 21:05:56 2019 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..49953a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +build +cmake-build-debug +.idea diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..922f571 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,106 @@ +cmake_minimum_required (VERSION 3.2) +Project(emgauwa-core) + +link_directories(/usr/local/lib) +link_libraries(drogon trantor pthread dl) + +IF (CMAKE_SYSTEM_NAME MATCHES "Linux") + EXEC_PROGRAM (gcc ARGS "--version | grep '^gcc'|awk '{print $3}' | sed s'/)//g' | sed s'/-.*//g'" OUTPUT_VARIABLE version) + MESSAGE(STATUS "This is gcc version:: " ${version}) + if(version LESS 5.4.0) + MESSAGE(STATUS "gcc is too old") + stop() + elseif(version LESS 7.1.0) + set(CMAKE_CXX_STD_FLAGS c++14) + MESSAGE(STATUS "c++14") + else() + set(CMAKE_CXX_STD_FLAGS c++17) + MESSAGE(STATUS "c++17") + endif() +else() + set(CMAKE_CXX_STD_FLAGS c++17) +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "") + set(CMAKE_BUILD_TYPE Release) +endif() + +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -std=${CMAKE_CXX_STD_FLAGS}") +set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -std=${CMAKE_CXX_STD_FLAGS}") + +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules/) + +#jsoncpp +find_package (Jsoncpp REQUIRED) +include_directories(${JSONCPP_INCLUDE_DIRS}) +link_libraries(${JSONCPP_LIBRARIES}) + +#uuid +find_package (UUID REQUIRED) +include_directories(${UUID_INCLUDE_DIR}) +link_libraries(${UUID_LIBRARIES}) + +#OpenSSL +find_package (OpenSSL) +if(OpenSSL_FOUND) + include_directories(${OPENSSL_INCLUDE_DIR}) + link_libraries(${OPENSSL_LIBRARIES}) +endif() + +#zlib +find_package(ZLIB REQUIRED) +include_directories(${ZLIB_INCLUDE_DIR}) +link_libraries(${ZLIB_LIBRARIES}) + +#find postgres +find_package(PostgreSQL) +if(PostgreSQL_FOUND) +include_directories(${PostgreSQL_INCLUDE_DIR}) +link_libraries(${PostgreSQL_LIBRARIES}) +endif() + +#Find mysql, only mariadb client liberary is supported +find_package(MySQL) +if(MYSQL_FOUND) + message(STATUS "inc:" ${MYSQL_INCLUDE_DIR}) + message(STATUS "libs:" ${MYSQL_CLIENT_LIBS}) + message(STATUS "version:" ${MYSQL_VERSION_STRING}) + if(MYSQL_VERSION_STRING STREQUAL "") + message(STATUS "The mysql in your system is not the mariadb, so we can't use it in drogon") + else() + message(STATUS "Ok! We find the mariadb!") + include_directories(${MYSQL_INCLUDE_DIR}) + link_libraries(${MYSQL_CLIENT_LIBS}) + endif() +endif() + +#Find sqlite3. +find_package (SQLite3) +if (SQLITE3_FOUND) + include_directories(${SQLITE3_INCLUDE_DIRS}) + link_libraries(${SQLITE3_LIBRARIES}) +endif() + +AUX_SOURCE_DIRECTORY(./ SRC_DIR) +AUX_SOURCE_DIRECTORY(controllers CTL_SRC) +AUX_SOURCE_DIRECTORY(filters FILTER_SRC) +AUX_SOURCE_DIRECTORY(plugins PLUGIN_SRC) +AUX_SOURCE_DIRECTORY(models MODEL_SRC) + +include_directories(/usr/local/include) + +FILE(GLOB SCP_LIST ${CMAKE_CURRENT_SOURCE_DIR}/views/*.csp) +foreach(cspFile ${SCP_LIST}) + message(STATUS "cspFile:" ${cspFile}) + EXEC_PROGRAM(basename ARGS "${cspFile} .csp" OUTPUT_VARIABLE classname) + message(STATUS "view classname:" ${classname}) + add_custom_command(OUTPUT ${classname}.h ${classname}.cc + COMMAND drogon_ctl + ARGS create view ${cspFile} + DEPENDS ${cspFile} + VERBATIM ) + set(VIEWSRC ${VIEWSRC} ${classname}.cc) +endforeach() + +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +add_executable(emgauwa-core ${SRC_DIR} ${CTL_SRC} ${FILTER_SRC} ${VIEWSRC} ${PLUGIN_SRC} ${MODEL_SRC}) diff --git a/cmake_modules/FindJsoncpp.cmake b/cmake_modules/FindJsoncpp.cmake new file mode 100644 index 0000000..8c69d14 --- /dev/null +++ b/cmake_modules/FindJsoncpp.cmake @@ -0,0 +1,63 @@ +# Find jsoncpp +# +# Find the jsoncpp includes and library +# +# if you nee to add a custom library search path, do it via via CMAKE_PREFIX_PATH +# +# This module defines +# JSONCPP_INCLUDE_DIRS, where to find header, etc. +# JSONCPP_LIBRARIES, the libraries needed to use jsoncpp. +# JSONCPP_FOUND, If false, do not try to use jsoncpp. +# JSONCPP_INCLUDE_PREFIX, include prefix for jsoncpp + +# only look in default directories +find_path( + JSONCPP_INCLUDE_DIR + NAMES jsoncpp/json/json.h json/json.h + DOC "jsoncpp include dir" +) + +find_library( + JSONCPP_LIBRARY + NAMES jsoncpp + DOC "jsoncpp library" +) + +set(JSONCPP_INCLUDE_DIRS ${JSONCPP_INCLUDE_DIR}) +set(JSONCPP_LIBRARIES ${JSONCPP_LIBRARY}) + +# debug library on windows +# same naming convention as in qt (appending debug library with d) +# boost is using the same "hack" as us with "optimized" and "debug" +if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + find_library( + JSONCPP_LIBRARY_DEBUG + NAMES jsoncppd + DOC "jsoncpp debug library" + ) + + set(JSONCPP_LIBRARIES optimized ${JSONCPP_LIBRARIES} debug ${JSONCPP_LIBRARY_DEBUG}) + +endif() + +# find JSONCPP_INCLUDE_PREFIX +find_path( + JSONCPP_INCLUDE_PREFIX + NAMES json.h + PATH_SUFFIXES jsoncpp/json json +) + +if (${JSONCPP_INCLUDE_PREFIX} MATCHES "jsoncpp") + set(JSONCPP_INCLUDE_PREFIX "jsoncpp") + set(JSONCPP_INCLUDE_DIRS "${JSONCPP_INCLUDE_DIRS}/jsoncpp") +else() + set(JSONCPP_INCLUDE_PREFIX "") +endif() + + +# handle the QUIETLY and REQUIRED arguments and set JSONCPP_FOUND to TRUE +# if all listed variables are TRUE, hide their existence from configuration view +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(jsoncpp DEFAULT_MSG + JSONCPP_INCLUDE_DIR JSONCPP_LIBRARY) +mark_as_advanced (JSONCPP_INCLUDE_DIR JSONCPP_LIBRARY) diff --git a/cmake_modules/FindMySQL.cmake b/cmake_modules/FindMySQL.cmake new file mode 100644 index 0000000..98fa5d3 --- /dev/null +++ b/cmake_modules/FindMySQL.cmake @@ -0,0 +1,114 @@ +#-------------------------------------------------------- +# Copyright (C) 1995-2007 MySQL AB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of version 2 of the GNU General Public License as +# published by the Free Software Foundation. +# +# There are special exceptions to the terms and conditions of the GPL +# as it is applied to this software. View the full text of the exception +# in file LICENSE.exceptions in the top-level directory of this software +# distribution. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# +# The MySQL Connector/ODBC is licensed under the terms of the +# GPL, like most MySQL Connectors. There are special exceptions +# to the terms and conditions of the GPL as it is applied to +# this software, see the FLOSS License Exception available on +# mysql.com. + +########################################################################## + + +#-------------- FIND MYSQL_INCLUDE_DIR ------------------ +FIND_PATH(MYSQL_INCLUDE_DIR mysql.h + /usr/include/mysql + /usr/local/include/mysql + /opt/mysql/mysql/include + /opt/mysql/mysql/include/mysql + /opt/mysql/include + /opt/local/include/mysql5 + /usr/local/mysql/include + /usr/local/mysql/include/mysql + $ENV{ProgramFiles}/MySQL/*/include + $ENV{SystemDrive}/MySQL/*/include) + +#----------------- FIND MYSQL_LIB_DIR ------------------- +IF (WIN32) + # Set lib path suffixes + # dist = for mysql binary distributions + # build = for custom built tree + IF (CMAKE_BUILD_TYPE STREQUAL Debug) + SET(libsuffixDist debug) + SET(libsuffixBuild Debug) + ELSE (CMAKE_BUILD_TYPE STREQUAL Debug) + SET(libsuffixDist opt) + SET(libsuffixBuild Release) + ADD_DEFINITIONS(-DDBUG_OFF) + ENDIF (CMAKE_BUILD_TYPE STREQUAL Debug) + + FIND_LIBRARY(MYSQL_LIB NAMES mysqlclient + PATHS + $ENV{MYSQL_DIR}/lib/${libsuffixDist} + $ENV{MYSQL_DIR}/libmysql + $ENV{MYSQL_DIR}/libmysql/${libsuffixBuild} + $ENV{MYSQL_DIR}/client/${libsuffixBuild} + $ENV{MYSQL_DIR}/libmysql/${libsuffixBuild} + $ENV{ProgramFiles}/MySQL/*/lib/${libsuffixDist} + $ENV{SystemDrive}/MySQL/*/lib/${libsuffixDist}) +ELSE (WIN32) + FIND_LIBRARY(MYSQL_LIB NAMES mysqlclient_r mariadbclient + PATHS + /usr/lib/mysql + /usr/local/lib/mysql + /usr/local/mysql/lib + /usr/local/mysql/lib/mysql + /opt/local/mysql5/lib + /opt/local/lib/mysql5/mysql + /opt/mysql/mysql/lib/mysql + /opt/mysql/lib/mysql) +ENDIF (WIN32) + +IF(MYSQL_LIB) + GET_FILENAME_COMPONENT(MYSQL_LIB_DIR ${MYSQL_LIB} PATH) +ENDIF(MYSQL_LIB) + +set(MYSQL_VERSION_STRING "") + +EXEC_PROGRAM (grep ARGS "MARIADB_BASE_VERSION ${MYSQL_INCLUDE_DIR}/*.h|awk '{print $3}'" OUTPUT_VARIABLE MYSQL_VERSION_STRING) + +IF (MYSQL_INCLUDE_DIR AND MYSQL_LIB_DIR) + SET(MYSQL_FOUND TRUE) + + FIND_LIBRARY(MYSQL_ZLIB zlib PATHS ${MYSQL_LIB_DIR}) + FIND_LIBRARY(MYSQL_TAOCRYPT taocrypt PATHS ${MYSQL_LIB_DIR}) + IF (MYSQL_LIB) + SET(MYSQL_CLIENT_LIBS ${MYSQL_LIB}) + ELSE() + SET(MYSQL_CLIENT_LIBS mysqlclient_r) + ENDIF() + IF (MYSQL_ZLIB) + SET(MYSQL_CLIENT_LIBS ${MYSQL_CLIENT_LIBS} zlib) + ENDIF (MYSQL_ZLIB) + IF (MYSQL_TAOCRYPT) + SET(MYSQL_CLIENT_LIBS ${MYSQL_CLIENT_LIBS} taocrypt) + ENDIF (MYSQL_TAOCRYPT) + # Added needed mysqlclient dependencies on Windows + IF (WIN32) + SET(MYSQL_CLIENT_LIBS ${MYSQL_CLIENT_LIBS} ws2_32) + ENDIF (WIN32) + + MESSAGE(STATUS "MySQL Include dir: ${MYSQL_INCLUDE_DIR} library dir: ${MYSQL_LIB_DIR}") + MESSAGE(STATUS "MySQL client libraries: ${MYSQL_CLIENT_LIBS}") +ELSEIF (MySQL_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Cannot find MySQL. Include dir: ${MYSQL_INCLUDE_DIR} library dir: ${MYSQL_LIB_DIR}") +ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIB_DIR) diff --git a/cmake_modules/FindSQLite3.cmake b/cmake_modules/FindSQLite3.cmake new file mode 100644 index 0000000..9c99ae5 --- /dev/null +++ b/cmake_modules/FindSQLite3.cmake @@ -0,0 +1,37 @@ +# Copyright (C) 2007-2009 LuaDist. +# Created by Peter Kapec +# Redistribution and use of this file is allowed according to the terms of the MIT license. +# For details see the COPYRIGHT file distributed with LuaDist. +# Note: +# Searching headers and libraries is very simple and is NOT as powerful as scripts +# distributed with CMake, because LuaDist defines directories to search for. +# Everyone is encouraged to contact the author with improvements. Maybe this file +# becomes part of CMake distribution sometimes. + +# - Find sqlite3 +# Find the native SQLITE3 headers and libraries. +# +# SQLITE3_INCLUDE_DIRS - where to find sqlite3.h, etc. +# SQLITE3_LIBRARIES - List of libraries when using sqlite. +# SQLITE3_FOUND - True if sqlite found. + +# Look for the header file. +FIND_PATH(SQLITE3_INCLUDE_DIR NAMES sqlite3.h) + +# Look for the library. +FIND_LIBRARY(SQLITE3_LIBRARY NAMES sqlite3) + +# Handle the QUIETLY and REQUIRED arguments and set SQLITE3_FOUND to TRUE if all listed variables are TRUE. +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SQLITE3 DEFAULT_MSG SQLITE3_LIBRARY SQLITE3_INCLUDE_DIR) + +# Copy the results to the output variables. +IF(SQLITE3_FOUND) + SET(SQLITE3_LIBRARIES ${SQLITE3_LIBRARY}) + SET(SQLITE3_INCLUDE_DIRS ${SQLITE3_INCLUDE_DIR}) +ELSE(SQLITE3_FOUND) + SET(SQLITE3_LIBRARIES) + SET(SQLITE3_INCLUDE_DIRS) +ENDIF(SQLITE3_FOUND) + +MARK_AS_ADVANCED(SQLITE3_INCLUDE_DIRS SQLITE3_LIBRARIES) diff --git a/cmake_modules/FindUUID.cmake b/cmake_modules/FindUUID.cmake new file mode 100644 index 0000000..f41d2ed --- /dev/null +++ b/cmake_modules/FindUUID.cmake @@ -0,0 +1,119 @@ +# - Try to find UUID +# Once done this will define +# +# UUID_FOUND - system has UUID +# UUID_INCLUDE_DIRS - the UUID include directory +# UUID_LIBRARIES - Link these to use UUID +# UUID_DEFINITIONS - Compiler switches required for using UUID +# +# Copyright (c) 2006 Andreas Schneider +# +# Redistribution and use is allowed according to the terms of the New +# BSD license. +# For details see the accompanying COPYING-CMAKE-SCRIPTS file. +# + + +if (UUID_LIBRARIES AND UUID_INCLUDE_DIRS) + # in cache already + set(UUID_FOUND TRUE) +else (UUID_LIBRARIES AND UUID_INCLUDE_DIRS) + find_path(UUID_INCLUDE_DIR + NAMES + uuid.h + PATH_SUFFIXES + uuid + HINTS + ${UUID_DIR}/include + $ENV{UUID_DIR}/include + $ENV{UUID_DIR} + ${DELTA3D_EXT_DIR}/inc + $ENV{DELTA_ROOT}/ext/inc + $ENV{DELTA_ROOT} + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local/include + /usr/include + /usr/include/gdal + /sw/include # Fink + /opt/local/include # DarwinPorts + /opt/csw/include # Blastwave + /opt/include + [HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session\ Manager\\Environment;OSG_ROOT]/include + /usr/freeware/include + ) + + find_library(UUID_LIBRARY + NAMES + uuid ossp-uuid + HINTS + ${UUID_DIR}/lib + $ENV{UUID_DIR}/lib + $ENV{UUID_DIR} + ${DELTA3D_EXT_DIR}/lib + $ENV{DELTA_ROOT}/ext/lib + $ENV{DELTA_ROOT} + $ENV{OSG_ROOT}/lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local/lib + /usr/lib + /sw/lib + /opt/local/lib + /opt/csw/lib + /opt/lib + /usr/freeware/lib64 + ) + + find_library(UUID_LIBRARY_DEBUG + NAMES + uuidd + HINTS + ${UUID_DIR}/lib + $ENV{UUID_DIR}/lib + $ENV{UUID_DIR} + ${DELTA3D_EXT_DIR}/lib + $ENV{DELTA_ROOT}/ext/lib + $ENV{DELTA_ROOT} + $ENV{OSG_ROOT}/lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local/lib + /usr/lib + /sw/lib + /opt/local/lib + /opt/csw/lib + /opt/lib + /usr/freeware/lib64 + ) + + if (NOT UUID_LIBRARY AND BSD) + set(UUID_LIBRARY "") + endif(NOT UUID_LIBRARY AND BSD) + + set(UUID_INCLUDE_DIRS ${UUID_INCLUDE_DIR}) + set(UUID_LIBRARIES ${UUID_LIBRARY}) + + if (UUID_INCLUDE_DIRS) + if (BSD OR UUID_LIBRARIES) + set(UUID_FOUND TRUE) + endif (BSD OR UUID_LIBRARIES) + endif (UUID_INCLUDE_DIRS) + + if (UUID_FOUND) + if (NOT UUID_FIND_QUIETLY) + message(STATUS "Found UUID: ${UUID_LIBRARIES}") + endif (NOT UUID_FIND_QUIETLY) + else (UUID_FOUND) + if (UUID_FIND_REQUIRED) + message(FATAL_ERROR "Could not find UUID") + endif (UUID_FIND_REQUIRED) + endif (UUID_FOUND) + + # show the UUID_INCLUDE_DIRS and UUID_LIBRARIES variables only in the advanced view + mark_as_advanced(UUID_INCLUDE_DIRS UUID_LIBRARIES) + +endif (UUID_LIBRARIES AND UUID_INCLUDE_DIRS) diff --git a/config.json b/config.json new file mode 100644 index 0000000..4371a26 --- /dev/null +++ b/config.json @@ -0,0 +1,63 @@ +{ + "listeners": [ + { + "address": "0.0.0.0", + "port": 5000, + "https": false + } + ], + "app": { + "threads_num": 1, + "enable_session": false, + "session_timeout": 0, + "document_root": "./static/", + "home_page": "index.html", + "upload_path": "uploads", + "file_types": [ + "gif", + "png", + "jpg", + "js", + "css", + "html", + "ico", + "swf", + "xap", + "apk", + "cur", + "xml" + ], + "max_connections": 100000, + "max_connections_per_ip": 0, + "load_dynamic_views": false, + "dynamic_views_path": [ + "./views" + ], + "log": { + "logfile_base_name": "", + "log_size_limit": 100000000, + "log_level": "DEBUG" + }, + "run_as_daemon": false, + "relaunch_on_error": false, + "use_sendfile": true, + "use_gzip": true, + "static_files_cache_time": 5, + "idle_connection_timeout": 60, + "server_header_field": "", + "keepalive_requests": 0, + "pipelining_requests": 0, + "gzip_static": true, + "client_max_body_size": "1M", + "client_max_memory_body_size": "64K", + "client_max_websocket_message_size": "128K" + }, + "plugins": [{ + "dependencies": [], + "config": { + "heartbeat_interval": 2 + } + + }], + "custom_config": {} +} diff --git a/config.template.json b/config.template.json new file mode 100644 index 0000000..ffaf441 --- /dev/null +++ b/config.template.json @@ -0,0 +1,185 @@ +/* This is a JSON format configuration file + */ +{ + /* + //ssl:The global ssl files setting + "ssl": { + "cert": "../../trantor/trantor/tests/server.pem", + "key": "../../trantor/trantor/tests/server.pem" + }, + "listeners": [ + { + //address: Ip address,0.0.0.0 by default + "address": "0.0.0.0", + //port: Port number + "port": 80, + //https: If true, use https for security,false by default + "https": false + }, + { + "address": "0.0.0.0", + "port": 443, + "https": true, + //cert,key: Cert file path and key file path, empty by default, + //if empty, use the global setting + "cert": "", + "key": "" + } + ], + "db_clients": [ + { + //name: Name of the client,'default' by default + //"name":"", + //rdbms: Server type, postgresql,mysql or sqlite3, "postgresql" by default + "rdbms": "postgresql", + //filename: Sqlite3 db file name + //"filename":"", + //host: Server address,localhost by default + "host": "127.0.0.1", + //port: Server port, 5432 by default + "port": 5432, + //dbname: Database name + "dbname": "test", + //user: 'postgres' by default + "user": "", + //passwd: '' by default + "passwd": "", + //is_fast: false by default, if it is true, the client is faster but user can't call + //any synchronous interface of it. + "is_fast": false, + //connection_number: 1 by default, valid only if is_fast is false. + "connection_number": 1 + } + ],*/ + "app": { + //threads_num: The number of IO threads, 1 by default, if the value is set to 0, the number of threads + //is the number of CPU cores + "threads_num": 1, + //enable_session: False by default + "enable_session": false, + "session_timeout": 0, + //document_root: Root path of HTTP document, defaut path is ./ + "document_root": "./", + //home_page: Set the HTML file of the home page, the default value is "index.html" + //If there isn't any handler registered to the path "/", the home page file in the "document_root" is send to clients as a response + //to the request for "/". + "home_page": "index.html", + //upload_path: The path to save the uploaded file. "uploads" by default. + //If the path isn't prefixed with /, ./ or ../, + //it is relative path of document_root path + "upload_path": "uploads", + /* file_types: + * HTTP download file types,The file types supported by drogon + * by default are "html", "js", "css", "xml", "xsl", "txt", "svg", + * "ttf", "otf", "woff2", "woff" , "eot", "png", "jpg", "jpeg", + * "gif", "bmp", "ico", "icns", etc. */ + "file_types": [ + "gif", + "png", + "jpg", + "js", + "css", + "html", + "ico", + "swf", + "xap", + "apk", + "cur", + "xml" + ], + //max_connections: maximum connections number,100000 by default + "max_connections": 100000, + //max_connections_per_ip: maximum connections number per clinet,0 by default which means no limit + "max_connections_per_ip": 0, + //Load_dynamic_views: False by default, when set to true, drogon + //compiles and loads dynamically "CSP View Files" in directories defined + //by "dynamic_views_path" + "load_dynamic_views": false, + //dynamic_views_path: If the path isn't prefixed with /, ./ or ../, + //it is relative path of document_root path + "dynamic_views_path": [ + "./views" + ], + //log: Set log output, drogon output logs to stdout by default + "log": { + //log_path: Log file path,empty by default,in which case,logs are output to the stdout + //"log_path": "./", + //logfile_base_name: Log file base name,empty by default which means drogon names logfile as + //drogon.log ... + "logfile_base_name": "", + //log_size_limit: 100000000 bytes by default, + //When the log file size reaches "log_size_limit", the log file is switched. + "log_size_limit": 100000000, + //log_level: "DEBUG" by default,options:"TRACE","DEBUG","INFO","WARN" + //The TRACE level is only valid when built in DEBUG mode. + "log_level": "DEBUG" + }, + //run_as_daemon: False by default + "run_as_daemon": false, + //relaunch_on_error: False by default, if true, the program will be restart by the parent after exiting; + "relaunch_on_error": false, + //use_sendfile: True by default, if ture, the program + //uses sendfile() system-call to send static files to clients; + "use_sendfile": true, + //use_gzip: True by default, use gzip to compress the response body's content; + "use_gzip": true, + //static_files_cache_time: 5 (seconds) by default, the time in which the static file response is cached, + //0 means cache forever, the negative value means no cache + "static_files_cache_time": 5, + //simple_controllers_map: Used to configure mapping from path to simple controller + "simple_controllers_map": [{ + "path": "/path/name", + "controller": "controllerClassName", + "http_methods": [ + "get", + "post" + ], + "filters": [ + "FilterClassName" + ] + }], + //idle_connection_timeout: Defaults to 60 seconds, the lifetime + //of the connection without read or write + "idle_connection_timeout": 60, + //server_header_field: Set the 'server' header field in each response sent by drogon, + //empty string by default with which the 'server' header field is set to "Server: drogon/version string\r\n" + "server_header_field": "", + //keepalive_requests: Set the maximum number of requests that can be served through one keep-alive connection. + //After the maximum number of requests are made, the connection is closed. + //The default value of 0 means no limit. + "keepalive_requests": 0, + //pipelining_requests: Set the maximum number of unhandled requests that can be cached in pipelining buffer. + //After the maximum number of requests are made, the connection is closed. + //The default value of 0 means no limit. + "pipelining_requests": 0, + //gzip_static: If it is set to true, when the client requests a static file, drogon first finds the compressed + //file with the extension ".gz" in the same path and send the compressed file to the client. + //The default value of gzip_static is true. + "gzip_static": true, + //client_max_body_size: Set the maximum body size of HTTP requests received by drogon. The default value is "1M". + //One can set it to "1024", "1k", "10M", "1G", etc. Setting it to "" means no limit. + "client_max_body_size": "1M", + //max_memory_body_size: Set the maximum body size in memory of HTTP requests received by drogon. The default value is "64K" bytes. + //If the body size of a HTTP request exceeds this limit, the body is stored to a temporary file for processing. + //Setting it to "" means no limit. + "client_max_memory_body_size": "64K", + //client_max_websocket_message_size: Set the maximum size of messages sent by WebSocket client. The default value is "128K". + //One can set it to "1024", "1k", "10M", "1G", etc. Setting it to "" means no limit. + "client_max_websocket_message_size": "128K" + }, + //plugins: Define all plugins running in the application + "plugins": [{ + //name: The class name of the plugin + //"name": "TestPlugin", + //dependencies: Plugins that the plugin depends on. It can be commented out + "dependencies": [], + //config: The configuration of the plugin. This json object is the parameter to initialize the plugin. + //It can be commented out + "config": { + "heartbeat_interval": 2 + } + + }], + //custom_config: custom configuration for users. This object can be get by the app().getCustomConfig() method. + "custom_config": {} +} diff --git a/controllers/api_v1_Devices.cc b/controllers/api_v1_Devices.cc new file mode 100644 index 0000000..114494b --- /dev/null +++ b/controllers/api_v1_Devices.cc @@ -0,0 +1,43 @@ +#include "api_v1_Devices.h" +using namespace api::v1; +//add definition of your processing function here + +void Devices::get_all(const HttpRequestPtr &req, std::function &&callback) +{ + + std::cout << "Get All\n"; + + auto resp=HttpResponse::newHttpResponse(); + callback(resp); +} + +void Devices::get_one(const HttpRequestPtr &req, std::function &&callback, + std::string device_id) +{ + std::cout << "Get One: " << device_id << "\n"; + + auto resp=HttpResponse::newHttpResponse(); + callback(resp); +} + +void Devices::get_relays_all(const HttpRequestPtr &req, std::function &&callback, + std::string device_id) +{ + std::cout << "Get Relays All: " << device_id << "\n"; + + auto resp=HttpResponse::newHttpResponse(); + callback(resp); +} + +void Devices::get_relays_one(const HttpRequestPtr &req, std::function &&callback, + std::string device_id, std::string relay_id) +{ + std::cout << "Get Relays One: " << device_id << "; " << relay_id << "\n"; + + Json::Value ret; + ret["result"] = "ok"; + ret["device_id"] = device_id; + ret["relay_id"] = relay_id; + auto resp = HttpResponse::newHttpJsonResponse(ret); + callback(resp); +} diff --git a/controllers/api_v1_Devices.h b/controllers/api_v1_Devices.h new file mode 100644 index 0000000..1c247b9 --- /dev/null +++ b/controllers/api_v1_Devices.h @@ -0,0 +1,24 @@ +#pragma once +#include +using namespace drogon; +namespace api +{ + namespace v1 + { + class Devices:public drogon::HttpController + { + public: + METHOD_LIST_BEGIN + METHOD_ADD(Devices::get_all,"/",Get); + METHOD_ADD(Devices::get_one,"/{1}",Get); + METHOD_ADD(Devices::get_relays_all,"/{1}/relays",Get); + METHOD_ADD(Devices::get_relays_one,"/{1}/relays/{2}",Get); + METHOD_LIST_END + + void get_all(const HttpRequestPtr& req,std::function &&callback); + void get_one(const HttpRequestPtr& req,std::function &&callback,std::string device_id); + void get_relays_all(const HttpRequestPtr& req,std::function &&callback,std::string device_id); + void get_relays_one(const HttpRequestPtr& req,std::function &&callback,std::string device_id,std::string relay_id); + }; + } +} diff --git a/globals.cc b/globals.cc new file mode 100644 index 0000000..439442e --- /dev/null +++ b/globals.cc @@ -0,0 +1,11 @@ +// +// Created by tobias on 11/07/19. +// + +#include +#include "globals.h" + +namespace globals +{ + sqlite3 *db; +} diff --git a/globals.h b/globals.h new file mode 100644 index 0000000..4c4069d --- /dev/null +++ b/globals.h @@ -0,0 +1,13 @@ +// +// Created by tobias on 11/07/19. +// + +#ifndef EMGAUWA_CORE_GLOBALS_H +#define EMGAUWA_CORE_GLOBALS_H + +namespace globals +{ + extern sqlite3 *db; +} + +#endif //EMGAUWA_CORE_GLOBALS_H diff --git a/main.cc b/main.cc new file mode 100644 index 0000000..1e5f766 --- /dev/null +++ b/main.cc @@ -0,0 +1,36 @@ +#include +#include + +#include + +#include "globals.h" + +int main() { + + int rc; + + /* Open database */ + rc = sqlite3_open("test.db", &globals::db); + + if( rc ) { + fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(globals::db)); + return 1; + } else { + fprintf(stderr, "Opened database successfully\n"); + } + + device_dbo test; + strcpy(test.id, "meine-tolle_id-123"); + strcpy(test.name, "test_device latest name"); + strcpy(test.ip, "192.168.1.68"); + test.active = true; + + test.save(); + + + //Load config file + drogon::app().loadConfigFile("../config.json"); + //Run HTTP framework,the method will block in the internal event loop + drogon::app().run(); + return 0; +} diff --git a/models/device_dbo.cc b/models/device_dbo.cc new file mode 100644 index 0000000..b809af7 --- /dev/null +++ b/models/device_dbo.cc @@ -0,0 +1,32 @@ +// +// Created by tobias on 08/07/19. +// + +#include +#include "device_dbo.h" +#include "globals.h" + +bool device_dbo::save() +{ + int rc; + sqlite3_stmt *stmt; + + //sqlite3_prepare_v2(db, "INSERT INTO devices(id, name, ip, active) values (?1, ?2, ?3, ?4);", -1, &stmt, nullptr); + sqlite3_prepare_v2(globals::db, "UPDATE devices set name = ?2, ip = ?3, active = ?4 WHERE id = ?1;", -1, &stmt, nullptr); + + sqlite3_bind_text(stmt, 1, this->id, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 2, this->name, -1, SQLITE_STATIC); + sqlite3_bind_text(stmt, 3, this->ip, -1, SQLITE_STATIC); + sqlite3_bind_int(stmt, 4, this->active); + //sqlite3_bind_int(stmt, 2, 21); + + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + printf("ERROR inserting data: %s\n", sqlite3_errmsg(globals::db)); + return false; + } + + sqlite3_finalize(stmt); + + return true; +} diff --git a/models/device_dbo.h b/models/device_dbo.h new file mode 100644 index 0000000..8bda26c --- /dev/null +++ b/models/device_dbo.h @@ -0,0 +1,21 @@ +#ifndef EMGAUWA_CORE_DEVICE_DBO_H +#define EMGAUWA_CORE_DEVICE_DBO_H + +#include +#include + +class device_dbo +{ +public: + char id[23]; + char name[128]; + char ip[17]; + bool active; + int port; + int relay_count; + + bool save(); +}; + + +#endif //EMGAUWA_CORE_DEVICE_DBO_H diff --git a/models/model.template.json b/models/model.template.json new file mode 100644 index 0000000..4a9c8ce --- /dev/null +++ b/models/model.template.json @@ -0,0 +1,15 @@ +{ + //rdbms:server type, postgresql,mysql or sqlite3 + "rdbms":"postgresql", + //filename:sqlite3 db file name + //"filename":"", + //host:server address,localhost by default; + "host":"127.0.0.1", + //port:server port, 5432 by default; + "port":5432, + //dbname:Database name; + "dbname":"", + "user":"", + "passwd":"", + "tables":[] +} diff --git a/models/schedule_dbo.cc b/models/schedule_dbo.cc new file mode 100644 index 0000000..6ea3772 --- /dev/null +++ b/models/schedule_dbo.cc @@ -0,0 +1,5 @@ +// +// Created by tobias on 09/07/19. +// + +#include "schedule_dbo.h" diff --git a/models/schedule_dbo.h b/models/schedule_dbo.h new file mode 100644 index 0000000..1c8e054 --- /dev/null +++ b/models/schedule_dbo.h @@ -0,0 +1,15 @@ +// +// Created by tobias on 09/07/19. +// + +#ifndef EMGAUWA_CORE_SCHEDULE_DBO_H +#define EMGAUWA_CORE_SCHEDULE_DBO_H + + +class schedule_dbo +{ + +}; + + +#endif //EMGAUWA_CORE_SCHEDULE_DBO_H