From 311c257fc5109b8179ef18ba5ee0af8992a6ef7e Mon Sep 17 00:00:00 2001 From: Relintai Date: Sat, 30 Oct 2021 18:14:31 +0200 Subject: [PATCH] Initial commit. --- .clang-format | 128 +++++++++++ .gitignore | 31 +++ HEADS | 1 + LICENSE | 19 ++ Readme.md | 82 +++++++ SConstruct | 505 +++++++++++++++++++++++++++++++++++++++++++ build.config.example | 44 ++++ build.sh | 1 + main.cpp | 99 +++++++++ migrate.sh | 1 + run.sh | 1 + 11 files changed, 912 insertions(+) create mode 100644 .clang-format create mode 100644 .gitignore create mode 100644 HEADS create mode 100644 LICENSE create mode 100644 Readme.md create mode 100644 SConstruct create mode 100644 build.config.example create mode 100755 build.sh create mode 100644 main.cpp create mode 100755 migrate.sh create mode 100755 run.sh diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..cb67d39 --- /dev/null +++ b/.clang-format @@ -0,0 +1,128 @@ +# Commented out parameters are those with the same value as base LLVM style +# We can uncomment them if we want to change their value, or enforce the +# chosen value in case the base style changes (last sync: Clang 6.0.1). +--- +### General config, applies to all languages ### +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +# AlignConsecutiveAssignments: false +# AlignConsecutiveDeclarations: false +# AlignEscapedNewlines: Right +# AlignOperands: true +AlignTrailingComments: false +AllowAllParametersOfDeclarationOnNextLine: false +# AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: true +# AllowShortLoopsOnASingleLine: false +# AlwaysBreakAfterDefinitionReturnType: None +# AlwaysBreakAfterReturnType: None +# AlwaysBreakBeforeMultilineStrings: false +# AlwaysBreakTemplateDeclarations: false +# BinPackArguments: true +# BinPackParameters: true +# BraceWrapping: +# AfterClass: false +# AfterControlStatement: false +# AfterEnum: false +# AfterFunction: false +# AfterNamespace: false +# AfterObjCDeclaration: false +# AfterStruct: false +# AfterUnion: false +# AfterExternBlock: false +# BeforeCatch: false +# BeforeElse: false +# IndentBraces: false +# SplitEmptyFunction: true +# SplitEmptyRecord: true +# SplitEmptyNamespace: true +# BreakBeforeBinaryOperators: None +# BreakBeforeBraces: Attach +# BreakBeforeInheritanceComma: false +BreakBeforeTernaryOperators: false +# BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: AfterColon +# BreakStringLiterals: true +ColumnLimit: 0 +# CommentPragmas: '^ IWYU pragma:' +# CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerIndentWidth: 8 +ContinuationIndentWidth: 8 +Cpp11BracedListStyle: false +# DerivePointerAlignment: false +# DisableFormat: false +# ExperimentalAutoDetectBinPacking: false +# FixNamespaceComments: true +# ForEachMacros: +# - foreach +# - Q_FOREACH +# - BOOST_FOREACH +# IncludeBlocks: Preserve +IncludeCategories: + - Regex: '".*"' + Priority: 1 + - Regex: '^<.*\.h>' + Priority: 2 + - Regex: '^<.*' + Priority: 3 +# IncludeIsMainRegex: '(Test)?$' +IndentCaseLabels: true +# IndentPPDirectives: None +IndentWidth: 4 +# IndentWrappedFunctionNames: false +# JavaScriptQuotes: Leave +# JavaScriptWrapImports: true +# KeepEmptyLinesAtTheStartOfBlocks: true +# MacroBlockBegin: '' +# MacroBlockEnd: '' +# MaxEmptyLinesToKeep: 1 +# NamespaceIndentation: None +# PenaltyBreakAssignment: 2 +# PenaltyBreakBeforeFirstCallParameter: 19 +# PenaltyBreakComment: 300 +# PenaltyBreakFirstLessLess: 120 +# PenaltyBreakString: 1000 +# PenaltyExcessCharacter: 1000000 +# PenaltyReturnTypeOnItsOwnLine: 60 +# PointerAlignment: Right +# RawStringFormats: +# - Delimiter: pb +# Language: TextProto +# BasedOnStyle: google +# ReflowComments: true +# SortIncludes: true +# SortUsingDeclarations: true +# SpaceAfterCStyleCast: false +# SpaceAfterTemplateKeyword: true +# SpaceBeforeAssignmentOperators: true +# SpaceBeforeParens: ControlStatements +# SpaceInEmptyParentheses: false +# SpacesBeforeTrailingComments: 1 +# SpacesInAngles: false +# SpacesInContainerLiterals: true +# SpacesInCStyleCastParentheses: false +# SpacesInParentheses: false +# SpacesInSquareBrackets: false +TabWidth: 4 +UseTab: Always +--- +### C++ specific config ### +Language: Cpp +Standard: Cpp03 +--- +### ObjC specific config ### +Language: ObjC +Standard: Cpp03 +ObjCBlockIndentWidth: 4 +# ObjCSpaceAfterProperty: false +# ObjCSpaceBeforeProtocolList: true +--- +### Java specific config ### +Language: Java +# BreakAfterJavaFieldAnnotations: false +JavaImportGroups: ['org.godotengine', 'android', 'androidx', 'com.android', 'com.google', 'java', 'javax'] +... diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..689234b --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +engine +modules/* +logs/* + +*.d +*.o +*.meta +game/.import/** +game/.prop_tool_temp/** +.sconsign.dblite +.DS_Store + +export/** +release/** + +.vs/* +.kdev4/* +.vscode/* + +TestRWTextures + +_build/* +_binaries/* +game/android/build/* + +*.blend1 +.dir-locals.el + +build.config + +database.sqlite diff --git a/HEADS b/HEADS new file mode 100644 index 0000000..9288942 --- /dev/null +++ b/HEADS @@ -0,0 +1 @@ +{"engine": {"master": "a47cb57da73a27369df2575a432adbeb6f2dd790"}} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..748251f --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2021 Péter Magyar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..d970985 --- /dev/null +++ b/Readme.md @@ -0,0 +1,82 @@ +# CrystalCMS + +An old CMS of mine that was originally written for/in laravel now ported to (rcpp_framework)[https://github.com/Relintai/rcpp_framework]. + +This is highly experimental stuff. It probably shouldn't be used by anyone who's sane. + +## Compilation + +Will only work on linux! Works on the rasberry pi. + +### Dependencies + +Arch/Manjaro: + +``` +pacman -S --needed scons pkgconf gcc yasm +``` + +Debian/Raspian: + +``` +sudo apt-get install build-essential scons pkg-config libudev-dev yasm +``` + +Optionally if you install MariaDB/MySQL and/or PostgreSQL the compile system should pick it up. Make sure to get a version +whoch contains the development headers (A bunch of .h files). + +### Initial setup + +clone this repo, then call `scons`, it will clone rcpp cms into a new engine directory. Run this every time you update the project. +You don't have to run it before / between builds. + +``` +# git clone https://github.com/Relintai/crystal_cms.git crystal_cms +# cd crystal_cms +# scons +``` + +Now you can build the project like: `scons bl`. ([b]uild [l]inux) + +Adding -jX to the build command will run the build on that many threads. Like: `scons bl -j4`. + +``` +# scons bl -j4 +- or - +# ./build.sh +``` +Now you can run it. + +First run migrations, this will create the necessary database tables: + +``` +# ./engine/bin/server m +- or - +# ./migrate.sh +``` + +Now you can start the server: + +``` +# ./engine/bin/server +- or - +# ./run.sh +``` + +Make sure to run it from the project's directory, as it needs data files. + +Now just open http://127.0.0.1:8080 + +You can push floats to the "a/b" MQTT topics, and the new values will be save in the `database.sqlite` file, and will appear +in your browser. + +If you have mosqitto installed you can use the `publish_random_data.py` or `publish_data.sh` scripts to automatically +push things into the proper MQTT topic. + +## Structure + +The main Application implementation is `app/ic_application.h`. + +The `main.cpp` contains the initialization code for the framework. + +The `content/www` folder is the wwwroot. diff --git a/SConstruct b/SConstruct new file mode 100644 index 0000000..b48f3f5 --- /dev/null +++ b/SConstruct @@ -0,0 +1,505 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (c) 2019-2021 Péter Magyar +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +EnsureSConsVersion(0, 98, 1) + +import sys +import os +import subprocess +import json +import shutil +import traceback + + +folders = [ + 'app', +] + +module_folders = [ + '../modules', + '../custom_modules', +] + +main_file = 'main.cpp' + +repository_index = 0 +module_clone_path = '/modules/' +clone_command = 'git clone {0} {1}' + +visual_studio_call_vcvarsall = False +visual_studio_vcvarsall_path = 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat' +visual_studio_arch = 'amd64' + +exports = { + 'global': [], + 'linux': [], + 'windows': [], + 'android': [], + 'javascript': [], +} + +engine_repository = [ ['https://github.com/Relintai/rcpp_framework.git', 'git@github.com:Relintai/rcpp_framework.git'], 'engine', '' ] + +module_repositories = [ +] + +addon_repositories = [ +] + +third_party_addon_repositories = [ +] + +target_commits = {} + +engine_branch = 'master' + +def onerror(func, path, exc_info): + """ + https://stackoverflow.com/questions/2656322/shutil-rmtree-fails-on-windows-with-access-is-denied + + Because Windows. + + Error handler for ``shutil.rmtree``. + + If the error is due to an access error (read only file) + it attempts to add write permission and then retries. + + If the error is for another reason it re-raises the error. + + Usage : ``shutil.rmtree(path, onerror=onerror)`` + """ + import stat + if not os.access(path, os.W_OK): + # Is the error an access error ? + os.chmod(path, stat.S_IWUSR) + func(path) + else: + raise + +def load_target_commits_array(): + global target_commits + + if os.path.isfile('./HEADS'): + with open('./HEADS', 'r') as infile: + target_commits = json.load(infile) + else: + target_commits = {} + +def save_target_commits_array(): + with open('./HEADS', 'w') as outfile: + json.dump(target_commits, outfile) + +def update_repository(data, clone_path, branch = 'master'): + cwd = os.getcwd() + + full_path = cwd + clone_path + data[1] + '/' + + if not os.path.isdir(full_path): + os.chdir(cwd + clone_path) + + subprocess.call(clone_command.format(data[0][repository_index], data[1]), shell=True) + + os.chdir(full_path) + + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git checkout -B ' + branch + ' origin/' + branch, shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git pull origin ' + branch, shell=True) + + process = subprocess.Popen('git rev-parse HEAD', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + output = process.communicate()[0].decode().strip() + + if data[1] not in target_commits: + target_commits[data[1]] = {} + + target_commits[data[1]][branch] = output + + os.chdir(cwd) + +def setup_repository(data, clone_path, branch = 'master'): + cwd = os.getcwd() + + full_path = cwd + clone_path + data[1] + '/' + + if not os.path.isdir(full_path): + os.chdir(cwd + clone_path) + + subprocess.call(clone_command.format(data[0][repository_index], data[1]), shell=True) + + os.chdir(full_path) + + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git checkout -B ' + branch + ' origin/' + branch, shell=True) + subprocess.call('git pull origin ' + branch, shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + + if data[1] in target_commits: + target = target_commits[data[1]][branch] + + subprocess.call('git checkout -B ' + branch + ' ' + target, shell=True) + subprocess.call('git clean -f -d', shell=True) + subprocess.call('git reset', shell=True) + subprocess.call('git reset --hard', shell=True) + + os.chdir(cwd) + +def copy_repository(data, target_folder, clone_path): + copytree(os.path.abspath(clone_path + data[1] + '/' + data[2]), os.path.abspath(target_folder + data[1])) + +def copytree(src, dst): + for item in os.listdir(src): + sp = os.path.join(src, item) + dp = os.path.join(dst, item) + + if os.path.isdir(sp): + if os.path.isdir(dp): + shutil.rmtree(dp, onerror=onerror) + + shutil.copytree(sp, dp) + else: + if not os.path.isdir(dst): + os.makedirs(dst) + + shutil.copy2(sp, dp) + +def update_engine(): + update_repository(engine_repository, '/', engine_branch) + +def update_modules(): + for rep in module_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './engine/modules/', '.' + module_clone_path) + +def update_addons(): + for rep in addon_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def update_addons_third_party_addons(): + for rep in third_party_addon_repositories: + update_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def update_all(): + update_engine() + update_modules() + update_addons() + update_addons_third_party_addons() + + save_target_commits_array() + + +def setup_engine(): + setup_repository(engine_repository, '/', engine_branch) + +def setup_modules(): + for rep in module_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './engine/modules/', '.' + module_clone_path) + +def setup_addons(): + for rep in addon_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def setup_addons_third_party_addons(): + for rep in third_party_addon_repositories: + setup_repository(rep, module_clone_path) + copy_repository(rep, './game/addons/', '.' + module_clone_path) + +def setup_all(): + setup_engine() + setup_modules() + setup_addons() + setup_addons_third_party_addons() + +def format_path(path): + if 'win' in sys.platform: + path = path.replace('/', '\\') + path = path.replace('~', '%userprofile%') + + return path + +def get_exports_for(platform): + export_command = 'export ' + command_separator = ';' + + if 'win' in sys.platform: + command_separator = '&' + export_command = 'set ' + + command = '' + + for p in exports[platform]: + command += export_command + p + command_separator + + return command + + +def parse_config(): + global visual_studio_vcvarsall_path + global visual_studio_arch + global visual_studio_call_vcvarsall + global exports + + if not os.path.isfile('build.config'): + return + + with open('build.config', 'r') as f: + + for line in f: + ls = line.strip() + if ls == '' or ls.startswith('#'): + continue + + words = line.split() + + if (len(words) < 2): + print('This build.config line is malformed, and got ignored: ' + ls) + continue + + if words[0] == 'visual_studio_vcvarsall_path': + visual_studio_vcvarsall_path = format_path(ls[29:]) + elif words[0] == 'visual_studio_arch': + visual_studio_arch = format_path(ls[19:]) + elif words[0] == 'visual_studio_call_vcvarsall': + visual_studio_call_vcvarsall = words[1].lower() in [ 'true', '1', 't', 'y', 'yes' ] + elif words[0] == 'export': + if (len(words) < 3) or not words[1] in exports: + print('This build.config line is malformed, and got ignored: ' + ls) + continue + + export_path = format_path(ls[8 + len(words[1]):]) + + exports[words[1]].append(export_path) + +parse_config() + +env = Environment() + +if len(sys.argv) > 1: + + arg = sys.argv[1] + + arg_split = arg.split('_') + arg = arg_split[0] + arg_split = arg_split[1:] + + if arg[0] == 'b': + build_string = get_exports_for('global') + 'scons ' + + build_string += 'target=' + if 'r' in arg: + build_string += 'release' + elif 'd' in arg: + build_string += 'debug' + else: + build_string += 'release_debug' + build_string += ' ' + + if 'm' in arg: + build_string += 'use_mingw=yes' + else: + if 'win' in sys.platform and visual_studio_call_vcvarsall: + build_string = 'call "{0}" {1}&'.format(visual_studio_vcvarsall_path, visual_studio_arch) + build_string + + if 'o' in arg: + build_string += 'use_llvm=yes' + + if 'v' in arg: + build_string += 'vsproj=yes' + + build_string += 'folders="' + + for f in folders: + build_string += '../' + f + build_string += ';' + + build_string += '" ' + + build_string += 'module_folders="' + + for f in module_folders: + build_string += f + build_string += ';' + + build_string += '" ' + + build_string += 'main_file="../' + main_file + '" ' + + for i in range(2, len(sys.argv)): + build_string += ' ' + sys.argv[i] + ' ' + + cwd = os.getcwd() + full_path = cwd + '/engine/' + + if not os.path.isdir(full_path): + print('engine directory doesnt exists.') + exit() + + os.chdir(full_path) + + if 'l' in arg: + build_string += 'platform=x11' + + build_string = get_exports_for('linux') + build_string + + print('Running command: ' + build_string) + + subprocess.call(build_string, shell=True) + elif 'w' in arg: + build_string += 'platform=windows' + + build_string = get_exports_for('windows') + build_string + + print('Running command: ' + build_string) + + subprocess.call(build_string, shell=True) + elif 'a' in arg: + build_string += 'platform=android' + + build_string = get_exports_for('android') + build_string + + print('Running command: ' + build_string + ' android_arch=armv7') + subprocess.call(build_string + ' android_arch=armv7', shell=True) + print('Running command: ' + build_string + ' android_arch=arm64v8') + subprocess.call(build_string + ' android_arch=arm64v8', shell=True) + print('Running command: ' + build_string + ' android_arch=x86') + subprocess.call(build_string + ' android_arch=x86', shell=True) + + os.chdir(full_path + 'platform/android/java/') + + print('Running command: ' + get_exports_for('global') + get_exports_for('android') + './gradlew generateGodotTemplates') + subprocess.call(get_exports_for('global') + get_exports_for('android') + './gradlew generateGodotTemplates', shell=True) + elif 'j' in arg: + build_string += 'platform=javascript' + + build_string = get_exports_for('javascript') + build_string + + print('Running command: ' + build_string) + subprocess.call(build_string, shell=True) + + else: + print('No platform specified') + exit() + + exit() + elif arg[0] == 'p': + if arg == 'p': + #print("Applies a patch. Append c for the compilation database patch. For example: pc") + print("Applies a patch. No Patches right now.") + exit() + + cwd = os.getcwd() + full_path = cwd + '/engine/' + + if not os.path.isdir(full_path): + print('engine directory doesnt exists.') + exit() + + os.chdir(full_path) + + #apply the patch to just the working directory, without creating a commit + + #if 'c' in arg: + # subprocess.call('git apply --index ../patches/compilation_db.patch', shell=True) + + #unstage all files + subprocess.call('git reset', shell=True) + + exit() + +opts = Variables(args=ARGUMENTS) + +opts.Add('a', 'What to do', '') +opts.Add(EnumVariable('action', 'What to do', 'setup', ('setup', 'update'))) +opts.Add('t', 'Action target', '') +opts.Add(EnumVariable('target', 'Action target', 'all', ('all', 'engine', 'modules', 'all_addons', 'addons', 'third_party_addons'))) +opts.Add(EnumVariable('repository_type', 'Type of repositories to clone from first', 'http', ('http', 'ssh'))) + +opts.Update(env) +Help(opts.GenerateHelpText(env)) + +load_target_commits_array() + +rt = env['repository_type'] + +if rt == 'ssh': + repository_index = 1 + +action = env['action'] +target = env['target'] + +if env['a']: + action = env['a'] + +if env['t']: + target = env['t'] + +if not os.path.isdir('./modules'): + os.mkdir('./modules') + +if 'm' in action: + godot_branch = 'master' + +if 'setup' in action or action[0] == 's': + if target == 'all': + setup_all() + elif target == 'engine': + setup_engine() + elif target == 'modules': + setup_modules() + elif target == 'all_addons': + setup_addons() + setup_addons_third_party_addons() + elif target == 'addons': + setup_addons() + elif target == 'third_party_addons': + setup_addons_third_party_addons() +elif 'update' in action or action[0] == 'u': + if target == 'all': + update_all() + elif target == 'engine': + update_engine() + save_target_commits_array() + elif target == 'modules': + update_modules() + save_target_commits_array() + elif target == 'all_addons': + update_addons() + update_addons_third_party_addons() + save_target_commits_array() + elif target == 'addons': + update_addons() + save_target_commits_array() + elif target == 'third_party_addons': + update_addons_third_party_addons() + save_target_commits_array() + diff --git a/build.config.example b/build.config.example new file mode 100644 index 0000000..317567f --- /dev/null +++ b/build.config.example @@ -0,0 +1,44 @@ +# Copyright (c) 2019-2020 Péter Magyar +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +# Rename this file to build.config to use it + +# Lines starting with # are comments. (Only works at the start of the line!) + +# Note: +# ~ will be converted to %userprofile% on windows +# / will be converted to \ on windows +# so you don't have to worry about it + +# Visual studio related setup: +visual_studio_call_vcvarsall True +visual_studio_vcvarsall_path C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Auxiliary/Build/vcvarsall.bat +visual_studio_arch amd64 + +# export related setup +# available export targets: global, linux, windows, android, javascript + +export global SCONS_CACHE=~/.scons_cache +export global SCONS_CACHE_LIMIT=5000 + +export android ANDROID_NDK_ROOT=~/SDKs/Android/NDK/android-ndk-r20b +export android ANDROID_NDK_HOME=~/SDKs/Android/NDK/android-ndk-r20b +export android ANDROID_HOME=~/SDKs/Android/SDK + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..8830c0c --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +scons bl -j4 \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..dcb2492 --- /dev/null +++ b/main.cpp @@ -0,0 +1,99 @@ +#include +#include +#include + +#include "core/http/web_application.h" +#include "core/file_cache.h" +#include "core/bry_http/http_server.h" + +#include "core/database/database_manager.h" + +#include "database/db_init.h" + +#include "core/settings.h" + +#define MAIN_CLASS ICApplication + +void create_databases() { + + //Settings *settings = Settings::get_singleton(); + + //if (!settings) { + // printf("create_databases: Settings singleton is null!"); + // return; + //} + + /* + rapidjson::Value dbs = settings->settings["databases"]; + + if (!dbs.IsArray()) { + printf("create_databases: dbs !dbs.IsArray()!"); + return; + } +*/ + + DatabaseManager *dbm = DatabaseManager::get_singleton(); + + //uint32_t index = dbm->create_database("mysql"); + //Database *db = dbm->databases[0]; + //db->connect(""); + + uint32_t index = dbm->create_database("sqlite"); + Database *db = dbm->databases[index]; + db->connect("database.sqlite"); +} + +int main(int argc, char **argv) { + bool migrate = false; + + for (int i = 1; i < argc; ++i) { + const char *a = argv[i]; + + if (a[0] == 'm') { + migrate = true; + } + } + + initialize_database_backends(); + + Settings *settings = new Settings(true); + + settings->parse_file("settings.json"); + + FileCache *file_cache = new FileCache(true); + file_cache->wwwroot = "./content/www"; + file_cache->wwwroot_refresh_cache(); + + DatabaseManager *dbm = new DatabaseManager(); + + create_databases(); + + WebApplication *app = new MAIN_CLASS(); + + app->load_settings(); + app->setup_routes(); + app->setup_middleware(); + + HTTPServer *server = new HTTPServer(); + server->application = app; + + server->port = 8080; + server->initialize(); + + if (!migrate) { + printf("Initialized!\n"); + + server->main_loop(); + } else { + printf("Running migrations.\n"); + app->migrate(); + } + + delete server; + delete app; + delete dbm; + delete file_cache; + delete settings; + + return 0; +} \ No newline at end of file diff --git a/migrate.sh b/migrate.sh new file mode 100755 index 0000000..5ae21d3 --- /dev/null +++ b/migrate.sh @@ -0,0 +1 @@ +./engine/bin/server m \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..633e0e5 --- /dev/null +++ b/run.sh @@ -0,0 +1 @@ +./engine/bin/server \ No newline at end of file