Compare commits

..

84 Commits

Author SHA1 Message Date
Kostas
ebe54d759e Fix websocket headers 2022-01-24 12:07:35 +02:00
Antonio Andelic
492a13d5e7 Bolt over websocket initial 2022-01-03 16:39:44 +01:00
Antonio Andelic
8716b8e992 Update to newest spdlog and fmt (#309) 2021-12-07 11:05:33 +01:00
Antonio Andelic
a277541354 Update debian base image (#311) 2021-12-07 10:10:04 +01:00
Antonio Andelic
b01564f179 Update license date for 2.1.1 (#312) 2021-12-06 12:35:30 +01:00
Antonio Andelic
d9bb4e2e46 Use default values instantly for batch size/interval (#306) 2021-11-30 16:29:51 +01:00
János Benjamin Antal
05d0aee494 Avoid crash in case of loading old stream (#302) 2021-11-30 15:27:11 +01:00
Antonio Andelic
aabec99a8e Procedure for stream configs (#301) 2021-11-29 08:56:10 +01:00
Antonio Andelic
d277dd49a3 Update stats with query modules (#304) 2021-11-26 15:31:25 +01:00
Antonio Andelic
18f9d19b18 Update pyyaml version (#305) 2021-11-25 10:12:33 +01:00
Antonio Andelic
530eed5c6d Update change date (#303) 2021-11-24 16:26:35 +01:00
Antonio Andelic
12f4e0068a Small polishing and fixes 2021-11-16 17:23:20 +01:00
Antonio Andelic
e8976e0f1c Update mgp API for Pulsar (#298) 2021-11-16 16:00:25 +01:00
Kostas Kyrimis
6eb52581eb Retry transaction on consumer (#294) 2021-11-16 15:58:36 +01:00
Antonio Andelic
8606e69fd6 Add support for type in show streams (#300) 2021-11-16 15:58:36 +01:00
Antonio Andelic
c7b045bffc Pulsar e2e tests (#296) 2021-11-16 15:58:35 +01:00
Antonio Andelic
b66cc66503 Add support for Pulsar queries (#292) 2021-11-16 15:52:58 +01:00
Antonio Andelic
0e4719018a Introduce pulsar dependency (#286) 2021-11-16 15:47:40 +01:00
Antonio Andelic
0ebd52aac3 Support for different consumers (#280) 2021-11-16 15:40:27 +01:00
Antonio Andelic
6c971b856e Fix ORDER BY and temporal types (#299) 2021-11-16 10:59:25 +01:00
Kostas Kyrimis
6cb293688d Fix check stream not reseting back to the correct offset (#295) 2021-11-15 14:44:30 +01:00
Jure Bajic
16709dff6c Add stats and notifications in results metadata (#285) 2021-11-15 13:51:13 +01:00
Kostas Kyrimis
95dd3481c0 Add more information to the MG_ASSERT in release mode (#291) 2021-11-12 09:09:15 +01:00
Kostas Kyrimis
47c0c629c7 Add procedure for setting a kafka stream offset (#282) 2021-11-11 12:07:58 +01:00
Kostas Kyrimis
636c551047 Remove linter concurrency-mt (#287) 2021-11-02 09:19:41 +01:00
Marko Budiselić
72384b2b71 Add internals pages link (#288) 2021-11-01 09:49:22 +01:00
Jure Bajic
a9b1ff9bea Support Bolt v4.3 protocol (#226) 2021-10-28 13:05:09 +02:00
Jure Bajic
e40bc32624 Fix daily benchmark workflow (#284) 2021-10-27 09:05:46 +02:00
Antonio Andelic
bd21bc82b7 Add license to cpp/hpp/py test files (#283) 2021-10-26 08:53:56 +02:00
Jure Bajic
9c1680e82c Change how to get branch name (#281) 2021-10-25 09:01:26 +02:00
Antonio Andelic
1a78c3695d Support multiple types for weighted shortest path (#278) 2021-10-19 14:39:23 +02:00
Kostas Kyrimis
10196f3d7d Add bootstrap servers to create stream (#274) 2021-10-18 10:49:00 +02:00
Jure Bajic
2c86fefbb5 Run diff on master (#275) 2021-10-18 08:40:07 +02:00
Antonio Andelic
df689dccd5 Make Memgraph work with fetch content (#256) 2021-10-14 18:58:42 +02:00
Jure Bajic
6033fbe9bd Clean up topics before starting test (#267) 2021-10-14 16:57:46 +02:00
Jure Bajic
519a204424 Add retry to get_version script (#268) 2021-10-14 16:07:40 +02:00
Antonio Andelic
3fc5e57fef Update dependency source when package all is called (#272) 2021-10-14 15:16:32 +02:00
János Benjamin Antal
906933d2b3 Fix typo in procedure C-API (#273) 2021-10-14 08:50:16 +02:00
Antonio Andelic
e9a937ad6d Update license headers and change date (#270) 2021-10-13 10:06:07 +02:00
Antonio Andelic
6dc2cdfae4 Fix trigger with detach delete (#266) 2021-10-12 16:21:28 +02:00
g-despot
69ea410406 Add CONTRIBUTING and CODE_OF_CONDUCT (#269) 2021-10-12 14:11:07 +02:00
Kostas Kyrimis
24a576c8e9 Make write procedures trigger aware (#262) 2021-10-11 13:39:57 +02:00
Antonio Andelic
d417ffee6e Update community build step (#261) 2021-10-08 14:36:17 +02:00
Antonio Andelic
f868b51483 Update mgconsole version (#260) 2021-10-08 11:19:21 +02:00
g-despot
26dc73c809 Update installation in README (#263) 2021-10-08 10:28:09 +02:00
g-despot
9119c89eba Add updated startup message (#259) 2021-10-07 15:56:06 +02:00
Antonio Andelic
4e7ea34ae9 Add message with link utility (#243) 2021-10-07 14:51:30 +02:00
János Benjamin Antal
d7d291217b Remove debug print (#251) 2021-10-07 09:14:05 +02:00
Marko Budiselić
42facfacbc Add support for Debian 11 (#212) 2021-10-06 16:17:41 +02:00
János Benjamin Antal
bd1e848363 Add issue template (#258) 2021-10-06 11:52:15 +02:00
antonio2368
0ffb58b764 Fix docker packaging and add for platform build (#257) 2021-10-06 10:20:37 +02:00
g-despot
9551b6973a Fix URL in build badge 2021-10-05 14:30:09 +02:00
Jure Bajic
f7ef5f50a4 Update workflow (#255) 2021-10-05 09:03:48 +02:00
Mislav Vuletić
046cd80054 Make readme awesome (#228)
Co-authored-by: antonio2368 <antonio2368@users.noreply.github.com>
Co-authored-by: Ivan Despot <ivan.g.despot@outlook.com>
2021-10-04 16:15:59 +02:00
Jure Bajic
9e678f8cbe Add new memgraph licenses and move third party licenses (#248) 2021-10-03 12:26:48 +02:00
antonio2368
69e4f1784b Small polishing for Release workflow (#250) 2021-10-03 11:09:57 +02:00
Kostas Kyrimis
d04e23805d Address temporal type epic comments (#249) 2021-10-02 18:48:50 +02:00
Kostas Kyrimis
7e82cc6550 Add uniform naming for temporal type properties (#246) 2021-10-02 16:14:27 +02:00
Kostas Kyrimis
18b801a722 Add e2e tests for temporal types (#241) 2021-10-02 15:31:00 +02:00
Kostas Kyrimis
7e81a95b81 Fix parsing negative durations (#237) 2021-10-02 15:30:35 +02:00
antonio2368
0a23eb11ae Define procedure API for temporal types (#229) 2021-10-02 15:30:34 +02:00
Kostas Kyrimis
8ea281649a Remove support for iso duration and fix bolt (#235) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
da68f86fc9 Add support for printing out in the ast temporal data values (#227) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
738b5fb8d8 Add duration support for timestamp function (#236) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
b45ae403e6 Define dump command for all temporal types (#225) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
d744711e5e Define functions that return a specific field of each temporal type (#221) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
8d87e38c64 Add temporal type arithmetic for queries (#214) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
086fc47769 Define subtraction and addition for temporal types (#209) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
5abcb5081d Define timestamp function that return temporal types in microseconds since epoch representation (#205) 2021-10-02 14:54:48 +02:00
Kostas Kyrimis
9534dfb6ed Change the timestamp function to return microseconds instead of milliseconds (#204) 2021-10-02 14:54:48 +02:00
antonio2368
e2112faff0 Functions for defining temporals (#197) 2021-10-02 14:54:47 +02:00
Kostas Kyrimis
6913feacc7 Add support for temporal data types in the communication Bolt layer (#198) 2021-10-02 14:54:47 +02:00
antonio2368
4e604de9d7 Add support for parsing temporal types (#187) 2021-10-02 14:54:45 +02:00
antonio2368
e628b5ba6e Add temporal types to TypedValue (#176) 2021-10-02 14:53:53 +02:00
antonio2368
5da32c1bff Add TemporalData to PropertyValue (#174) 2021-10-02 14:53:53 +02:00
János Benjamin Antal
ccca46370d Fix RWTypeChecker and some small improvements (#247)
* Fix doc of mgp_graph_vertices

* Make write_proc example meaningful write procedure example

* Improve wrap_exceptions

* Add check for write procedures for ReadWriteTypeChecker

* Change error code in case of invalid default value for optional arguments
2021-10-02 13:18:37 +02:00
János Benjamin Antal
e33fa5f9c0 Add example write procedure (#244) 2021-10-02 13:18:37 +02:00
János Benjamin Antal
721eefe263 Handle write procedures in queries and update docs of properties iterator (#238) 2021-10-02 13:18:36 +02:00
János Benjamin Antal
be9ed7e879 Python wrapper for write procedures (#234)
* Rename mgp_graph_remove to mgp_graph_delete

* Add mgp_graph_detach_delete

* Add PyGraph functions

* Add _mgp exceptions

* Use unified error handling in python wrapper

* Ignore clang-tidy warnings

* Add mgp.Graph, mgp.Vertex and mgp.Edge mutable functions

* Add python write procedure registration

* Add `is_write` result field to mg.procedures

* Use storage::View::NEW for write procedures

* Add simple tests for write procedures

* Remove false information about IDs
2021-10-02 13:17:41 +02:00
Benjamin Antal
482798295e Add write procedures 2021-10-02 13:17:41 +02:00
antonio2368
d58a1cbb58 License key introduction and removing community edition package (#232) 2021-09-29 19:14:39 +02:00
antonio2368
8dc3153fde Don't strip queries after execute for CREATE TRIGGER only (#245) 2021-09-24 13:14:05 +02:00
antonio2368
b94e50bf1c Use from_timestamp for WAL retention (#240) 2021-09-24 12:14:54 +02:00
antonio2368
9f855676cb Add jemalloc purge (#239) 2021-09-21 14:43:27 +02:00
693 changed files with 27642 additions and 5189 deletions

View File

@@ -1,5 +1,6 @@
---
Checks: '*,
-abseil-string-find-str-contains,
-altera-struct-pack-align,
-android-*,
-cert-err58-cpp,
@@ -57,7 +58,8 @@ Checks: '*,
-readability-implicit-bool-conversion,
-readability-magic-numbers,
-readability-named-parameter,
-misc-no-recursion'
-misc-no-recursion,
-concurrency-mt-unsafe'
WarningsAsErrors: ''
HeaderFilterRegex: 'src/.*'
AnalyzeTemporaryDtors: false

View File

@@ -30,6 +30,14 @@ for file in $modified_files; do
if [ $code -ne 0 ]; then
break
fi
echo "Running header checker..."
$project_folder/tools/header-checker.py $tmpdir/$file
code=$?
if [ $code -ne 0 ]; then
break
fi
done;
return $code

34
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,34 @@
---
name: Bug report
about: Create a report to help us improve
title: "[BUG] "
labels: bug
assignees: gitbuda, antonio2368
---
**Memgraph version**
Which version did you use?
**Environment**
Some information about the environment you are using Memgraph on: operating
system, how do you connect, with or without docker, which driver etc.
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Run the following query '...'
2. Click on '....'
**Expected behavior**
A clear and concise description of what you expected to happen.
**Logs**
If applicable, add logs of Memgraph, CLI output or screenshots to help explain
your problem.
**Additional context**
Add any other context about the problem here.

View File

@@ -11,6 +11,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Diff, Gen7]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -40,6 +42,16 @@ jobs:
--groups aggregation 1000_create unwind_create dense_expand match \
--no-strict
- name: Get branch name (merge)
if: github.event_name != 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | tr / -)" >> $GITHUB_ENV
- name: Get branch name (pull request)
if: github.event_name == 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_HEAD_REF} | tr / -)" >> $GITHUB_ENV
- name: Upload macro benchmark results
run: |
cd tools/bench-graph-client
@@ -49,7 +61,8 @@ jobs:
./main.py --benchmark-name "macro_benchmark" \
--benchmark-results-path "../../tests/macro_benchmark/.harness_summary" \
--github-run-id "${{ github.run_id }}" \
--github-run-number "${{ github.run_number }}"
--github-run-number "${{ github.run_number }}" \
--head-branch-name "${{ env.BRANCH_NAME }}"
- name: Run mgbench
run: |
@@ -65,4 +78,5 @@ jobs:
./main.py --benchmark-name "mgbench" \
--benchmark-results-path "../../tests/mgbench/benchmark_result.json" \
--github-run-id "${{ github.run_id }}" \
--github-run-number "${{ github.run_number }}"
--github-run-number "${{ github.run_number }}" \
--head-branch-name "${{ env.BRANCH_NAME }}"

View File

@@ -2,11 +2,15 @@ name: Diff
on:
push:
branches:
- master
workflow_dispatch:
pull_request:
paths-ignore:
- 'docs/**'
- '**/*.md'
- '.clang-format'
- 'CODEOWNERS'
- "docs/**"
- "**/*.md"
- ".clang-format"
- "CODEOWNERS"
jobs:
community_build:
@@ -14,6 +18,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Diff]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -45,37 +51,13 @@ jobs:
cd build
ctest -R memgraph__unit --output-on-failure -j$THREADS
- name: Run stress test
run: |
cd tests/stress
./continuous_integration
- name: Create community DEB package
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
cd build
# create mgconsole
# we use the -B to force the build
make -j$THREADS -B mgconsole
# Create community DEB package.
mkdir output && cd output
cpack -G DEB --config ../CPackConfig.cmake
- name: Save community DEB package
uses: actions/upload-artifact@v2
with:
name: "Community DEB package"
path: build/output/memgraph*.deb
code_analysis:
name: "Code analysis"
runs-on: [self-hosted, Linux, X64, Diff]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -140,6 +122,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Diff]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -214,6 +198,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Diff]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -249,6 +235,15 @@ jobs:
tests/gql_behave/gql_behave_status.csv
tests/gql_behave/gql_behave_status.html
- name: Run unit tests
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
# Run unit tests.
cd build
ctest -R memgraph__unit --output-on-failure -j$THREADS
- name: Run e2e tests
run: |
# TODO(gitbuda): Setup mgclient and pymgclient properly.
@@ -310,6 +305,8 @@ jobs:
#continue-on-error: true
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -349,6 +346,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Diff, Gen7]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -378,6 +377,16 @@ jobs:
--groups aggregation 1000_create unwind_create dense_expand match \
--no-strict
- name: Get branch name (merge)
if: github.event_name != 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | tr / -)" >> $GITHUB_ENV
- name: Get branch name (pull request)
if: github.event_name == 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_HEAD_REF} | tr / -)" >> $GITHUB_ENV
- name: Upload macro benchmark results
run: |
cd tools/bench-graph-client
@@ -387,7 +396,8 @@ jobs:
./main.py --benchmark-name "macro_benchmark" \
--benchmark-results-path "../../tests/macro_benchmark/.harness_summary" \
--github-run-id "${{ github.run_id }}" \
--github-run-number "${{ github.run_number }}"
--github-run-number "${{ github.run_number }}" \
--head-branch-name "${{ env.BRANCH_NAME }}"
- name: Run mgbench
run: |
@@ -403,4 +413,5 @@ jobs:
./main.py --benchmark-name "mgbench" \
--benchmark-results-path "../../tests/mgbench/benchmark_result.json" \
--github-run-id "${{ github.run_id }}" \
--github-run-number "${{ github.run_number }}"
--github-run-number "${{ github.run_number }}" \
--head-branch-name "${{ env.BRANCH_NAME }}"

View File

@@ -9,6 +9,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository

View File

@@ -5,7 +5,7 @@ name: Package All
on: workflow_dispatch
jobs:
centos-7_community:
centos-7:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -15,14 +15,14 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package community centos-7
./release/package/run.sh package centos-7
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: centos-7_community
name: centos-7
path: build/output/centos-7/memgraph*.rpm
centos-8_community:
centos-8:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -32,14 +32,14 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package community centos-8
./release/package/run.sh package centos-8
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: centos-8_community
name: centos-8
path: build/output/centos-8/memgraph*.rpm
debian-9_community:
debian-9:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -49,14 +49,14 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package community debian-9
./release/package/run.sh package debian-9
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: debian-9_community
name: debian-9
path: build/output/debian-9/memgraph*.deb
debian-10_community:
debian-10:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -66,14 +66,31 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package community debian-10
./release/package/run.sh package debian-10
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: debian-10_community
name: debian-10
path: build/output/debian-10/memgraph*.deb
docker_community:
debian-11:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package debian-11
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: debian-11
path: build/output/debian-11/memgraph*.deb
docker:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -84,15 +101,15 @@ jobs:
- name: "Build package"
run: |
cd release/package
./run.sh package community debian-10 --for-docker
./run.sh package debian-11 --for-docker
./run.sh docker
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: docker_community
name: docker
path: build/output/docker/memgraph*.tar.gz
ubuntu-1804_community:
ubuntu-1804:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -102,14 +119,14 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package community ubuntu-18.04
./release/package/run.sh package ubuntu-18.04
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: ubuntu-1804_community
name: ubuntu-1804
path: build/output/ubuntu-18.04/memgraph*.deb
ubuntu-2004_community:
ubuntu-2004:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -119,14 +136,14 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package community ubuntu-20.04
./release/package/run.sh package ubuntu-20.04
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: ubuntu-2004_community
name: ubuntu-2004
path: build/output/ubuntu-20.04/memgraph*.deb
centos-7_enterprise:
debian-11-platform:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
@@ -136,113 +153,9 @@ jobs:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package enterprise centos-7
./release/package/run.sh package debian-11 --for-platform
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: centos-7_enterprise
path: build/output/centos-7/memgraph*.rpm
centos-8_enterprise:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package enterprise centos-8
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: centos-8_enterprise
path: build/output/centos-8/memgraph*.rpm
debian-9_enterprise:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package enterprise debian-9
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: debian-9_enterprise
path: build/output/debian-9/memgraph*.deb
debian-10_enterprise:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package enterprise debian-10
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: debian-10_enterprise
path: build/output/debian-10/memgraph*.deb
docker_enterprise:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
cd release/package
./run.sh package enterprise debian-10 --for-docker
./run.sh docker
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: docker_enterprise
path: build/output/docker/memgraph*.tar.gz
ubuntu-1804_enterprise:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package enterprise ubuntu-18.04
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: ubuntu-1804_enterprise
path: build/output/ubuntu-18.04/memgraph*.deb
ubuntu-2004_enterprise:
runs-on: [self-hosted, DockerMgBuild]
timeout-minutes: 60
steps:
- name: "Set up repository"
uses: actions/checkout@v2
with:
fetch-depth: 0 # Required because of release/get_version.py
- name: "Build package"
run: |
./release/package/run.sh package enterprise ubuntu-20.04
- name: "Upload package"
uses: actions/upload-artifact@v2
with:
name: ubuntu-2004_enterprise
path: build/output/ubuntu-20.04/memgraph*.deb
name: debian-11-platform
path: build/output/debian-11/memgraph*.deb

View File

@@ -11,6 +11,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, CentOS8]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 960
steps:
@@ -34,28 +36,6 @@ jobs:
cmake -DCMAKE_BUILD_TYPE=release -DMG_ENTERPRISE=OFF ..
make -j$THREADS
- name: Create community RPM package
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
cd build
# create mgconsole
# we use the -B to force the build
make -j$THREADS -B mgconsole
# Create community RPM package.
mkdir output && cd output
cpack -G RPM --config ../CPackConfig.cmake
rpmlint memgraph*.rpm
- name: Save community RPM package
uses: actions/upload-artifact@v2
with:
name: "Community RPM package"
path: build/output/memgraph*.rpm
- name: Run unit tests
run: |
# Activate toolchain.
@@ -65,21 +45,13 @@ jobs:
cd build
ctest -R memgraph__unit --output-on-failure
- name: Run stress test (plain)
run: |
cd tests/stress
./continuous_integration
- name: Run stress test (large)
run: |
cd tests/stress
./continuous_integration --large-dataset
coverage_build:
name: "Coverage build"
runs-on: [self-hosted, Linux, X64, CentOS8]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -135,6 +107,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, CentOS8]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -209,6 +183,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, CentOS8]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 960
steps:
@@ -293,6 +269,15 @@ jobs:
tests/gql_behave/gql_behave_status.csv
tests/gql_behave/gql_behave_status.html
- name: Run unit tests
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
# Run unit tests.
cd build
ctest -R memgraph__unit --output-on-failure
- name: Run e2e tests
run: |
# TODO(gitbuda): Setup mgclient and pymgclient properly.

View File

@@ -11,6 +11,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Debian10]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 960
steps:
@@ -34,27 +36,6 @@ jobs:
cmake -DCMAKE_BUILD_TYPE=release -DMG_ENTERPRISE=OFF ..
make -j$THREADS
- name: Create community DEB package
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
cd build
# create mgconsole
# we use the -B to force the build
make -j$THREADS -B mgconsole
# Create community DEB package.
mkdir output && cd output
cpack -G DEB --config ../CPackConfig.cmake
- name: Save community DEB package
uses: actions/upload-artifact@v2
with:
name: "Community DEB package"
path: build/output/memgraph*.deb
- name: Run unit tests
run: |
# Activate toolchain.
@@ -64,21 +45,13 @@ jobs:
cd build
ctest -R memgraph__unit --output-on-failure
- name: Run stress test (plain)
run: |
cd tests/stress
./continuous_integration
- name: Run stress test (large)
run: |
cd tests/stress
./continuous_integration --large-dataset
coverage_build:
name: "Coverage build"
runs-on: [self-hosted, Linux, X64, Debian10]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -134,6 +107,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Debian10]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -208,6 +183,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Debian10]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 960
steps:
@@ -291,6 +268,15 @@ jobs:
tests/gql_behave/gql_behave_status.csv
tests/gql_behave/gql_behave_status.html
- name: Run unit tests
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
# Run unit tests.
cd build
ctest -R memgraph__unit --output-on-failure
- name: Run e2e tests
run: |
# TODO(gitbuda): Setup mgclient and pymgclient properly.
@@ -332,6 +318,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Debian10, JepsenControl]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 60
steps:

View File

@@ -11,6 +11,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 960
steps:
@@ -34,27 +36,6 @@ jobs:
cmake -DCMAKE_BUILD_TYPE=release -DMG_ENTERPRISE=OFF ..
make -j$THREADS
- name: Create community DEB package
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
cd build
# create mgconsole
# we use the -B to force the build
make -j$THREADS -B mgconsole
# Create community DEB package.
mkdir output && cd output
cpack -G DEB --config ../CPackConfig.cmake
- name: Save community DEB package
uses: actions/upload-artifact@v2
with:
name: "Community DEB package"
path: build/output/memgraph*.deb
- name: Run unit tests
run: |
# Activate toolchain.
@@ -64,21 +45,13 @@ jobs:
cd build
ctest -R memgraph__unit --output-on-failure
- name: Run stress test (plain)
run: |
cd tests/stress
./continuous_integration
- name: Run stress test (large)
run: |
cd tests/stress
./continuous_integration --large-dataset
coverage_build:
name: "Coverage build"
runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -134,6 +107,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
steps:
- name: Set up repository
@@ -208,6 +183,8 @@ jobs:
runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
env:
THREADS: 24
MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
timeout-minutes: 960
steps:
@@ -291,6 +268,15 @@ jobs:
tests/gql_behave/gql_behave_status.csv
tests/gql_behave/gql_behave_status.html
- name: Run unit tests
run: |
# Activate toolchain.
source /opt/toolchain-v3/activate
# Run unit tests.
cd build
ctest -R memgraph__unit --output-on-failure
- name: Run e2e tests
run: |
# TODO(gitbuda): Setup mgclient and pymgclient properly.

View File

@@ -35,13 +35,14 @@ else()
message(FATAL_ERROR "Couldn't find clang and/or clang++!")
endif()
option(BUILD_FOR_DOCKER "Build Memgraph binary for docker." OFF)
message(STATUS "BUILD_FOR_DOCKER: ${BUILD_FOR_DOCKER}")
# -----------------------------------------------------------------------------
project(memgraph)
# Install licenses.
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/licenses/
DESTINATION share/doc/memgraph)
# For more information about how to release a new version of Memgraph, see
# `release/README.md`.
@@ -61,21 +62,21 @@ set(MEMGRAPH_OVERRIDE_VERSION_SUFFIX "")
# Variables used to generate the versions.
if (MG_ENTERPRISE)
set(get_version_enterprise "--enterprise")
set(get_version_offering "")
else()
set(get_version_enterprise "")
set(get_version_offering "--open-source")
endif()
set(get_version_script "${CMAKE_SOURCE_DIR}/release/get_version.py")
set(get_version_script "${CMAKE_CURRENT_SOURCE_DIR}/release/get_version.py")
# Get version that should be used in the binary.
execute_process(
OUTPUT_VARIABLE MEMGRAPH_VERSION
RESULT_VARIABLE MEMGRAPH_VERSION_RESULT
COMMAND "${get_version_script}" ${get_version_enterprise}
COMMAND "${get_version_script}" ${get_version_offering}
"${MEMGRAPH_OVERRIDE_VERSION}"
"${MEMGRAPH_OVERRIDE_VERSION_SUFFIX}"
"--memgraph-root-dir"
"${CMAKE_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}"
)
if(MEMGRAPH_VERSION_RESULT AND NOT MEMGRAPH_VERSION_RESULT EQUAL 0)
message(FATAL_ERROR "Unable to get Memgraph version.")
@@ -87,12 +88,12 @@ endif()
execute_process(
OUTPUT_VARIABLE MEMGRAPH_VERSION_DEB
RESULT_VARIABLE MEMGRAPH_VERSION_DEB_RESULT
COMMAND "${get_version_script}" ${get_version_enterprise}
COMMAND "${get_version_script}" ${get_version_offering}
--variant deb
"${MEMGRAPH_OVERRIDE_VERSION}"
"${MEMGRAPH_OVERRIDE_VERSION_SUFFIX}"
"--memgraph-root-dir"
"${CMAKE_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}"
)
if(MEMGRAPH_VERSION_DEB_RESULT AND NOT MEMGRAPH_VERSION_DEB_RESULT EQUAL 0)
message(FATAL_ERROR "Unable to get Memgraph DEB version.")
@@ -104,12 +105,12 @@ endif()
execute_process(
OUTPUT_VARIABLE MEMGRAPH_VERSION_RPM
RESULT_VARIABLE MEMGRAPH_VERSION_RPM_RESULT
COMMAND "${get_version_script}" ${get_version_enterprise}
COMMAND "${get_version_script}" ${get_version_offering}
--variant rpm
"${MEMGRAPH_OVERRIDE_VERSION}"
"${MEMGRAPH_OVERRIDE_VERSION_SUFFIX}"
"--memgraph-root-dir"
"${CMAKE_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}"
)
if(MEMGRAPH_VERSION_RPM_RESULT AND NOT MEMGRAPH_VERSION_RPM_RESULT EQUAL 0)
message(FATAL_ERROR "Unable to get Memgraph RPM version.")
@@ -265,7 +266,11 @@ if (MG_ENTERPRISE)
add_definitions(-DMG_ENTERPRISE)
endif()
set(ENABLE_JEMALLOC ON)
if (ASAN)
message(WARNING "Disabling jemalloc as it doesn't work well with ASAN")
set(ENABLE_JEMALLOC OFF)
# Enable Addres sanitizer and get nicer stack traces in error messages.
# NOTE: AddressSanitizer uses llvm-symbolizer binary from the Clang
# distribution to symbolize the stack traces (note that ideally the
@@ -326,8 +331,13 @@ add_subdirectory(src)
# Release configuration
add_subdirectory(release)
enable_testing()
add_subdirectory(tests)
option(MG_ENABLE_TESTING "Set this to OFF to disable building test binaries" ON)
message(STATUS "MG_ENABLE_TESTING: ${MG_ENABLE_TESTING}")
if (MG_ENABLE_TESTING)
enable_testing()
add_subdirectory(tests)
endif()
if(TOOLS)
add_subdirectory(tools)

127
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,127 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or advances of
any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing other's private information, such as a physical or email address,
without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[contact@memgraph.com](contact@memgraph.com). All complaints will be reviewed
and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the Contributor Covenant, version 2.1,
available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder][mozilla coc].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq).
Translations are available at
[https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations).

121
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,121 @@
# How to contribute?
This is a general purpose guide for contributing to Memgraph. We're still
working out the kinks to make contributing to this project as easy and
transparent as possible, but we're not quite there yet. Hopefully, this document
makes the process for contributing clear and answers some questions that you may
have.
- [How to contribute?](#how-to-contribute)
- [Open development](#open-development)
- [Branch organization](#branch-organization)
- [Bugs & changes](#bugs--changes)
- [Where to find known issues?](#where-to-find-known-issues)
- [Proposing a change](#proposing-a-change)
- [Your first pull request](#your-first-pull-request)
- [Sending a pull request](#sending-a-pull-request)
- [Style guide](#style-guide)
- [How to get in touch?](#how-to-get-in-touch)
- [Code of Conduct](#code-of-conduct)
- [License](#license)
- [Attribution](#attribution)
## Open development
All work on Memgraph is done via [GitHub](https://github.com/memgraph/memgraph).
Both core team members and external contributors send pull requests which go
through the same review process.
## Branch organization
Most pull requests should target the [`master
branch`](https://github.com/memgraph/memgraph/tree/master). We only use separate
branches for developing new features and fixing bugs before they are merged with
`master`. We do our best to keep `master` in good shape, with all tests passing.
Code that lands in `master` must be compatible with the latest stable release.
It may contain additional features but no breaking changes if it's not
absolutely necessary. We should be able to release a new minor version from the
tip of `master` at any time.
## Bugs & changes
### Where to find known issues?
We are using [GitHub Issues](https://github.com/memgraph/memgraph/issues) for
our public bugs. We keep a close eye on this and try to make it clear when we
have an internal fix in progress. Before filing a new task, try to make sure
your problem doesn't already exist.
### Proposing a change
If you intend to change the public API, or make any non-trivial changes to the
implementation, we recommend [filing an
issue](https://github.com/memgraph/memgraph/issues/new). This lets us reach an
agreement on your proposal before you put significant effort into it.
If you're only fixing a bug, it's fine to submit a pull request right away but
we still recommend to file an issue detailing what you're fixing. This is
helpful in case we don't accept that specific fix but want to keep track of the
issue.
### Your first pull request
Working on your first Pull Request? You can learn how from this free video
series:
**[How to Contribute to an Open Source Project on
GitHub](https://app.egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github)**
If you decide to fix an issue, please be sure to check the comment thread in
case somebody is already working on a fix. If nobody is working on it at the
moment, please leave a comment stating that you intend to work on it so other
people don't accidentally duplicate your effort.
If somebody claims an issue but doesn't follow up for more than two weeks, it's
fine to take it over but you should still leave a comment.
### Sending a pull request
The core team is monitoring for pull requests. We will review your pull request
and either merge it, request changes to it, or close it with an explanation.
**Before submitting a pull request,** please make sure the following is done:
1. Fork [the repository](https://github.com/memgraph/memgraph) and create your
branch from `master`.
2. If you've fixed a bug or added code that should be tested, add tests!
3. Use the formatter `clang-format` for C/C++ code and `flake8` for Python code.
`clang-format` will automatically detect the `.clang-format` file in the root
directory while `flake8` can be used with the default configuration.
### Style guide
Memgraph uses the [Google Style
Guide](https://google.github.io/styleguide/cppguide.html) for C++ in most of its
code. You should follow them whenever writing new code.
## How to get in touch?
Aside from communicating directly via Pull Requests and Issues, the Memgraph
Community [Discord Server](https://discord.gg/memgraph) is the best place for
conversing with project maintainers and other community members.
## [Code of Conduct](https://github.com/memgraph/memgraph/blob/master/CODE_OF_CONDUCT.md)
Memgraph has adopted the [Contributor
Covenant](https://www.contributor-covenant.org/) as its Code of Conduct, and we
expect project participants to adhere to it. Please read [the full
text](https://github.com/memgraph/memgraph/blob/master/CODE_OF_CONDUCT.md) so
that you can understand what actions will and will not be tolerated.
## License
By contributing to Memgraph, you agree that your contributions will be licensed
under the [Memgraph licensing
scheme](https://github.com/memgraph/memgraph/blob/master/LICENSE).
## Attribution
This Contributing guide is adapted from the **React.js Contributing guide**
available at
[https://reactjs.org/docs/how-to-contribute.html](https://reactjs.org/docs/how-to-contribute.html).

5
LICENSE Normal file
View File

@@ -0,0 +1,5 @@
Source code in this repository is variously licensed under the Business Source
License 1.1 (BSL), the Memgraph Enterprise License (MEL). A copy of each licence
can be found in the licences directory. Source code in a given file is licensed
under the BSL and the copyright belongs to The Memgraph Authors unless
otherwise noted at th beginning of the file.

143
README.md
View File

@@ -1,21 +1,136 @@
# Memgraph
<p align="center">
<img width="400px" src="https://uploads-ssl.webflow.com/5e7ceb09657a69bdab054b3a/5e7ceb09657a6937ab054bba_Black_Original%20_Logo.png">
</p>
Memgraph is an ACID compliant high performance transactional distributed
in-memory graph database featuring runtime native query compiling, lock free
data structures, multi-version concurrency control and asynchronous IO.
---
## Development Documentation
<p align="center">
Build modern, graph-based applications on top of your streaming data in minutes.
</p>
Please continue in
[Notion](https://www.notion.so/memgraph/memgraph-0428591638604c8385550e214ea9f3e6).
<p align="center">
<a href="https://github.com/memgraph/memgraph/blob/master/licenses/APL.txt">
<img src="https://img.shields.io/badge/license-APL-green" alt="license" title="license"/>
</a>
<a href="https://github.com/memgraph/memgraph/blob/master/licenses/BSL.txt">
<img src="https://img.shields.io/badge/license-BSL-yellowgreen" alt="license" title="license"/>
</a>
<a href="https://github.com/memgraph/memgraph/blob/master/licenses/MEL.txt" alt="Documentation">
<img src="https://img.shields.io/badge/license-MEL-yellow" alt="license" title="license"/>
</a>
</p>
## User Documentation
<p align="center">
<a href="https://github.com/memgraph/memgraph">
<img src="https://img.shields.io/github/workflow/status/memgraph/memgraph/Release%20Ubuntu%2020.04/master" alt="build" title="build"/>
</a>
<a href="https://memgraph.com/docs/" alt="Documentation">
<img src="https://img.shields.io/badge/documentation-Memgraph-orange" />
</a>
</p>
Memgraph user documentation is maintained within
[docs](https://github.com/memgraph/docs) repository. The documentation is also
available on [GitBook](https://docs.memgraph.com).
<p align="center">
<a href="https://memgr.ph/join-discord">
<img src="https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white" alt="Discord"/>
</a>
</p>
## Licences
## :clipboard: Description
* [Community](release/LICENSE_COMMUNITY.md)
* [Enterprise](release/LICENSE_ENTERPRISE.md)
Memgraph is a streaming graph application platform that helps you wrangle your
streaming data, build sophisticated models that you can query in real-time, and
develop graph applications.
Memgraph directly connects to your streaming infrastructure. You can ingest data
from sources like Kafka, SQL, or plain CSV files. Memgraph provides a standard
interface to query your data with Cypher, a widely-used and declarative query
language that is easy to write, understand and optimize for performance. This is
achieved by using the property graph data model, which stores data in terms of
objects, their attributes, and the relationships that connect them. This is a
natural and effective way to model many real-world problems without relying on
complex SQL schemas.
Memgraph is implemented in C/C++ and leverages an in-memory first architecture
to ensure that youre getting the best possible performance consistently and
without surprises. Its also ACID-compliant and highly available.
## :floppy_disk: Download & Install
### Windows
[![Windows](https://img.shields.io/badge/Windows-Docker-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://memgraph.com/docs/memgraph/install-memgraph-on-windows-docker)
[![Windows](https://img.shields.io/badge/Windows-WSL-0078D6?style=for-the-badge&logo=windows&logoColor=white)](https://memgraph.com/docs/memgraph/install-memgraph-on-windows-wsl)
### macOS
[![macOS](https://img.shields.io/badge/macOS-Docker-000000?style=for-the-badge&logo=macos&logoColor=F0F0F0)](https://memgraph.com/docs/memgraph/install-memgraph-on-macos-docker)
### Linux
[![Linux](https://img.shields.io/badge/Linux-Docker-FCC624?style=for-the-badge&logo=linux&logoColor=black)](https://memgraph.com/docs/memgraph/install-memgraph-on-linux-docker)
[![Debian](https://img.shields.io/badge/Debian-D70A53?style=for-the-badge&logo=debian&logoColor=white)](https://memgraph.com/docs/memgraph/install-memgraph-on-debian)
[![Ubuntu](https://img.shields.io/badge/Ubuntu-E95420?style=for-the-badge&logo=ubuntu&logoColor=white)](https://memgraph.com/docs/memgraph/install-memgraph-on-ubuntu)
[![Cent
OS](https://img.shields.io/badge/cent%20os-002260?style=for-the-badge&logo=centos&logoColor=F0F0F0)](https://memgraph.com/docs/memgraph/install-memgraph-from-rpm)
You can find the binaries and Docker images on the [Download
Hub](https://memgraph.com/download) and the installation instructions in the
[official documentation](https://memgraph.com/docs/memgraph/installation).
## :zap: Features
- Run Python, Rust, and C/C++ code natively, check out the
[MAGE](https://github.com/memgraph/mage) graph algorithm library
- Native support for machine learning
- Streaming support
- Replication
- Authentication and authorization
- ACID compliance
## :bookmark_tabs: Documentation
The Memgraph documentation is available at
[memgraph.com/docs](https://memgraph.com/docs).
## :question: Configuration
Command line options that Memgraph accepts are available in the [reference
guide](https://memgraph.com/docs/memgraph/reference-guide/configuration).
## :trophy: Contributing
The main purpose of this repository is to continue evolving Memgraph, making it
faster and easier to use. Development of Memgraph happens in the open on GitHub,
and we are grateful to the community for contributing bug fixes and
improvements. Read below to learn how you can take part in improving Memgraph.
### Code of Conduct
Memgraph has adopted a Code of Conduct that we expect project participants to
adhere to. Please read [the full text](CODE_OF_CONDUCT.md) so that you can
understand what actions will and will not be tolerated.
### Contributing Guide
Read our [contributing guide](CONTRIBUTING.md) to learn about our development
process and how to propose bug fixes and improvements.
### Internals
Read our
[internal](https://memgraph.notion.site/Memgraph-Internals-12b69132d67a417898972927d6870bd2)
docs to learn more about Memgraph's architecture, how to build the project from
source and how to start contributing. All information related to the database,
can be found in the aforementioned docs.
### :scroll: License
Memgraph Community is available under the [BSL
license](./licenses/BSL.txt).</br> Memgraph Enterprise is available under the
[MEL license](./licenses/MEL.txt).
<p align="center">
<a href="#">
<img src="https://img.shields.io/badge/⬆back_to_top_⬆-white" alt="Back to top" title="Back to top"/>
</a>
</p>

View File

@@ -101,3 +101,5 @@ undocumented:
- "help"
- "help_xml"
- "version"
- "organization_name"
- "license_key"

View File

@@ -1,4 +0,0 @@
# Memgraph Build and Run Environments
Please continue in
[Notion](https://www.notion.so/memgraph/Tools-05e0baafb78a49b386e0063b4833d23d).

View File

@@ -49,6 +49,7 @@ MEMGRAPH_BUILD_DEPS=(
doxygen graphviz # source documentation generators
which mono-complete dotnet-sdk-3.1 golang nodejs zip unzip java-11-openjdk-devel # for driver tests
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {

View File

@@ -48,6 +48,7 @@ MEMGRAPH_BUILD_DEPS=(
which mono-complete dotnet-sdk-3.1 nodejs golang zip unzip java-11-openjdk-devel # for driver tests
sbcl # for custom Lisp C++ preprocessing
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {

View File

@@ -46,6 +46,7 @@ MEMGRAPH_BUILD_DEPS=(
mono-runtime mono-mcs zip unzip default-jdk-headless # for driver tests
dotnet-sdk-3.1 golang nodejs npm
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {
@@ -66,7 +67,7 @@ deb http://security.debian.org/debian-security buster/updates main contrib non-f
deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
EOF
cd "$DIR"
apt update
apt --allow-releaseinfo-change update
# If GitHub Actions runner is installed, append LANG to the environment.
# Python related tests doesn't work the LANG export.
if [ -d "/home/gh/actions-runner" ]; then

97
environment/os/debian-11.sh Executable file
View File

@@ -0,0 +1,97 @@
#!/bin/bash
set -Eeuo pipefail
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
source "$DIR/../util.sh"
TOOLCHAIN_BUILD_DEPS=(
coreutils gcc g++ build-essential make # generic build tools
wget # used for archive download
gnupg # used for archive signature verification
tar gzip bzip2 xz-utils unzip # used for archive unpacking
zlib1g-dev # zlib library used for all builds
libexpat1-dev libipt-dev libbabeltrace-dev liblzma-dev python3-dev texinfo # for gdb
libcurl4-openssl-dev # for cmake
libreadline-dev # for cmake and llvm
libffi-dev libxml2-dev # for llvm
libedit-dev libpcre3-dev automake bison # for swig
)
TOOLCHAIN_RUN_DEPS=(
make # generic build tools
tar gzip bzip2 xz-utils # used for archive unpacking
zlib1g # zlib library used for all builds
libexpat1 libipt2 libbabeltrace1 liblzma5 python3 # for gdb
libcurl4 # for cmake
file # for CPack
libreadline8 # for cmake and llvm
libffi7 libxml2 # for llvm
)
MEMGRAPH_BUILD_DEPS=(
git # source code control
make pkg-config # build system
curl wget # for downloading libs
uuid-dev default-jre-headless # required by antlr
libreadline-dev # for memgraph console
libpython3-dev python3-dev # for query modules
libssl-dev
libseccomp-dev
netcat # tests are using nc to wait for memgraph
python3 virtualenv python3-virtualenv python3-pip # for qa, macro_benchmark and stress tests
python3-yaml # for the configuration generator
libcurl4-openssl-dev # mg-requests
sbcl # for custom Lisp C++ preprocessing
doxygen graphviz # source documentation generators
mono-runtime mono-mcs zip unzip default-jdk-headless # for driver tests
dotnet-sdk-3.1 golang nodejs npm
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {
echo "$1"
}
check() {
check_all_dpkg "$1"
}
install() {
cat >/etc/apt/sources.list <<EOF
deb http://deb.debian.org/debian bullseye main
deb-src http://deb.debian.org/debian bullseye main
deb http://deb.debian.org/debian-security/ bullseye-security main
deb-src http://deb.debian.org/debian-security/ bullseye-security main
deb http://deb.debian.org/debian bullseye-updates main
deb-src http://deb.debian.org/debian bullseye-updates main
EOF
cd "$DIR"
apt update
# If GitHub Actions runner is installed, append LANG to the environment.
# Python related tests doesn't work the LANG export.
if [ -d "/home/gh/actions-runner" ]; then
echo "LANG=en_US.utf8" >> /home/gh/actions-runner/.env
else
echo "NOTE: export LANG=en_US.utf8"
fi
apt install -y wget
for pkg in $1; do
if [ "$pkg" == dotnet-sdk-3.1 ]; then
if ! dpkg -s "$pkg" 2>/dev/null >/dev/null; then
wget -nv https://packages.microsoft.com/config/debian/10/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
dpkg -i packages-microsoft-prod.deb
apt-get update
apt-get install -y apt-transport-https dotnet-sdk-3.1
fi
continue
fi
apt install -y "$pkg"
done
}
deps=$2"[*]"
"$1" "${!deps}"

View File

@@ -44,6 +44,7 @@ MEMGRAPH_BUILD_DEPS=(
doxygen graphviz # source documentation generators
mono-runtime mono-mcs nodejs zip unzip default-jdk-headless # for driver tests
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {

View File

@@ -45,6 +45,7 @@ MEMGRAPH_BUILD_DEPS=(
doxygen graphviz # source documentation generators
mono-runtime mono-mcs nodejs zip unzip default-jdk-headless # driver tests
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {

View File

@@ -46,6 +46,7 @@ MEMGRAPH_BUILD_DEPS=(
mono-runtime mono-mcs zip unzip default-jdk-headless # for driver tests
dotnet-sdk-3.1 golang nodejs npm
autoconf # for jemalloc code generation
libtool # for protobuf code generation
)
list() {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1
libs/.gitignore vendored
View File

@@ -5,3 +5,4 @@
!CMakeLists.txt
!__main.cpp
!jemalloc.cmake
!pulsar.patch

View File

@@ -48,7 +48,7 @@ endfunction(import_library)
# INSTALL_COMMAND arguments.
function(add_external_project name)
set(options NO_C_COMPILER)
set(one_value_kwargs SOURCE_DIR)
set(one_value_kwargs SOURCE_DIR BUILD_IN_SOURCE)
set(multi_value_kwargs CMAKE_ARGS DEPENDS INSTALL_COMMAND BUILD_COMMAND
CONFIGURE_COMMAND)
cmake_parse_arguments(KW "${options}" "${one_value_kwargs}" "${multi_value_kwargs}" ${ARGN})
@@ -56,11 +56,16 @@ function(add_external_project name)
if (KW_SOURCE_DIR)
set(source_dir ${KW_SOURCE_DIR})
endif()
set(build_in_source 0)
if (KW_BUILD_IN_SOURCE)
set(build_in_source ${KW_BUILD_IN_SOURCE})
endif()
if (NOT KW_NO_C_COMPILER)
set(KW_CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} ${KW_CMAKE_ARGS})
endif()
ExternalProject_Add(${name}-proj DEPENDS ${KW_DEPENDS}
PREFIX ${source_dir} SOURCE_DIR ${source_dir}
BUILD_IN_SOURCE ${build_in_source}
CONFIGURE_COMMAND ${KW_CONFIGURE_COMMAND}
CMAKE_ARGS -DCMAKE_BUILD_TYPE=Release
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
@@ -102,12 +107,13 @@ import_external_library(benchmark STATIC
# Skip testing. The tests don't compile with Clang 8.
CMAKE_ARGS -DBENCHMARK_ENABLE_TESTING=OFF)
include(FetchContent)
# setup fmt format
import_external_library(fmt STATIC
${CMAKE_CURRENT_SOURCE_DIR}/fmt/${CMAKE_INSTALL_LIBDIR}/libfmt.a
${CMAKE_CURRENT_SOURCE_DIR}/fmt/include
# Skip testing.
CMAKE_ARGS -DFMT_TEST=OFF)
FetchContent_Declare(fmt
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/fmt)
FetchContent_MakeAvailable(fmt)
# setup rapidcheck (it cannot be external, since it doesn't have install
# target)
@@ -169,9 +175,12 @@ import_external_library(bzip2 STATIC
INSTALL_COMMAND true)
# Setup zlib
set(ZLIB_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/zlib)
set(ZLIB_LIBRARIES ${ZLIB_ROOT}/lib/libz.a)
set(ZLIB_INCLUDE_DIRS ${ZLIB_ROOT}/include)
import_external_library(zlib STATIC
${CMAKE_CURRENT_SOURCE_DIR}/zlib/lib/libz.a
${CMAKE_CURRENT_SOURCE_DIR}/zlib
${ZLIB_LIBRARIES}
${ZLIB_INCLUDE_DIRS}
CMAKE_ARGS -DCMAKE_SKIP_INSTALL_ALL_DEPENDENCY=true
BUILD_COMMAND $(MAKE) zlibstatic)
@@ -203,7 +212,8 @@ import_external_library(mgclient STATIC
${CMAKE_CURRENT_SOURCE_DIR}/mgclient/include
CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DBUILD_TESTING=OFF)
-DBUILD_TESTING=OFF
-DBUILD_CPP_BINDINGS=ON)
find_package(OpenSSL REQUIRED)
target_link_libraries(mgclient INTERFACE ${OPENSSL_LIBRARIES})
@@ -216,10 +226,11 @@ add_external_project(mgconsole
add_custom_target(mgconsole DEPENDS mgconsole-proj)
# Setup spdlog
import_external_library(spdlog STATIC
${CMAKE_CURRENT_SOURCE_DIR}/spdlog/${CMAKE_INSTALL_LIBDIR}/libspdlog.a
${CMAKE_CURRENT_SOURCE_DIR}/spdlog/include
BUILD_COMMAND $(MAKE) spdlog)
set(SPDLOG_FMT_EXTERNAL ON)
FetchContent_Declare(spdlog
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/spdlog)
FetchContent_MakeAvailable(spdlog)
include(jemalloc.cmake)
@@ -230,6 +241,7 @@ import_external_library(librdkafka STATIC
CMAKE_ARGS -DRDKAFKA_BUILD_STATIC=ON
-DRDKAFKA_BUILD_EXAMPLES=OFF
-DRDKAFKA_BUILD_TESTS=OFF
-DENABLE_LZ4_EXT=OFF
-DCMAKE_INSTALL_LIBDIR=lib
-DWITH_SSL=ON
# If we want SASL, we need to install it on build machines
@@ -241,3 +253,37 @@ import_library(librdkafka++ STATIC
${CMAKE_CURRENT_SOURCE_DIR}/librdkafka/include
)
target_link_libraries(librdkafka++ INTERFACE librdkafka)
set(PROTOBUF_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/protobuf/lib)
import_external_library(protobuf STATIC
${PROTOBUF_ROOT}/lib/libprotobuf.a
${PROTOBUF_ROOT}/include
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND true)
set(BOOST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/boost/lib)
set(BOOST_ROOT ${BOOST_ROOT} PARENT_SCOPE)
import_external_library(pulsar STATIC
${CMAKE_CURRENT_SOURCE_DIR}/pulsar/pulsar-client-cpp/lib/libpulsarwithdeps.a
${CMAKE_CURRENT_SOURCE_DIR}/pulsar/install/include
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND cmake pulsar-client-cpp
-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_SOURCE_DIR}/pulsar/install
-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
-DBUILD_DYNAMIC_LIB=OFF
-DBUILD_STATIC_LIB=ON
-DBUILD_TESTS=OFF
-DLINK_STATIC=ON
-DPROTOC_PATH=${PROTOBUF_ROOT}/bin/protoc
-DBOOST_ROOT=${BOOST_ROOT}
-DCMAKE_PREFIX_PATH=${PROTOBUF_ROOT}
-DProtobuf_INCLUDE_DIRS=${PROTOBUF_ROOT}/include
-DZLIB_LIBRARIES=${ZLIB_LIBRARIES}
-DZLIB_INCLUDE_DIRS=${ZLIB_INCLUDE_DIRS}
-DBUILD_PYTHON_WRAPPER=OFF
-DBUILD_PERF_TOOLS=OFF
-DUSE_LOG4CXX=OFF
BUILD_COMMAND $(MAKE) pulsarStaticWithDeps)
add_dependencies(pulsar-proj protobuf zlib)

1520
libs/pulsar.patch Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -14,39 +14,49 @@ clone () {
local git_repo=$1
local dir_name=$2
local checkout_id=$3
shift 3
local shallow=$4
shift 4
# Clone if there's no repo.
if [[ ! -d "$dir_name" ]]; then
echo "Cloning from $git_repo"
# If the clone fails, it doesn't make sense to continue with the function
# execution but the whole script should continue executing because we might
# clone the same repo from a different source.
git clone "$git_repo" "$dir_name" || return 1
if [ "$shallow" = true ]; then
git clone --depth 1 --branch "$checkout_id" "$git_repo" "$dir_name" || return 1
else
git clone "$git_repo" "$dir_name" || return 1
fi
fi
pushd "$dir_name"
# Just fetch new commits from remote repository. Don't merge/pull them in, so
# that we don't clobber local modifications.
git fetch
# Check whether we have any local changes which need to be preserved.
local local_changes=true
if git diff --no-ext-diff --quiet && git diff --no-ext-diff --cached --quiet; then
local_changes=false
fi
# Stash regardless of local_changes, so that a user gets a message on stdout.
git stash
# Checkout the primary commit (there's no need to pull/merge).
# The checkout fail should exit this script immediately because the target
# commit is not there and that will most likely create build-time errors.
git checkout "$checkout_id" || exit 1
# Apply any optional cherry pick fixes.
while [[ $# -ne 0 ]]; do
local cherry_pick_id=$1
shift
# The cherry-pick fail should exit this script immediately because the
# target commit is not there and that will most likely create build-time
# errors.
git cherry-pick -n "$cherry_pick_id" || exit 1
done
if [ "$shallow" = false ]; then
# Stash regardless of local_changes, so that a user gets a message on stdout.
git stash
# Just fetch new commits from remote repository. Don't merge/pull them in, so
# that we don't clobber local modifications.
git fetch
# Checkout the primary commit (there's no need to pull/merge).
# The checkout fail should exit this script immediately because the target
# commit is not there and that will most likely create build-time errors.
git checkout "$checkout_id" || exit 1
# Apply any optional cherry pick fixes.
while [[ $# -ne 0 ]]; do
local cherry_pick_id=$1
shift
# The cherry-pick fail should exit this script immediately because the
# target commit is not there and that will most likely create build-time
# errors.
git cherry-pick -n "$cherry_pick_id" || exit 1
done
fi
# Reapply any local changes.
if [[ $local_changes == true ]]; then
git stash pop
@@ -70,12 +80,13 @@ repo_clone_try_double () {
secondary_url="$2"
folder_name="$3"
ref="$4"
shallow="${5:-false}"
echo "Cloning primary from $primary_url secondary from $secondary_url"
if [ -z "$primary_url" ]; then echo "Primary should not be empty." && exit 1; fi
if [ -z "$secondary_url" ]; then echo "Secondary should not be empty." && exit 1; fi
if [ -z "$folder_name" ]; then echo "Clone folder should not be empty." && exit 1; fi
if [ -z "$ref" ]; then echo "Git clone ref should not be empty." && exit 1; fi
clone "$primary_url" "$folder_name" "$ref" || clone "$secondary_url" "$folder_name" "$ref" || exit 1
clone "$primary_url" "$folder_name" "$ref" "$shallow" || clone "$secondary_url" "$folder_name" "$ref" "$shallow" || exit 1
echo ""
}
@@ -113,6 +124,9 @@ declare -A primary_urls=(
["nlohmann"]="http://$local_cache_host/file/nlohmann/json/b3e5cb7f20dcc5c806e418df34324eca60d17d4e/single_include/nlohmann/json.hpp"
["neo4j"]="http://$local_cache_host/file/neo4j-community-3.2.3-unix.tar.gz"
["librdkafka"]="http://$local_cache_host/git/librdkafka.git"
["protobuf"]="http://$local_cache_host/git/protobuf.git"
["boost"]="http://$local_cache_host/file/boost_1_77_0.tar.gz"
["pulsar"]="http://$local_cache_host/git/pulsar.git"
)
# The goal of secondary urls is to have links to the "source of truth" of
@@ -140,13 +154,16 @@ declare -A secondary_urls=(
["nlohmann"]="https://raw.githubusercontent.com/nlohmann/json/b3e5cb7f20dcc5c806e418df34324eca60d17d4e/single_include/nlohmann/json.hpp"
["neo4j"]="https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/neo4j-community-3.2.3-unix.tar.gz"
["librdkafka"]="https://github.com/edenhill/librdkafka.git"
["protobuf"]="https://github.com/protocolbuffers/protobuf.git"
["boost"]="https://boostorg.jfrog.io/artifactory/main/release/1.77.0/source/boost_1_77_0.tar.gz"
["pulsar"]="https://github.com/apache/pulsar.git"
)
# antlr
file_get_try_double "${primary_urls[antlr4-generator]}" "${secondary_urls[antlr4-generator]}"
antlr4_tag="5e5b6d35b4183fd330102c40947b95c4b5c6abb5" # v4.9.2
repo_clone_try_double "${primary_urls[antlr4-code]}" "${secondary_urls[antlr4-code]}" "antlr4" "$antlr4_tag"
antlr4_tag="4.9.2" # v4.9.2
repo_clone_try_double "${primary_urls[antlr4-code]}" "${secondary_urls[antlr4-code]}" "antlr4" "$antlr4_tag" true
# remove shared library from install dependencies
sed -i 's/install(TARGETS antlr4_shared/install(TARGETS antlr4_shared OPTIONAL/' antlr4/runtime/Cpp/runtime/CMakeLists.txt
# fix issue https://github.com/antlr/antlr4/issues/3194 - should update Antlr commit once the PR related to the issue gets merged
@@ -161,20 +178,20 @@ cppitertools_ref="cb3635456bdb531121b82b4d2e3afc7ae1f56d47"
repo_clone_try_double "${primary_urls[cppitertools]}" "${secondary_urls[cppitertools]}" "cppitertools" "$cppitertools_ref"
# fmt
fmt_tag="7bdf0628b1276379886c7f6dda2cef2b3b374f0b" # (2020-11-25)
repo_clone_try_double "${primary_urls[fmt]}" "${secondary_urls[fmt]}" "fmt" "$fmt_tag"
fmt_tag="8.0.1" # (2021-07-03)
repo_clone_try_double "${primary_urls[fmt]}" "${secondary_urls[fmt]}" "fmt" "$fmt_tag" true
# rapidcheck
rapidcheck_tag="7bc7d302191a4f3d0bf005692677126136e02f60" # (2020-05-04)
repo_clone_try_double "${primary_urls[rapidcheck]}" "${secondary_urls[rapidcheck]}" "rapidcheck" "$rapidcheck_tag"
# google benchmark
benchmark_tag="4f8bfeae470950ef005327973f15b0044eceaceb" # v1.1.0
repo_clone_try_double "${primary_urls[gbenchmark]}" "${secondary_urls[gbenchmark]}" "benchmark" "$benchmark_tag"
benchmark_tag="v1.1.0"
repo_clone_try_double "${primary_urls[gbenchmark]}" "${secondary_urls[gbenchmark]}" "benchmark" "$benchmark_tag" true
# google test
googletest_tag="ec44c6c1675c25b9827aacd08c02433cccde7780" # v1.8.0
repo_clone_try_double "${primary_urls[gtest]}" "${secondary_urls[gtest]}" "googletest" "$googletest_tag"
googletest_tag="release-1.8.0"
repo_clone_try_double "${primary_urls[gtest]}" "${secondary_urls[gtest]}" "googletest" "$googletest_tag" true
# google flags
gflags_tag="b37ceb03a0e56c9f15ce80409438a555f8a67b7c" # custom version (May 6, 2017)
@@ -201,19 +218,19 @@ cd ..
bzip2_tag="0405487e2b1de738e7f1c8afb50d19cf44e8d580" # v1.0.6 (May 26, 2011)
repo_clone_try_double "${primary_urls[bzip2]}" "${secondary_urls[bzip2]}" "bzip2" "$bzip2_tag"
zlib_tag="cacf7f1d4e3d44d871b605da3b647f07d718623f" # v1.2.11.
repo_clone_try_double "${primary_urls[zlib]}" "${secondary_urls[zlib]}" "zlib" "$zlib_tag"
zlib_tag="v1.2.11" # v1.2.11.
repo_clone_try_double "${primary_urls[zlib]}" "${secondary_urls[zlib]}" "zlib" "$zlib_tag" true
# remove shared library from install dependencies
sed -i 's/install(TARGETS zlib zlibstatic/install(TARGETS zlibstatic/g' zlib/CMakeLists.txt
rocksdb_tag="f3e33549c151f30ac4eb7c22356c6d0331f37652" # (2020-10-14)
repo_clone_try_double "${primary_urls[rocksdb]}" "${secondary_urls[rocksdb]}" "rocksdb" "$rocksdb_tag"
rocksdb_tag="v6.14.6" # (2020-10-14)
repo_clone_try_double "${primary_urls[rocksdb]}" "${secondary_urls[rocksdb]}" "rocksdb" "$rocksdb_tag" true
# remove shared library from install dependencies
sed -i 's/TARGETS ${ROCKSDB_SHARED_LIB}/TARGETS ${ROCKSDB_SHARED_LIB} OPTIONAL/' rocksdb/CMakeLists.txt
# mgclient
mgclient_tag="v1.2.0" # (2021-01-14)
repo_clone_try_double "${primary_urls[mgclient]}" "${secondary_urls[mgclient]}" "mgclient" "$mgclient_tag"
mgclient_tag="v1.3.0" # (2021-09-23)
repo_clone_try_double "${primary_urls[mgclient]}" "${secondary_urls[mgclient]}" "mgclient" "$mgclient_tag" true
sed -i 's/\${CMAKE_INSTALL_LIBDIR}/lib/' mgclient/src/CMakeLists.txt
# pymgclient
@@ -221,11 +238,11 @@ pymgclient_tag="4f85c179e56302d46a1e3e2cf43509db65f062b3" # (2021-01-15)
repo_clone_try_double "${primary_urls[pymgclient]}" "${secondary_urls[pymgclient]}" "pymgclient" "$pymgclient_tag"
# mgconsole
mgconsole_tag="01ae99bfce772e540e75c076ba03cf06c0c2ac7d" # (2021-05-26)
repo_clone_try_double "${primary_urls[mgconsole]}" "${secondary_urls[mgconsole]}" "mgconsole" "$mgconsole_tag"
mgconsole_tag="v1.1.0" # (2021-10-07)
repo_clone_try_double "${primary_urls[mgconsole]}" "${secondary_urls[mgconsole]}" "mgconsole" "$mgconsole_tag" true
spdlog_tag="46d418164dd4cd9822cf8ca62a116a3f71569241" # (2020-12-01)
repo_clone_try_double "${primary_urls[spdlog]}" "${secondary_urls[spdlog]}" "spdlog" "$spdlog_tag"
spdlog_tag="v1.9.2" # (2021-08-12)
repo_clone_try_double "${primary_urls[spdlog]}" "${secondary_urls[spdlog]}" "spdlog" "$spdlog_tag" true
jemalloc_tag="ea6b3e973b477b8061e0076bb257dbd7f3faa756" # (2021-02-11)
repo_clone_try_double "${primary_urls[jemalloc]}" "${secondary_urls[jemalloc]}" "jemalloc" "$jemalloc_tag"
@@ -248,4 +265,27 @@ popd
# librdkafka
librdkafka_tag="v1.7.0" # (2021-05-06)
repo_clone_try_double "${primary_urls[librdkafka]}" "${secondary_urls[librdkafka]}" "librdkafka" "$librdkafka_tag"
repo_clone_try_double "${primary_urls[librdkafka]}" "${secondary_urls[librdkafka]}" "librdkafka" "$librdkafka_tag" true
# protobuf
protobuf_tag="v3.12.4"
repo_clone_try_double "${primary_urls[protobuf]}" "${secondary_urls[protobuf]}" "protobuf" "$protobuf_tag" true
pushd protobuf
./autogen.sh && ./configure CC=clang CXX=clang++ --prefix=$(pwd)/lib
popd
# boost
file_get_try_double "${primary_urls[boost]}" "${secondary_urls[boost]}"
tar -xzf boost_1_77_0.tar.gz
mv boost_1_77_0 boost
pushd boost
./bootstrap.sh --prefix=$(pwd)/lib --with-libraries="system,regex" --with-toolset=clang
./b2 toolset=clang -j$(nproc) install variant=release
popd
#pulsar
pulsar_tag="v2.8.1"
repo_clone_try_double "${primary_urls[pulsar]}" "${secondary_urls[pulsar]}" "pulsar" "$pulsar_tag" true
pushd pulsar
git apply ../pulsar.patch
popd

201
licenses/APL.txt Normal file
View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

84
licenses/BSL.txt Normal file
View File

@@ -0,0 +1,84 @@
MEMGRAPH
BUSINESS SOURCE LICENSE (BSL) 1.1
PARAMETERS
LICENSOR: MEMGRAPH LTD
LICENSED WORK: MEMGRAPH COMMUNITY EDITION (MCE) version 2.0
ADDITIONAL USE GRANT: You may use the Licensed Work in accordance with the
terms of this License solely for any Authorised Purpose,
provided that you may not use the Licensed Work for any
Excluded Purpose.
“Authorised Purpose” means any of the following,
provided always that (a) you do not embed or otherwise
distribute the Licensed Work to third parties; and (b)
you do not provide third parties direct access to
operate or control the Licensed Work as a standalone
solution or service:
1. for your internal business purposes;
2. to integrate the Licensed Work with your own
proprietary software, provided that your proprietary
software adds a primary and significant functionality
to the Licensed Work (the “Integrated Solution”);
and/or
3. to host the Integrated Solution and make it available
to third parties on a software-as-a-service or an
equivalent distributed model.
“Excluded Purpose” means any of the following:
1. making the Licensed Work accessible to any third
party outside of your organization as a standalone
solution or service;
2. hosting and making the Licensed Work available to
third parties on a database-as-a-service or any
equivalent distributed model as a standalone solution or
service; and/or
3. using the Licensed Work to create a work or solution
which competes (or might reasonably be expected to
compete) with the Licensed Work.
CHANGE DATE: 2025-12-08
CHANGE LICENSE: Apache License, Version 2.0
For information about alternative licensing arrangements, please visit: https://memgraph.com/legal.
The Business Source License (this document, or the “License”) is not an
open source license. However, the Licensed Work will eventually be made
available under an open source license, as stated in this License.
TERMS
The Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production
use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use.
Effective on the Change Date, or the fourth anniversary of the first publicly available distribution of a specific
version of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the
terms of the Change License, and the rights granted in the paragraph above terminate. If your use of the Licensed Work
does not comply with the requirements currently in effect as described in thisLicense, you must purchase a commercial
license from the Licensor, its affiliated entities, or authorized resellers, or you must refrain from using the Licensed
Work. All copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to
this License. This License applies separately for each version of the Licensed Work and the Change Date may vary for
each version of the Licensed Work released by Licensor. You must conspicuously display this License on each original or
modified copy of the Licensed Work. If you receive the Licensed Work in original or modified form from a third party,
the terms and conditions set forth in this License apply to your use of that work.Any use of the Licensed Work in
violation of this License will automatically terminate your rights under this License for the current and all other
versions of the Licensed Work. This License does not grant you any right in any trademark or logo of Licensor or its
affiliates (provided that you may use a trademark or logo of Licensor as expressly required by this License).
TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS
ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE.
MariaDB hereby grants you permission to use this Licenses text to license your works, and to refer to it using the
trademark Business Source License, as long as you comply with the Covenants of Licensor below.
Covenants of Licensor
In consideration of the right to use this Licenses text and the Business Source License name and trademark, Licensor
covenants to MariaDB, and to all other recipients of the Licensed Work to be provided by Licensor:
1. To specify as the Change License the GPL Version 2.0 or any later version, or a license that is compatible with GPL
Version 2.0 or a later version, where “compatible” means that software provided under the Change License can be
included in a program with software provided under GPL Version 2.0 or a later version. Licensor may specify
additional Change Licenses without limitation.
2. To either: (a) specify an additional grant of rights to use that does not impose any additional restriction on the
right granted in this License, as the Additional Use Grant; or (b) insert the text “None”.
3. To specify a Change Date.
4. Not to modify this License in any other way.
NOTICE
License text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved. Business Source License is a trademark of MariaDB Corporation Ab.

464
licenses/MEL.txt Normal file
View File

@@ -0,0 +1,464 @@
MEMGRAPH
ENTERPRISE LICENCE AGREEMENT
Memgraph Limited is registered in England under registration 10195084 and has its registered office at Suite 4,
Ironstone House, Ironstone Way, Brixworth, Northampton, NN6 9UD (“Memgraph”).
Memgraph agrees to license and/or grant you (the “Customer”) access to the Software ( as defined below) and provide
support and services to you only if you accept and agree to be bound by the terms and conditions in this Memgraph
Enterprise Licence Agreement (the “Agreement”). By signing an Order Document (as defined below), which is subject to and
part of this Agreement, installing and using the Software or by downloading a trial version of the Software, you agree
to be bound by the terms of this Agreement.
Memgraph Enterprise Trial Users: If you receive free of charge trial access to the Software, you are deemed a
“Customer” for purposes of this Agreement, except that you are subject to the additional restrictions and limitations
set forth in Section 3.2 below in respect of your use of such Software.
1. DEFINITIONS.
1.1. “Applicable Laws” means (i) all applicable laws, statutes and regulations, and (ii) regulatory policies,
guidelines and industry codes (in each case having the force of law), which apply to the provisions of the
Software and Services and this Agreement.
1.2. “Confidential Information” means all information disclosed by a party (“Disclosing Party”) to the other party
(“Receiving Party”), whether orally or in writing, that is designated as confidential or that reasonably should
be understood to be confidential given the nature of the information and the circumstances of disclosure.
Customers Confidential Information includes Customer Data; Memgraph Confidential Information includes the
Software and Services; and Confidential Information of each party includes the terms and conditions of this
Agreement and all Orders (including pricing), as well as business and marketing plans, technology and technical
information, product plans and designs, and business processes disclosed by such party. However, Confidential
Information does not include any information that (i) is or becomes generally known to the public without
breach of any obligation owed to the Disclosing Party, (ii) was known to the Receiving Party prior to its
disclosure by the Disclosing Party without breach of any obligation owed to the Disclosing Party, (iii) is
received from a third party without breach of any obligation owed to the Disclosing Party, or (iv) was
independently developed by the Receiving Party.
1.3. “Customer Data” means business information or other data loaded by or for Customer and/or processed by the
Software.
1.4. “Data Protection Legislation” means all applicable data protection and privacy legislation in force from time
to time in the UK including the General Data Protection Regulation ((EU) 2016/679) as it forms part of UK law
by virtue of section 3 of the European Union (Withdrawal) Act 2018; the Data
Protection Act 2018; the Privacy and Electronic Communications Directive 2002/58/EC (as updated by Directive
2009/136/EC); and the Privacy and Electronic Communications Regulations 2003 (SI 2003/2426), in each case as
amended.
1.5. “Derivate Work” means any modification or enhancement made by Customer to the Software, whether in source code,
binary executable, intermediate or other form.
1.6. “Effective Date” means the date on which you execute this Agreement.
1.7. “Order Document” or “Order” means, as applicable: (i) in the case of a Trial Licence, the Memgraph trial
registration form available on Memgraphs website; or (ii) in any other case, an order form that is submitted
by or on behalf of Customer and executed by or on behalf of the parties referencing
this Agreement and that specifies the Software and/or Services ordered by Customer, as well as the specific
terms and conditions, for that particular transaction.
1.8. “Services” means those services, including Support Services, which may be provided to Customer by Memgraph
pursuant to the terms of this Agreement and are expressly limited to those services directly related to
Customers use of the Software, and expressly exclude any other services.
1.9. “Software” means Memgraphs proprietary downloadable graph database enterprise software known as Memgraph
Enterprise Edition (MEE) (“Enterprise Software”) and the associated technical documentation located at
https://docs.memgraph.com/ (“Documentation”), as well as software updates, upgrades, bug fixes, or modified
versions thereof that Memgraph licenses or provides to Customer directly or indirectly throughout the Subscription
Term. For the avoidance of doubt, for the purpose of this Agreement, the term Software excludes Memgraphs
free-to-use software known as Memgraph Community Edition (MCE) which is licensed pursuant to separate terms
(including the Business Source Licence (BSL) or Apache 2.0) as indicated here: https://memgraph.com/legal.
1.10. “Subscription Term” means the fixed term, of not less than one (1) year, designated in an Order Document
beginning on the Effective Date and ending at the end of the period stated therein. If no expiration date is
specified in an Order Document, the Subscription Term shall be a one (1) year period (“Minimum Subscription
Term”). A “Subscription” is the binding, non-cancellable contract for the use of the Software for the
Subscription Term as set forth in an Order Document.
1.11. “Support” means the support and maintenance services, including any updates, upgrades, patches, enhancements
and bug fixes for the Software that may be provided to Customer by Memgraph pursuant to the terms of this
Agreement.
1.12. “Users” means employees and Contractors of Customer that Customer has permitted or authorized to access and use
of the Software on Customers behalf pursuant to the terms of this Agreement.
2. ORDERS, DELIVERY; SUPPORT.
2.1. Delivery. Customer shall access the Software from Memgraphs website or online repository (as instructed by
Memgraph) after the Effective Date. Memgraph shall deliver to Customer the licence key necessary to unlock the
Software after Customer accepts an Order. Unless otherwise stated in an Order, Customer is solely responsible
for installing Software on Customers own computer equipment. In some instances, Customers purchasing
relationship exists solely between Customer and an authorised reseller of Memgraphs Software and Services
(a “Reseller”), in which case Sections 5.1-5.3 (Fees and Payment) will be inapplicable to such Order(s), and
the Reseller shall be responsible for submitting Orders and the appropriate payment method therewith to
Memgraph. An Order is not binding until Memgraph accepts and countersigns the Order.
2.2. Support. Memgraph will use commercially reasonable efforts to provide Support to Customer in accordance with
Memgraphs then-current terms and conditions set forth at
https://download.memgraph.com/legal/memgraph-support-terms-and-conditions.pdf at the support tier stated in the
applicable Order. The Support terms and conditions are subject to change at Memgraphs discretion; however,
Memgraph will not materially reduce the level of Support during a Subscription Term for which Fees have been
paid.
3. LICENCE GRANTS; RESTRICTIONS AND PROPRIETARY RIGHTS.
Customers licence and access rights and benefits, and Memgraphs obligations to Customer, will vary depending on the
product and the type of licence Memgraph is granting. If you purchased a licence to Memgraph Software, your licence will
be subject to certain use and/or capacity restrictions, as identified on the applicable Order Document.
3.1. Enterprise Software Licence. In consideration of the Fees paid hereunder and subject to the terms of this
Agreement and the applicable Order, Memgraph grants Customer a world-wide, non-exclusive, non-transferable,
non-sublicensable, and limited licence during the applicable Subscription Term, to download, access, install
and use the Enterprise Software up to the maximum capacity (“Licensed Capacity”), and subject to the usage
rules, specified in the applicable Order Document, and to use Documentation solely for Customers internal
business purposes in connection with the operation of the Enterprise Software.
3.2. Enterprise Trial Licence. If the Customer downloads, accesses, installs or uses the Software under a trial
licence (“Trial Licence”), then Customer may use one (1) copy of the Software in accordance with the terms and
conditions of this Agreement for a thirty (30) day period, or such longer trial period represented by the
applicable licence key issued by or expressly authorised by Memgraph (the “Trial Period”). Trial Licences are
permitted solely for Customers evaluation use to determine whether to purchase a Subscription to the Software.
Customer may not use a Trial Licence for any other purpose. At the end of the Trial Period, the Trial Licence
will expire and this Agreement will terminate as to such Trial Licence and continue to apply to any subsequent
Subscription or use of the Software. If Customer decides not to obtain a Subscription upon expiration of the
Trial Period, it will promptly cease using and will delete the Software from its computer systems. Memgraph has
the right to terminate a Trial Licence at any time for any reason.
3.3. Limited right to modify the Software. In consideration of the Fees paid hereunder and subject to the terms of
this Agreement and the applicable Order, Memgraph grants Customer a licence to: (i) create, compile and test
Derivative Works; (ii) use Derivative Works solely for Customers internal business purposes; and (iii)
distribute Derivative Works back to Memgraph for potential incorporation into Memgraphs maintained code base
at its sole discretion.
3.4. NO OBLIGATIONS. NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT OR IN ANY ORDER DOCUMENT, MEMGRAPH
WILL HAVE NO WARRANTY, INDEMNITY, SUPPORT, OR SERVICE LEVEL, OBLIGATIONS WITH RESPECT TO ANY ENTERPRISE TRIAL,
OR OTHER NO-CHARGE SOFTWARE (INCLUDING TOOLS AND UTILITIES) LICENCES.
3.5. General Restrictions. Customer acknowledges that the Software, and its structure, organization, and source code,
constitute Memgraphs and its suppliers valuable trade secrets, and that usage of the Software is subject to
the following restrictions:
3.5.1. Restrictions. Customer agrees not to, and not to authorize any third party to: (i) allow access or use
of the Software by anyone other than its Users; (ii) distribute, embed, sell, rent, transfer, lease,
lend, sublicense, loan, assign, pledge, grant a security interest in, or otherwise make the Software
accessible or available to any third party; except to the limited extent expressly provided in Section
3.5.2, use the Software in any service-bureau, timesharing, outsourcing or similar arrangement; (iii)
subject only to the limited rights set out in Section 3.3, modify, adapt, transform, derive, disassemble,
decompile, reverse engineer or otherwise attempt to derive the structure, sequence or organization of,
the Software or any portion thereof; (iv) remove or alter product identification, copyright, trademark or
other proprietary markings contained in or on the Software; (v) conduct any competitive analysis, publish
or share with any third party any results of any technical evaluation or tests performed on the Software,
or disclose Software features, errors or bugs to a third party without Memgraphs prior written consent;
or (vi) engage in any act designed to circumvent any restriction set forth in this Agreement, in the
Software, or in an Order, including but not limited to restrictions related to Licensed Capacity.
3.5.2. Internal Use Licences; Users. The Software is licensed for Customers internal business use and not for
distribution or use by third parties. For clarity, however, Customer may make available to third parties
any Customer-hosted services or other Customer applications or services that make use of or incorporate
the Software, provided and solely to the extent that (i) Customers application or hosted service adds
primary and significant functionality to the Software, (ii) Customer does not embed or otherwise
distribute the Software to third parties (iii) Customer does not provide third parties direct access to
operate or control the Software itself; and (iv) Customer at all times remains in compliance with the
terms of the applicable licence grants under this Agreement. Subject to the terms and conditions of this
Agreement, in addition to Customers employees, Customer may permit its independent contractors and
consultants (“Contractors”) to serve as Users. Customer will remain responsible for compliance by each of
its Users (including but not limited to any Contractor Users) with all of the terms and conditions of
this Agreement, and any use of the Software by any Contractors must be for the sole benefit of Customer.
3.6. Ownership; Reservation of Rights. This is an agreement for use of Memgraph Software and not an agreement for
sale. Customer acknowledges that it is obtaining only a limited right to use the Software on a licensed basis,
and that irrespective of any use of the words “purchase”, “sale” or like terms hereunder no ownership rights
are being conveyed to Customer. Customer agrees that Memgraph or its suppliers retain all right, title and
interest (including all patent, copyright, trade secret and other intellectual property rights) in and to the
Memgraph Software. Nothing in this Section shall be deemed as granting Memgraph ownership of Customer Data or
in any way impacting Customers ownership of Customer Data.
3.7. Third Party Code. The Software may contain or be provided with components which are licensed from third
parties, including components subject to the terms and conditions of “open source” software licences
(“Open Source Software”). Open Source Software may be identified in the Software, Documentation, or in a list
of the Open Source Software provided to you upon your written request. To the extent required by the licence
that accompanies the Open Source Software, the terms of such licence will apply in lieu of the terms of this
Agreement with respect to such Open Source Software, including, without limitation, any provisions governing
access to source code, modification, or reverse engineering.
3.8. IP Ownership. The Parties agree that, save as otherwise provided in this Agreement, neither party shall gain, by
virtue of this Agreement, any rights of ownership or any other interest, right or title of copyrights, patents,
trade secrets, trademarks, or any other intellectual property rights owned by the other Party. Any and all new
works developed in the course of performing obligations pursuant to this Agreement and all new inventions,
innovations or ideas developed by a Party in the course of performance of its activities under this Agreement,
will belong to that Party who develops the same. Notwithstanding anything to the contrary in this Section, the
Parties understand and agree that any and all proprietary materials developed by a Party prior to this
Agreement and any modifications, enhancements, improvements or inventions made to such proprietary materials
shall be owned by that Party, regardless of which Party prepared or developed such modifications, enhancements,
improvements or inventions.
3.9. License-back of Derivate Works. If Customer elects, at its sole discretion, to distribute Derivative Works
back to Memgraph for potential incorporation into Memgraphs maintained code base, Customer grants Memgraph
(without any restrictions, limitations or requirement of remuneration) a worldwide, non-exclusive, fully
paid-up, royalty-free, perpetual, irrevocable, transferable and sublicensable licence to use, exploit, modify,
make derivative works of, commercialise, distribute and otherwise exploit such Derivative Works.
4. CUSTOMER DATA; OBLIGATIONS OF CUSTOMER AND MEMGRAPH.
4.1. Customer shall retain all of its rights, title, and interest in and to its intellectual property rights in
Customer Data. Customer grants to Memgraph a non-exclusive, worldwide, limited-term licence solely to host,
copy, transmit and display Customer Data as reasonably necessary for Memgraph to support Customers use of the
Software, to ensure the security of and to administrate the Software, and to deliver Services in accordance
with this Agreement or as otherwise outlined in https://memgraph.com/legal/privacy-policy/.
4.2. Protection of Customer Data. Memgraph will maintain appropriate administrative, physical, and technical
safeguards, consistent with generally prevailing industry standards, for protection of the security,
confidentiality, and integrity of Customer Data, as described in the Documentation. Those safeguards will
include, but will not be limited to, measures for preventing access, use, modification, or disclosure of
Customer Data by Memgraph personnel, except as permitted by this Agreement.
4.3. Personal data. Both parties will comply with all applicable requirements of the Data Protection Legislation.
This section 4.3 is in addition to, and does not relieve, remove or replace, a partys obligations under the
Data Protection Legislation. Notwithstanding the foregoing, the parties acknowledge that, in the ordinary
course of providing the Services, Memgraph shall not process personal data (as defined in the Data Protection
Legislation) on behalf of the Customer. In the event that the Customer requires Memgraph to process personal
data on its behalf, it shall notify Memgraph and the parties shall execute such additional terms as necessary
to comply with applicable Data Protection Legislation.
5. FEES AND PAYMENT.
5.1. Fees. Customer will pay Memgraph the fees for the Licences and Services as set forth in the applicable Order (
“Fees”). Customer acknowledges and agrees that if Customers use of the Software exceeds the Licensed Capacity
set forth on the applicable Orders or otherwise requires the payment of additional fees (per the terms of this
Agreement), Customer shall be invoiced for such usage and Customer agrees to pay the additional fees in
accordance with this Section. Notwithstanding the terms of Section 5.4 below (Reconciliation), Customer
acknowledges and agrees that it is obligated to ensure that its Software usage does not exceed the Licensed Capacity
and to promptly notify Memgraph of any such excess usage no more than thirty (30) days from the last day of the
calendar month during which such excess usage occurred.
5.2. Payment Terms. Except as otherwise specifically set forth on an Order Document, all fees are due and payable
within thirty days after the date of invoice. Renewal Fees for any renewal Subscription Term (if purchased by
Customer) will be due and payable within thirty (30) days of expiration of the then-current term. If Fees are
not paid when due, or in the event of other breach of this Agreement, Customer shall discontinue use of the
Software and Memgraph may suspend its performance, including its delivery of technical support of the Software
or other Services without further notice and without penalty. All Orders (including multi-year Subscriptions
with annual payment schedules) are non-cancellable and all amounts paid are non-refundable, unless otherwise
expressly set forth herein. Any invoiced amount not received by the due date will accrue late interest at the
rate of 1.5% of the outstanding balance per month, or the maximum rate permitted by applicable law, whichever
is lower.
5.3. Taxes. Fees are exclusive of taxes. Customer will pay any sales, use, value added, duties, fees and other
governmental assessments or charges arising out of this Agreement and the transactions contemplated herein.
Customer will make all payments free and clear of, and without reduction for, any withholding taxes.
5.4. Reconciliation. At Memgraphs request from time to time, not exceeding once per quarter, Customer will provide
Memgraph with a report detailing its use of the Software, including its non-production and/or production use
and using the self-monitoring capabilities of the Software or other means, and Memgraph may inspect Customers
records related to such report not more frequently than annually to ensure payment of Fees. Any on-site review
will be conducted during regular business hours at Customers offices. The parties will use reasonable efforts
to promptly resolve any discrepancies between licensed usage and actual usage.
6. APPLICABLE LAWS.
6.1. Each Party shall perform this Agreement in accordance with all Applicable Laws. Without prejudice to the
foregoing, each Party shall:
6.1.1. comply with all Applicable Laws relating to anti-bribery, anti-corruption, anti-slavery and human
trafficking, including the Bribery Act 2010 and the Modern Slavery Act 2015
(the “Relevant Requirements”);
6.1.2. have and maintain in place throughout the Term its own policies and procedures, including adequate
procedures under the Bribery Act 2010, to ensure compliance with the Relevant Requirements, and will
enforce them where appropriate;
6.1.3. (if not prohibited by law or regulation from doing so) promptly report to the other Party any request or
demand for any undue financial or other advantage of any kind received by the reporting Party in
connection with the performance of this Agreement; and
6.1.4. (if not prohibited by law or regulation from doing so) notify the other Party (and email shall be
sufficient for this purpose) as soon as it becomes aware of any actual or suspected slavery or human
trafficking in a supply chain which has a connection with this Agreement.
7. REPRESENTATIONS AND WARRANTIES.
7.1. Mutual Representations and Warranties. Each Party represents and warrants to the other that: (i) it is a
corporation lawfully incorporated and validly existing pursuant to the laws of its place of incorporation;
(ii) it has all requisite power and authority, corporate or otherwise, to execute, deliver and perform its
obligations under this Agreement; and (iii) this Agreement constitutes its legal, valid and binding obligations
and may be enforced against it.
7.2. Limited Memgraph Warranty. Memgraph warrants that the Software, when used as permitted hereunder and in
accordance with the applicable Documentation, will operate in all material respects as described in the
applicable Documentation, and that the Services will be provided in a professional manner consistent with
industry standards.
7.3. Limitations; Remedy. Memgraph does not warrant that the Software or the Services will be error-free,
uninterrupted or meet Customers specific requirements or that performance of the Services will be
uninterrupted. Memgraph will have no warranty obligation under Section 7.2 for Customers misuse or failure to
use the Software in accordance with its Documentation or this Agreement. Customers sole and exclusive remedy,
and Memgraphs sole and exclusive obligation, for breach of warranty will be (i) during the thirty (30) day
period following initial Delivery of the Software under an Order, Memgraphs correction of the program errors
that cause the breach of warranty, or if Memgraph cannot substantially correct such breach in a commercially
reasonable manner, a refund of the fees paid for the nonconforming Software (ii) during the remainder of the
relevant Subscription Term, Memgraphs delivery of Support with respect to any such program errors. In the
event of a refund remedy, Customers licences and right to use the Software or receive Services will end. In
the event of any noticed breach of warranty with respect to Services, Memgraphs sole and exclusive obligation
shall be the re-performance of the deficient Services.
7.4. Disclaimer. THIS SECTION 7 IS A LIMITED WARRANTY AND, EXCEPT EXPRESSLY AS SET FORTH IN SECTION 7.2,
THE SOFTWARE, INCLUDING WITHOUT LIMITATION THE THIRD-PARTY CODE, AND ALL SERVICES ARE PROVIDED “AS IS”.
MEMGRAPH MAKES NO OTHER WARRANTIES OR REPRESENTATIONS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, AND DISCLAIMS
ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.
8. INDEMNIFICATION.
8.1. By Memgraph. Memgraph will defend against any action against Customer brought by a third party to the extent the
action is based on a claim that the Software infringes a third partys patent, copyright or trademark
(a “Claim”) and indemnify Customer from the damages, liabilities, costs and expenses (including reasonable
attorneys fees) awarded against Customer or agreed in settlement by Customer resulting from such Claim. If
your use of the Software is (or in Memgraphs opinion likely to be) enjoined, then Memgraph may, at its own
expense and at its option: (i) substitute substantially similar functionality for the Software which renders
it non-infringing; (ii) procure for Customer the right to continue to use the Software; or if (i) and (ii) are
not commercially reasonable, terminate this Agreement and refund Customer any prepaid, unused (pro-rated) Fees
for the duration of the then-current Subscription Term. The foregoing obligations of Memgraph will not apply:
(i) if the Software is modified by any party other than Memgraph, but solely to the extent the alleged
infringement is caused by such modification; (ii) if the Software is used in combination with other products or
processes not provided or authorized by Memgraph, but solely to the extent the alleged infringement is caused
by such combination; (iii) use of any version or release of Software other than the most current version or
release made available to Customer by Memgraph, if its use would have avoided the infringement; (iv) any
unauthorized use of the Software. THIS SECTION 8.1 SETS FORTH MEMGRAPHS SOLE LIABILITY AND CUSTOMERS SOLE
AND EXCLUSIVE REMEDY WITH RESPECT TO ANY CLAIM OF INTELLECTUAL PROPERTY INFRINGEMENT.
8.2. By Customer. Customer will indemnify and hold Memgraph and its suppliers harmless against any claims,
liabilities, costs, and expenses (including reasonable attorneys fees) that Memgraph or its suppliers may
incur as a result of a third-party claim arising from or related to Customer Data, or misuse or unauthorised
use of the Software by Customer or any User.
8.3. Conditions. All defence and indemnity obligations under Sections 8.1 and 8.2 are conditioned on the indemnitee
(i) giving the indemnitor written notice of the relevant claim within thirty (30) days after the indemnitee
receives notice of the Claim (or sooner if required by applicable law); (ii) reasonably cooperating with the
indemnitor, at the indemnitors expense, in the defence of the claim; and (iii) giving the indemnitor sole
control of the defence and any settlement negotiations. The indemnitee may participate in the defence at its
expense.
9. LIMITATION OF LIABILITY.
9.1. TO THE EXTENT PERMITTED BY LAW, NEITHER MEMGRAPH NOR CUSTOMER SHALL BE LIABLE TO THE OTHER OR ANY THIRD PARTY
FOR LOST PROFITS (WHETHER DIRECT OR INDIRECT) OR LOSS OF USE OR DATA, SUBSTITUTE GOODS OR SERVICES, OR FOR
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, SPECIAL OR EXEMPLARY DAMAGES (INCLUDING DAMAGE TO BUSINESS, REPUTATION OR
GOODWILL), OR INDIRECT DAMAGES OF ANY TYPE HOWEVER CAUSED, WHETHER BY BREACH OF WARRANTY, BREACH OF CONTRACT,
IN TORT (INCLUDING NEGLIGENCE) OR ANY OTHER LEGAL OR EQUITABLE CAUSE OF ACTION EVEN IF SUCH PARTY HAS BEEN
ADVISED OF SUCH DAMAGES IN ADVANCE OR IF SUCH DAMAGES WERE FORESEEABLE.
9.2. LIMITATIONS ON DIRECT DAMAGES. EXCEPT FOR ANY EXCLUDED CLAIMS AND ANY DAMAGES THAT CANNOT BE LIMITED UNDER
APPLICABLE LAW, IN NO EVENT WILL MEMGRAPHS TOTAL AGGREGATE LIABILITY ARISING FROM OR RELATED TO THIS
AGREEMENT, EXCEED AN AMOUNT EQUAL TO THE TOTAL AMOUNT OF FEES PAID OR PAYABLE BY CUSTOMER TO MEMGRAPH UNDER
THIS AGREEMENT DURING THE TWELVE MONTHS PRECEDING THE CLAIM. THE FOREGOING LIMITATIONS SHALL NOT APPLY TO: (i)
PAYMENTS TO A THIRD PARTY ARISING FROM A PARTYS OBLIGATIONS UNDER SECTION 8 (INDEMNIFICATION); (ii) BREACH BY
A PARTY OF SECTION 10 (CONFIDENTIAL INFORMATION), AND (iii) INFRINGEMENT BY A PARTY OF THE OTHER PARTYS
INTELLECTUAL PROPERTY RIGHTS (COLLECTIVELY EXCLUSIONS (i)-(iii) ARE REFERRED TO AS THE “EXCLUDED CLAIMS”). WITH
RESPECT TO ANY EXCLUDED CLAIMS, MEMGRAPHS TOTAL AGGREGATE LIABILITY SHALL IN NO EVENT EXCEED £1,000,000.
9.3. Nothing in this Agreement excludes the liability of Memgraph for death or personal injury caused by the
Suppliers negligence; or for fraud or fraudulent misrepresentation.
10. CONFIDENTIALITY.
10.1. The Receiving Party will use the same degree of care that it uses to protect the confidentiality of its own
confidential information of like kind (but not less than reasonable care) to (i) not use any confidential
information of the Disclosing Party for any purpose outside the scope of this agreement and (ii) except as
otherwise authorized by the Disclosing Party in writing, limit access to confidential information of the
Disclosing Party to those of its and its affiliates employees and contractors who need that access for
purposes consistent with this agreement and who have signed confidentiality agreements with the receiving party
containing protections not materially less protective of the confidential information than those herein.
Neither party will disclose the terms of this agreement or any Orders to any third-party other than its
affiliates, legal counsel, and accountants without the other partys prior written consent, provided that a
party that makes any such disclosure to its affiliate, legal counsel or accountants will remain responsible for
such affiliates, legal counsels, or accountants compliance with this “Confidentiality” section.
10.2. Compelled Disclosure. The Receiving Party may disclose confidential information of the Disclosing Party to the
extent compelled by law to do so, provided the Receiving Party gives the Disclosing Party prior notice of the
compelled disclosure (to the extent legally permitted) and reasonable assistance, at the Disclosing Partys
cost, if the Disclosing Party wishes to contest the disclosure. If the receiving party is compelled by law to
disclose the Disclosing Partys confidential information as part of a civil proceeding to which the Disclosing
Party is a party, and the Disclosing Party is not contesting the disclosure, the Disclosing Party will
reimburse the Receiving Party for its reasonable cost of complying and providing secure access to that
confidential information.
11. TERMINATION.
11.1. Term. The term (“Term”) of this Agreement will commence on the Effective Date and continue until all
Subscriptions, licence terms and Orders expire, unless earlier terminated in accordance with this Section 11.
11.2. Termination for Cause. In the event of a material breach of this Agreement (excluding any breaches for which an
exclusive remedy is expressly provided), the non-breaching party may terminate this Agreement if such breach
is not cured within thirty (30) days after written notice thereof (except that for a breach of Section 3.5
(“General Restrictions”), there will be no cure period). For clarity, material breach of this Agreement
includes, but is not limited to, failure to timely pay amounts due hereunder, exceeding the scope of any
Licence granted hereunder (including the Licensed Capacity), violating the Licence restrictions, breach of
Section 6.1 and failing to protect the other partys Confidential Information.
11.3. Without affecting any other right or remedy available to it, and to the fullest extent permitted by applicable
law, either party may terminate this Agreement with immediate effect by giving written notice to the other
party if the other party:
11.3.1. suspends, or threatens to suspend, payment of its debts or is unable to pay its debts as they fall due or
admits inability to pay its debts or is deemed unable to pay its debts within the meaning of section 123
of the Insolvency Act 1986, as if the words “it is proved to the satisfaction of the court” did not
appear in sections 123(1)(e) or 123(2) of the Insolvency Act 1986; or
11.3.2. the other party commences negotiations with all or any class of its creditors with a view to rescheduling
any of its debts, or makes a proposal for or enters into any compromise or arrangement with its creditors
other than for the sole purpose of a scheme for a solvent amalgamation of that other party with one or
more other companies or the solvent reconstruction of that other party; or
11.3.3. a petition is filed, a notice is given, a resolution is passed, or an order is made, for or in connection
with the winding up of that other party other than for the sole purpose of a scheme for a solvent
amalgamation of that other party with one or more other companies or the solvent reconstruction of that
other party; or
11.3.4. an application is made to court, or an order is made, for the appointment of an administrator, or if a
notice of intention to appoint an administrator is given or if an administrator is appointed, over the
other party; or
11.3.5. the holder of a qualifying floating charge over the assets of that other party has become entitled to
appoint or has appointed an administrative receiver; or
11.3.6. a person becomes entitled to appoint a receiver over the assets of the other party or a receiver is
appointed over the assets of the other party; or
11.3.7. a creditor or encumbrancer of the other party attaches or takes possession of, or a distress, execution,
sequestration or other such process is levied or enforced on or sued against, the whole or any part of
the other partys assets and such attachment or process is not discharged within 30 days; or
11.3.8. any event occurs, or proceeding is taken, with respect to the other party in any jurisdiction to which
it is subject that has an effect equivalent or similar to any of the events mentioned in clause 11.3.1 to
clause 11.3.7 (inclusive); or
11.3.9. the other party suspends or ceases, or threatens to suspend or cease, carrying on all or a substantial
part of its business.
11.4. Effect of Termination. Upon the termination of this Agreement: (i) all licences will terminate; (ii) Customer
will immediately discontinue all use of the affected Software and erase all other tangible embodiments of
Memgraph Confidential Information in Customers possession or control, and promptly certify the same to
Memgraph; (iii) Memgraph may immediately cease providing the Services; (iv) (subject to this Section),
Memgraph will return or delete all tangible embodiments of Customer Confidential Information in Memgraphs
possession or control; and (v) Sections 1 (“Definitions”), 3.5 (“General Restrictions”), 3.6 (“Ownership;
Reservation of Rights”), 5 (“Fees and Payment”), 7.3 (“Limitations”), 7.4 (“Disclaimer”), 8
(“Indemnification”), 9 (“Limitation of Liability”), 10 (“Confidentiality”), 11.4 (“Effect of Termination”),
and 12 (“Miscellaneous”) will survive. If a partys file retention policies or a valid legal order provides
for backup or archival copies of files to be retained, such party will notify the other party of such policy
or order, protect the other partys Confidential Information as required hereunder, and permanently erase,
delete, or destroy such Confidential Information as soon as permissible under such policy or order.
12. MISCELLANEOUS.
12.1. Assignment. This Agreement will bind and inure to the benefit of each partys permitted successors and assigns.
Memgraph may assign this Agreement to any affiliate or in connection with a merger, reorganization,
acquisition, or other transfer of all or substantially all of Memgraphs assets or voting securities. Customer
may not assign or transfer this Agreement, in whole or in part, without Memgraphs written consent except that
Customer may assign its rights and obligations under this Agreement, in whole but not in part, without
Memgraphs written consent in connection with any merger, consolidation, sale of all or substantially all of
Customers assets or voting stock, or any other similar transaction provided that: (i) the assignee is not a
direct competitor of Memgraph; (ii) Customer provides prompt written notice of such assignment to Memgraph;
(iii) the assignee is capable of fully performing Customers obligations under this Agreement; and (iv) the
assignee agrees to be bound by the terms and conditions of this Agreement. Any attempt to transfer or assign
this Agreement without such written consent will be null and void.Force Majeure. Memgraph shall have no
liability to the Customer under this Agreement if it is prevented from or delayed in performing its obligations
under this Agreement, or from carrying on its business, by acts, events, omissions or accidents beyond its
reasonable control, including strikes, lock-outs or other industrial disputes (whether involving the workforce
of Memgraph or any other party), failure of a utility service or transport or telecommunications network, act
of God, war, pandemic, riot, civil commotion, malicious damage, compliance with any law or governmental order,
rule, regulation or direction, accident, breakdown of plant or machinery, fire, flood, storm or default of
suppliers or subcontractors, provided that the Customer is notified of such an event and its expected duration.
12.2. Governing Law. This Agreement and any dispute or claim arising out of or in connection with it or its subject
matter or formation (including non-contractual disputes or claims) shall be governed by and construed in
accordance with the law of England and Wales.
12.3. Jurisdiction. Each party irrevocably agrees that the courts of England and Wales shall have exclusive
jurisdiction to settle any dispute or claim arising out of or in connection with this Agreement or its subject
matter or formation (including non-contractual disputes or claims).
12.4. Severability; Waiver; Construction. If a court of competent jurisdiction adjudges any provision of this
Agreement to be invalid or unenforceable, the remaining provisions of this Agreement, if capable of substantial
performance, will continue in full force and effect without being impaired or invalidated in any way. The
parties agree to replace any invalid provision with a valid provision that most closely approximates the intent
and economic effect of the invalid provision. All waivers must be in writing. A partys consent to, or waiver
of, enforcement of this Agreement on one occasion will not be deemed a waiver of any other provision or such
provision on any other occasion. In this Agreement, the word “including” means “including but not limited to.”
No presumption will operate in favour of or against any party as a result of its role in drafting this
Agreement.
12.5. Subcontractors. Memgraph may use the services of subcontractors in connection with its performance of this
Agreement, provided that Memgraph remains solely responsible for (i) compliance of any such subcontractor with
the terms of this Agreement and (ii) the overall performance of Memgraph as required under this Agreement.
12.6. Use of Aggregate Data. Customer agrees that Memgraph may collect, use and disclose quantitative data and
metadata derived from the use of the Software (i) for its own internal, statistical analysis, (ii) to develop
and improve the Software and (iii) to create and distribute reports and other materials regarding use of the
Software. For clarity, any such data collected, used, and disclosed will be in anonymized aggregate form only
and shall not identify Customer or its Users, or disclose any Customer Data.Independent Contractors. The
parties are independent contractors. No agency, partnership, franchise, joint venture, or employment
relationship is intended or created by this Agreement. Neither party has the power or authority to create or
assume any obligation, or make any representations or warranties, on behalf of the other party.
12.7. Publicity. Memgraph may, in conformity with Customers trademark usage guidelines, use Customers name and logo
in Memgraphs sales and marketing materials, including in business presentations, Customer lists, and on
websites. Neither party will issue a press release regarding this Agreement without the other partys prior
written consent. Neither party will disclose the terms of this Agreement to any third party, except as required
by law.
12.8. Notice. Any notice, consent, or waiver hereunder must be in writing, addressed to the attention of “Legal
Department” at the address set forth above, and delivered by personal delivery, reputable rapid courier, or
certified/registered mail, return receipt requested, and will be deemed given upon personal delivery, one (1)
day after deposit with an overnight domestic courier, two (2) days after deposit with an international courier,
or five (5) days after deposit in the certified or registered mail. A party may specify a new address by
providing notice to the other party in accordance with this Section.
12.9. Compliance with Law. Each party will comply with all applicable laws, regulations, and orders of any
governmental authority of competent jurisdiction in its performance under this Agreement, including but not
limited to those applicable to data collection and the privacy and security of personal information, including
trans-border data transfers and data breach notification requirements as required of each party by law.
12.10.Supremacy; Modification. This Agreement will prevail over any written instrument submitted by Customer; the
terms of any purchase order, acknowledgement, or similar document submitted by Customer to Memgraph will have
no effect. If the express terms of an Order Document conflict with this Agreement, the terms on the Order
Document will prevail, but only with respect to that Order Document. This Agreement cannot be varied or
supplemented by course of dealing or by usage of trade. All modifications or amendments to this Agreement must
be in writing and signed by both parties, except that subsequent renewals and purchases of additional Licensed
Capacity can be procured by payment against an issued invoice as set forth in Section 5 (“Fees and Payment”)
above.
12.11.No Third Party Beneficiaries. This Agreement is not intended and shall not be construed to give any third party
any interest or rights with respect to or in connection with any agreement or provision herein, except as
expressly provided for in this Agreement.
12.12.Entire Agreement. This Agreement in its original English text, sets forth the complete, exclusive, and final
agreement of the parties concerning the subject matter hereof, supersedes, replaces, and merges all prior and
contemporaneous agreements, communications, and understandings, both
written and oral, between them concerning the subject matter hereof. This Agreement may be executed in
counterparts.

View File

@@ -16,7 +16,7 @@
// CALL example.procedure(1, 2) YIELD args, result;
// CALL example.procedure(1) YIELD args, result;
// Naturally, you may pass in different arguments or yield less fields.
static void procedure(const struct mgp_list *args, const struct mgp_graph *graph, struct mgp_result *result,
static void procedure(struct mgp_list *args, struct mgp_graph *graph, struct mgp_result *result,
struct mgp_memory *memory) {
size_t args_size = 0;
if (mgp_list_size(args, &args_size) != MGP_ERROR_NO_ERROR) {
@@ -27,7 +27,7 @@ static void procedure(const struct mgp_list *args, const struct mgp_graph *graph
goto error_something_went_wrong;
}
for (size_t i = 0; i < args_size; ++i) {
const struct mgp_value *value = NULL;
struct mgp_value *value = NULL;
if (mgp_list_at(args, i, &value) != MGP_ERROR_NO_ERROR) {
goto error_free_list;
}
@@ -65,22 +65,20 @@ static void procedure(const struct mgp_list *args, const struct mgp_graph *graph
error_free_list:
mgp_list_destroy(args_copy);
error_something_went_wrong:
// Best effort. If it fails, there is nothing we can do.
mgp_result_set_error_msg(result, "Something went wrong!");
return;
}
// Each module needs to define mgp_init_module function.
// Here you can register multiple procedures your module supports.
int mgp_init_module(struct mgp_module *module, struct mgp_memory *memory) {
int add_read_procedure(struct mgp_module *module, struct mgp_memory *memory) {
struct mgp_proc *proc = NULL;
if (mgp_module_add_read_procedure(module, "procedure", procedure, &proc) != MGP_ERROR_NO_ERROR) {
return 1;
}
const struct mgp_type *any_type = NULL;
struct mgp_type *any_type = NULL;
if (mgp_type_any(&any_type) != MGP_ERROR_NO_ERROR) {
return 1;
}
const struct mgp_type *nullable_any_type = NULL;
struct mgp_type *nullable_any_type = NULL;
if (mgp_type_nullable(any_type, &nullable_any_type) != MGP_ERROR_NO_ERROR) {
return 1;
}
@@ -97,14 +95,14 @@ int mgp_init_module(struct mgp_module *module, struct mgp_memory *memory) {
return 1;
}
mgp_value_destroy(null_value);
const struct mgp_type *string = NULL;
struct mgp_type *string = NULL;
if (mgp_type_string(&string) != MGP_ERROR_NO_ERROR) {
return 1;
}
if (mgp_proc_add_result(proc, "result", string) != MGP_ERROR_NO_ERROR) {
return 1;
}
const struct mgp_type *list_of_anything = NULL;
struct mgp_type *list_of_anything = NULL;
if (mgp_type_list(nullable_any_type, &list_of_anything) != MGP_ERROR_NO_ERROR) {
return 1;
}
@@ -114,6 +112,101 @@ int mgp_init_module(struct mgp_module *module, struct mgp_memory *memory) {
return 0;
}
// This example procedure returns one field called `created_vertex`
// which contains the newly created vertex.
// In case of memory errors, this function will report them and finish
// executing.
//
// The procedure can be invoked in openCypher using the following call:
// CALL example.write_procedure("property value") YIELD created_vertex;
static void write_procedure(struct mgp_list *args, struct mgp_graph *graph, struct mgp_result *result,
struct mgp_memory *memory) {
size_t args_size = 0;
if (mgp_list_size(args, &args_size) != MGP_ERROR_NO_ERROR) {
goto error_something_went_wrong;
}
if (args_size != 1) {
mgp_result_set_error_msg(result, "The procedure requires exactly one argument!");
return;
}
struct mgp_value *arg = NULL;
if (mgp_list_at(args, 0, &arg) != MGP_ERROR_NO_ERROR) {
goto error_something_went_wrong;
}
struct mgp_vertex *vertex = NULL;
if (mgp_graph_create_vertex(graph, memory, &vertex) != MGP_ERROR_NO_ERROR) {
goto error_something_went_wrong;
}
if (mgp_vertex_set_property(vertex, "new_property", arg) != MGP_ERROR_NO_ERROR) {
goto error_destroy_vertex;
}
struct mgp_value *vertex_value = NULL;
if (mgp_value_make_vertex(vertex, &vertex_value) != MGP_ERROR_NO_ERROR) {
goto error_destroy_vertex;
}
struct mgp_result_record *record = NULL;
if (mgp_result_new_record(result, &record) != MGP_ERROR_NO_ERROR) {
goto error_destroy_vertex_value;
}
if (mgp_result_record_insert(record, "created_vertex", vertex_value) != MGP_ERROR_NO_ERROR) {
goto error_destroy_vertex_value;
}
mgp_value_destroy(vertex_value);
return;
error_destroy_vertex:
mgp_vertex_destroy(vertex);
goto error_something_went_wrong;
error_destroy_vertex_value:
mgp_value_destroy(vertex_value);
error_something_went_wrong:
// Best effort. If it fails, there is nothing we can do.
mgp_result_set_error_msg(result, "Something went wrong!");
}
int add_write_procedure(struct mgp_module *module, struct mgp_memory *memory) {
struct mgp_proc *proc = NULL;
if (mgp_module_add_write_procedure(module, "write_procedure", write_procedure, &proc) != MGP_ERROR_NO_ERROR) {
return 1;
}
struct mgp_type *string_type = NULL;
if (mgp_type_string(&string_type) != MGP_ERROR_NO_ERROR) {
return 1;
}
if (mgp_proc_add_arg(proc, "required_arg", string_type) != MGP_ERROR_NO_ERROR) {
return 1;
}
struct mgp_type *node_type = NULL;
if (mgp_type_node(&node_type) != MGP_ERROR_NO_ERROR) {
return 1;
}
if (mgp_proc_add_result(proc, "created_vertex", node_type) != MGP_ERROR_NO_ERROR) {
return 1;
}
return 0;
}
// Each module needs to define mgp_init_module function.
// Here you can register multiple procedures your module supports.
int mgp_init_module(struct mgp_module *module, struct mgp_memory *memory) {
if (add_read_procedure(module, memory) != 0) {
return -1;
}
if (add_write_procedure(module, memory) != 0) {
return -1;
}
return 0;
}
// This is an optional function if you need to release any resources before the
// module is unloaded. You will probably need this if you acquired some
// resources in mgp_init_module.

View File

@@ -14,7 +14,7 @@ def procedure(context: mgp.ProcCtx,
vertex_count=int,
avg_degree=mgp.Number,
props=mgp.Nullable[mgp.Map]):
'''
"""
This example procedure returns 4 fields.
* `args` is a copy of arguments passed to the procedure.
@@ -31,7 +31,7 @@ def procedure(context: mgp.ProcCtx,
MATCH (n) CALL example.procedure(n, 1) YIELD * RETURN *;
Naturally, you may pass in different arguments or yield different fields.
'''
"""
# Create a properties map if we received an Edge, Vertex, or Path instance.
props = None
if isinstance(required_arg, (mgp.Edge, mgp.Vertex)):
@@ -53,3 +53,42 @@ def procedure(context: mgp.ProcCtx,
# Multiple rows can be produced by returning an iterable of mgp.Record.
return mgp.Record(args=args_copy, vertex_count=vertex_count,
avg_degree=avg_degree, props=props)
@mgp.write_proc
def write_procedure(context: mgp.ProcCtx,
property_name: str,
property_value: mgp.Nullable[mgp.Any]
) -> mgp.Record(created_vertex=mgp.Vertex):
"""
This example procedure creates a new vertex with the specified property
and connects it to all existing vertex which has the same property with
the same name. It returns one field called `created_vertex` which
contains the newly created vertex.
Any errors can be reported by raising an Exception.
The procedure can be invoked in openCypher using the following calls:
- CALL example.write_procedure("property_name", "property_value")
YIELD created_vertex;
- MATCH (n) WHERE n.my_property IS NOT NULL
WITH n.my_property as property_value
CALL example.write_procedure("my_property", property_value)
YIELD created_vertex;
Naturally, you may pass in different arguments.
"""
# Collect all the vertices that has the required property with the same
# value
vertices_to_connect = []
for v in context.graph.vertices:
if v.properties[property_name] == property_value:
vertices_to_connect.append(v)
# Create the new vertex and set its property
vertex = context.graph.create_vertex()
vertex.properties.set(property_name, property_value)
# Connect the new vertex to the other vertices
for v in vertices_to_connect:
context.graph.create_edge(vertex, v, mgp.EdgeType("HAS_SAME_VALUE"))
return mgp.Record(created_vertex=vertex)

View File

@@ -1,15 +1,3 @@
# Install the license file.
if (MG_ENTERPRISE)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE_ENTERPRISE.md
DESTINATION share/doc/memgraph RENAME copyright)
else()
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE_COMMUNITY.md
DESTINATION share/doc/memgraph RENAME copyright)
endif()
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/third-party-licenses
DESTINATION share/doc/memgraph)
# Install systemd service (must use absolute path).
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/memgraph.service
DESTINATION /lib/systemd/system)
@@ -30,23 +18,13 @@ set(CPACK_DEBIAN_PACKAGE_SECTION non-free/database)
set(CPACK_DEBIAN_PACKAGE_HOMEPAGE https://memgraph.com)
set(CPACK_DEBIAN_PACKAGE_VERSION "${MEMGRAPH_VERSION_DEB}")
set(CPACK_DEBIAN_FILE_NAME "memgraph_${MEMGRAPH_VERSION_DEB}_amd64.deb")
if (MG_ENTERPRISE)
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"${CMAKE_CURRENT_SOURCE_DIR}/debian/enterprise/conffiles;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/enterprise/copyright;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/preinst;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/prerm;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postrm;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;")
else()
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"${CMAKE_CURRENT_SOURCE_DIR}/debian/community/conffiles;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/community/copyright;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/preinst;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/prerm;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postrm;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;")
endif()
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA
"${CMAKE_CURRENT_SOURCE_DIR}/debian/conffiles;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/copyright;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/preinst;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/prerm;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postrm;"
"${CMAKE_CURRENT_SOURCE_DIR}/debian/postinst;")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
# Description formatting is important, summary must be followed with a newline and 1 space.
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}
@@ -65,13 +43,8 @@ set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION
/var /var/lib /var/log /etc/logrotate.d
/lib /lib/systemd /lib/systemd/system /lib/systemd/system/memgraph.service)
set(CPACK_RPM_PACKAGE_REQUIRES_PRE "shadow-utils")
if (MG_ENTERPRISE)
set(CPACK_RPM_USER_BINARY_SPECFILE "${CMAKE_CURRENT_SOURCE_DIR}/rpm/enterprise/memgraph.spec.in")
set(CPACK_RPM_PACKAGE_LICENSE "Memgraph Enterprise Trial License")
else()
set(CPACK_RPM_USER_BINARY_SPECFILE "${CMAKE_CURRENT_SOURCE_DIR}/rpm/community/memgraph.spec.in")
set(CPACK_RPM_PACKAGE_LICENSE "Memgraph Community License")
endif()
set(CPACK_RPM_USER_BINARY_SPECFILE "${CMAKE_CURRENT_SOURCE_DIR}/rpm/memgraph.spec.in")
set(CPACK_RPM_PACKAGE_LICENSE "Memgraph License")
# Description formatting is important, no line must be greater than 80 characters.
set(CPACK_RPM_PACKAGE_DESCRIPTION "Contains Memgraph, the graph database.
It aims to deliver developers the speed, simplicity and scale required to build

View File

@@ -1,98 +0,0 @@
# Memgraph Community User License Agreement
This License Agreement governs your use of the Memgraph Community Release (the
"Software") and documentation ("Documentation").
BY DOWNLOADING AND/OR ACCESSING THIS SOFTWARE, YOU ("LICENSEE") AGREE TO THESE
TERMS.
1. License Grant
The Software and Documentation are provided to Licensee at no charge and are
licensed, not sold to Licensee. No ownership of any part of the Software and
Documentation is hereby transferred to Licensee. Subject to (i) the terms and
conditions of this License Agreement, and (ii) any additional license
restrictions and parameters contained on Licensors quotation, website, or
order form, Licensor hereby grants Licensee a personal, non-assignable,
non-transferable and non-exclusive license to install, access and use the
Software (in object code form only) and Documentation for Licensees internal
business purposes (including for use in a production environment) only. All
rights relating to the Software and Documentation that are not expressly
licensed in this License Agreement, whether now existing or which may hereafter
come into existence are reserved for Licensor. Licensee shall not remove,
obscure, or alter any proprietary rights notices (including without limitation
copyright and trademark notices), which may be affixed to or contained within
the Software or Documentation.
Licensor may terminate this License Agreement with immediate effect upon
written notice to the Licensee. Upon termination Licensee shall delete all
electronic copies of all or any part of the Software and/or the Documentation
resident in its systems or elsewhere.
2. Restrictions
Licensee will not, directly or indirectly, (a) copy the Software or
Documentation in any manner or for any purpose; (b) install, access or use any
component of the Software or Documentation for any purpose not expressly
granted in Section 1 above; (c) resell, distribute, publicly display or
publicly perform the Software or Documentation or any component thereof, by
transfer, lease, loan or any other means, or make it available for use by
others in any time-sharing, service bureau or similar arrangement; (d)
disassemble, decrypt, extract, reverse engineer or reverse compile the
Software, or otherwise attempt to discover the source code, confidential
algorithms or techniques incorporated in the Software; (e) export the Software
or Documentation in violation of any applicable laws or regulations; (f)
modify, translate, adapt, or create derivative works from the Software or
Documentation; (g) circumvent, disable or otherwise interfere with
security-related features of the Software or Documentation; (h) use the
Software or Documentation for any illegal purpose, in any manner that is
inconsistent with the terms of this License Agreement, or to engage in illegal
activity; (i) remove or alter any trademark, logo, copyright or other
proprietary notices, legends, symbols or labels on, or embedded in, the
Software or Documentation; or (j) provide access to the Software or
Documentation to third parties.
3. Warranty Disclaimer
THE SOFTWARE AND DOCUMENTATION ARE PROVIDED "AS IS" AND LICENSOR MAKES NO
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE OR NON
INFRINGEMENT OF THIRD PARTIES INTELLECTUAL PROPERTY RIGHTS OR OTHER
PROPRIETARY RIGHTS. NEITHER THIS LICENSE AGREEMENT NOR ANY DOCUMENTATION
FURNISHED UNDER IT IS INTENDED TO EXPRESS OR IMPLY ANY WARRANTY THAT THE
OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED, TIMELY, OR ERROR-FREE.
4. Limitation of Liability
Licensor shall not in any circumstances be liable, whether in tort (including
for negligence or breach of statutory duty howsoever arising), contract,
misrepresentation (whether innocent or negligent) or otherwise for: loss of
profits, loss of business, depletion of goodwill or similar losses, loss of
anticipated savings, loss of goods, loss or corruption of data or computer
downtime, or any special, indirect, consequential or pure economic loss, costs,
damages, charges or expenses.
Licensor's total aggregate liability in contract, tort (including without
limitation negligence or breach of statutory duty howsoever arising),
misrepresentation (whether innocent or negligent), restitution or otherwise,
arising in connection with the performance or contemplated performance of this
License Agreement shall in all circumstances be limited to GBP10.00 (ten pounds
sterling).
Nothing in this License Agreement shall limit Licensors liability in the case
of death or personal injury caused by negligence, fraud, or fraudulent
misrepresentation, or where it otherwise cannot be limited by law.
5. Technical Data
Licensor may collect and use technical information (such as usage patterns)
gathered when the Licensee downloads and uses the Software. This is generally
statistical data which does not identify an identified or identifiable
individual. It may also include Licensees IP address which is personal data
and is processed in accordance with our Privacy Policy. We only use this
technical information to improve our products.
6. Law and Jurisdiction
This License Agreement is governed by the laws of England and is subject to the
non-exclusive jurisdiction of the courts of England.

View File

@@ -1,671 +0,0 @@
# Memgraph Enterprise - Software Subscription Agreement
Memgraph Limited is registered in England under registration 10195084 and has
its registered office at Suite 4, Ironstone House, Ironstone Way, Brixworth,
Northampton, NN6 9UD ("Memgraph").
Memgraph agrees to license and/or grant you (the "Customer") access to the
Software, as defined below and provide support and services to you only if you
accept and agree to be bound by the terms and conditions in this Software
Subscription Agreement (the "Agreement"). By signing an Order Document (as
defined below), which is subject to and part of this Agreement, installing and
using the Software or by downloading a trial version of the Software, you agree
to be bound by the terms of this Agreement.
Memgraph Enterprise Trial Users: If you receive free of charge trial access to
the Software, you are deemed a "Customer" for purposes of this Agreement except
that you are subject to the additional restrictions and limitations set forth
in Section 3.2 below as to such Software.
## 1. DEFINITIONS.
1.1. "Applicable Laws" means (i) all applicable laws, statutes and regulations,
and (ii) regulatory policies, guidelines and industry codes (in each case
having the force of law), which apply to the provisions of the Software and
Services and this Agreement.
1.2. "Confidential Information" means all information disclosed
by a party ("Disclosing Party") to the other party ("Receiving Party"), whether
orally or in writing, that is designated as confidential or that reasonably
should be understood to be confidential given the nature of the information and
the circumstances of disclosure. Customer's Confidential Information includes
Customer Data; Memgraph Confidential Information includes the Software and
Services; and Confidential Information of each party includes the terms and
conditions of this Agreement and all Orders (including pricing), as well as
business and marketing plans, technology and technical information, product
plans and designs, and business processes disclosed by such party. However,
Confidential Information does not include any information that (i) is or
becomes generally known to the public without breach of any obligation owed to
the Disclosing Party, (ii) was known to the Receiving Party prior to its
disclosure by the Disclosing Party without breach of any obligation owed to the
Disclosing Party, (iii) is received from a third party without breach of any
obligation owed to the Disclosing Party, or (iv) was independently developed by
the Receiving Party.
1.3. "Customer Data" means business information or other data loaded by or for
Customer and/or processed by the Software.
1.4. "Data Protection Legislation" means all applicable data protection and
privacy legislation in force from time to time in the UK including the General
Data Protection Regulation ((EU) 2016/679); the Data Protection Act 2018; the
Privacy and Electronic Communications Directive 2002/58/EC (as updated by
Directive 2009/136/EC) and the Privacy and Electronic Communications
Regulations 2003 (SI 2003/2426) as amended.
1.5. "Order Document" or "Order" means an order on the Memgraph form of
provisioning document that is submitted by or on behalf of Customer, and
executed by or on behalf of the parties referencing this Agreement and that
specifies the Software and/or Services ordered by Customer, as well as the
specific terms and conditions, for that particular transaction.
1.6. "Services" means those services, including Support Services, which may be
provided to Customer by Memgraph pursuant to the terms of this Agreement and
are expressly limited to those services directly related to Customer's use of
the Software, and expressly exclude any other services.
1.7. "Software" means the Memgraph proprietary downloadable graph database
enterprise software ("Enterprise Software") and the associated technical
documentation located at https://docs.memgraph.com/ ("Documentation"), as well
as software updates, upgrades, bug fixes, or modified versions thereof that
Memgraph licenses or provides to Customer directly or indirectly throughout the
Subscription Term.
1.8. "Subscription Term" means the fixed term, of not less than one (1) year,
designated in an Order Document beginning on the Effective Date and ending at
the end of the period stated therein. If no expiration date is specified in an
Order Document, the Subscription Term shall be a one (1) year period ("Minimum
Subscription Term"). A "Subscription" is the binding, non-cancellable contract
for the use of the Software for the Subscription Term as set forth in an Order
Document.
1.9. "Support" means the support and maintenance services, including any
updates, upgrades, patches, enhancements and bug fixes for the Software that
may be provided to Customer by Memgraph pursuant to the terms of this
Agreement.
1.10. "Users" means employees and Contractors of Customer that Customer has
permitted or authorized to access and use of the Software on Customer's behalf
pursuant to the terms of this Agreement.
## 2. ORDERS, DELIVERY; SUPPORT.
2.1. Delivery. Memgraph will promptly deliver the Software after it accepts an
Order and Customer issues a purchase order referencing such Order. Unless
otherwise stated in an Order, Customer is solely responsible for installing
Software on Customer's own computer equipment. In some instances, Customer's
purchasing relationship exists solely between Customer and an authorised
reseller of Memgraph's Software and Services (a "Reseller"), in which case
Sections 5.1-5.3 (Fees and Payment) will be inapplicable to such Order(s), and
the Reseller shall be responsible for submitting Orders and the appropriate
payment method therewith to Memgraph. An Order is not binding until Memgraph
accepts and countersigns the Order.
2.2 Support. Memgraph will use commercially reasonable efforts to provide
Support to Customer in accordance with Memgraph's then-current terms and
conditions set forth at
https://download.memgraph.com/legal/memgraph-support-terms-and-conditions.pdf
at the support tier stated in the applicable Order. The Support terms and
conditions are subject to change at Memgraph's discretion; however, Memgraph
will not materially reduce the level of Support during a Subscription Term for
which Fees have been paid.
## 3. LICENCE GRANTS; RESTRICTIONS AND PROPRIETARY RIGHTS.
Customer's licence and access rights and benefits and Memgraph's obligations to
Customer will vary depending on the product and the type of licence Memgraph is
granting. If you purchased a licence to Memgraph Software, your licence will be
subject to certain use and/or capacity restrictions, as identified on the
applicable Order Document.
3.1. Enterprise Software Licence. In consideration of the Fees paid hereunder
and subject to the terms of this Agreement and the applicable Order, Memgraph
grants Customer a world-wide, non-exclusive, non-transferable,
non-sublicenseable, and limited licence during the applicable Subscription
Term, to install, and use the Enterprise Software up to the maximum capacity
("Licensed Capacity"), and subject to the usage rules, specified in the
applicable Order Document, and to use Documentation solely for Customer's
internal business purposes in connection with operation of the Enterprise
Software.
3.2. Enterprise Trial Licence. If the Customer downloads, accesses, or uses the
Software under a trial licence ("Trial Licence"), then Customer may use one (1)
copy of the Software in accordance with the terms and conditions of this
Agreement for a thirty (30) day period, or such longer trial period represented
by the applicable licence key issued by or expressly authorised by Memgraph
(the "Trial Period"). Trial Licences are permitted solely for Customer's
evaluation use to determine whether to purchase a Subscription to the Software.
Customer may not use a Trial Licence for any other purpose. At the end of the
Trial Period, the Trial Licence will expire (and this Agreement will terminate
as to such Licence and continue to apply to any subsequent Subscription or use
of the Software; if Customer decides not to obtain a Subscription upon
expiration of the Trial Period, it will promptly cease using and will delete
the Software from its computer systems. Memgraph has the right to terminate a
Trial Licence at any time for any reason.
3.3. NO OBLIGATIONS. NOTWITHSTANDING ANYTHING TO THE CONTRARY IN THIS AGREEMENT
OR IN ANY ORDER DOCUMENT, MEMGRAPH WILL HAVE NO WARRANTY, INDEMNITY, SUPPORT,
OR SERVICE LEVEL, OBLIGATIONS WITH RESPECT TO ANY ENTERPRISE TRIAL, OR OTHER
NO-CHARGE SOFTWARE (INCLUDING TOOLS AND UTILITIES) LICENCES.
3.4. General Restrictions. Customer acknowledges that the Software, and its
structure, organization, and source code, constitute Memgraph's and its
suppliers' valuable trade secrets, and that usage of the Software is subject to
the following restrictions:
3.4.1. Restrictions. Customer agrees not to, and not to authorize any third
party to: (i) allow access or use of the Software by anyone other than its
Users; (ii) distribute, embed, sell, rent, transfer, lease, lend, sublicense,
loan, assign, pledge, grant a security interest in, or otherwise make the
Software accessible or available to any third party; except to the limited
extent expressly provided in Section 3.4.2, use the Software in any
service-bureau, timesharing, outsourcing or similar arrangement; or (iii)
disassemble, decompile, reverse engineer or otherwise attempt to derive the
structure, sequence or organization of source code or APIs; (iv) remove or
alter product identification, copyright, trademark or other proprietary
markings contained in or on the Software; (v) modify, adapt, recast, transform
or otherwise prepare a derivative work of the Software or portion thereof; (vi)
conduct any competitive analysis, publish or share with any third party any
results of any technical evaluation or tests performed on the Software, or
disclose Software features, errors or bugs to a third party without Memgraph's
prior written consent; or (vii) engage in any act designed to circumvent any
restriction set forth in this Agreement, in the Software, or in an Order,
including but not limited to restrictions related to Licensed Capacity.
3.4.2. Internal Use Licences; Users. The Software is licensed for Customer's
internal business use and not for distribution or use by third parties. For
clarity, however, Customer may make available to third parties any
Customer-hosted services or other Customer applications or services that make
use of or incorporate the Software, provided and solely to the extent that (i)
Customer's application or hosted service adds primary and significant
functionality to the Software, (ii) Customer does not embed or otherwise
distribute the Software to third parties, (iii) Customer does not provide third
parties direct access to operate or control the Software itself; and (iv)
Customer at all times remains in compliance with the terms of the applicable
licence grants under this Agreement. Subject to the terms and conditions of
this Agreement, in addition to Customer's employees, Customer may permit its
independent contractors and consultants ("Contractors") to serve as Users.
Customer will remain responsible for compliance by each of its Users (including
but not limited to any Contractor Users) with all of the terms and conditions
of this Agreement, and any use of the Software by any Contractors must be for
the sole benefit of Customer.
3.5. Ownership; Reservation of Rights. This is an agreement for use of Memgraph
Software and not an agreement for sale. Customer acknowledges that it is
obtaining only a limited right to use the Software on a licensed basis, and
that irrespective of any use of the words "purchase", "sale" or like terms
hereunder no ownership rights are being conveyed to Customer. Customer agrees
that Memgraph or its suppliers retain all right, title and interest (including
all patent, copyright, trade secret and other intellectual property rights) in
and to the Memgraph Software. Nothing in this Section shall be deemed as
granting Memgraph ownership of Customer Data or in any way impacting Customer's
ownership of Customer Data.
3.6. Third Party Code. The Software may contain or be provided with components
which are licensed from third parties, including components subject to the
terms and conditions of "open source" software licences ("Open Source
Software"). Open Source Software may be identified in the Software,
Documentation, or in a list of the Open Source Software provided to you upon
your written request. To the extent required by the licence that accompanies
the Open Source Software, the terms of such licence will apply in lieu of the
terms of this Agreement with respect to such Open Source Software, including,
without limitation, any provisions governing access to source code,
modification, or reverse engineering.
3.7. IP Ownership. The Parties agree that neither party shall gain, by virtue
of this Agreement, any rights of ownership or any other interest, right or
title of copyrights, patents, trade secrets, trademarks, or any other
intellectual property rights owned by the other Party. Any and all new works
developed in the course of performing obligations pursuant to this Agreement
and all new inventions, innovations or ideas developed by a Party in the course
of performance of its activities under this Agreement, will belong to that
Party who develops the same. Notwithstanding anything to the contrary in this
Section, the Parties understand and agree that any and all proprietary
materials developed by a Party prior to this Agreement and any modifications,
enhancements, improvements or inventions made to such proprietary materials
shall be owned by that Party, regardless of which Party prepared or developed
such modifications, enhancements, improvements or inventions.
## 4. CUSTOMER DATA; OBLIGATIONS OF CUSTOMER AND MEMGRAPH.
4.1. Customer shall retain all of its rights, title, and interest in and to its
intellectual property rights in Customer Data. Customer grants to Memgraph a
non-exclusive, worldwide, limited-term licence solely to host, copy, transmit
and display Customer Data as reasonably necessary for Memgraph to support
Customer's use of the Software, to ensure the security of and to administrate
the Software, and to deliver Services in accordance with this Agreement or as
otherwise outlined in https://memgraph.com/legal/privacy-policy/.
4.2. Protection of Customer Data. Memgraph will maintain appropriate
administrative, physical, and technical safeguards, consistent with generally
prevailing industry standards, for protection of the security, confidentiality,
and integrity of Customer Data, as described in the Documentation. Those
safeguards will include, but will not be limited to, measures for preventing
access, use, modification, or disclosure of Customer Data by Memgraph
personnel, except as permitted by this Agreement.
4.3. Personal data. Both parties will comply with all applicable requirements
of the Data Protection Legislation. This section 4 is in addition to, and does
not relieve, remove or replace, a party's obligations under the Data Protection
Legislation. Notwithstanding the foregoing, the parties acknowledge that, in
the ordinary course of providing the Services, Memgraph shall not process
personal data (as defined in the Data Protection Legislation) on behalf of the
Customer. In the event that the Customer requires Memgraph to process personal
data on its behalf, it shall notify Memgraph and the parties shall execute such
terms as necessary under applicable law.
## 5. FEES AND PAYMENT.
5.1. Fees. Customer will pay Memgraph the fees for the Licences and Services as
set forth in the applicable Order ("Fees"). Customer acknowledges and agrees
that if Customer's use of the Software exceeds the Licensed Capacity set forth
on the applicable Orders or otherwise requires the payment of additional fees
(per the terms of this Agreement), Customer shall be invoiced for such usage
and Customer agrees to pay the additional fees in accordance with this Section.
Notwithstanding the terms of Section 5.4 below (Reconciliation), Customer
acknowledges and agrees that it is obligated to ensure that its Software usage
does not exceed the Licensed Capacity and to promptly notify Memgraph of any
such excess usage no more than thirty (30) days from the last day of the
calendar month during which such excess usage occurred.
5.2. Payment Terms. Except as otherwise specifically set forth on an Order
Document, all fees are due and payable within thirty days after the date of
invoice. Renewal Fees for any renewal Subscription Term (if purchased by
Customer) will be due and payable within thirty (30) days of expiration of the
then-current term. If Fees are not paid when due, or in the event of other
breach of this Agreement, Customer shall discontinue use of the Software and
Memgraph may suspend its performance, including its delivery of technical
support of the Software or other Services without further notice and without
penalty. All Orders (including multi-year Subscriptions with annual payment
schedules) are non-cancellable and all amounts paid are non-refundable, unless
otherwise expressly set forth herein. Any invoiced amount not received by the
due date will accrue late interest at the rate of 1.5% of the outstanding
balance per month, or the maximum rate permitted by applicable law, whichever
is lower.
5.3. Taxes. Fees are exclusive of taxes. Customer will pay any sales, use,
value added, duties, fees and other governmental assessments or charges arising
out of this Agreement and the transactions contemplated herein. Customer will
make all payments free and clear of, and without reduction for, any withholding
taxes.
5.4. Reconciliation. At Memgraph's request from time to time, not exceeding
once per quarter, Customer will provide Memgraph with a report detailing its
use of the Software, including its non-production and/or production use and
using the self-monitoring capabilities of the Software or other means, and
Memgraph may inspect Customer's records related to such report not more
frequently than annually to ensure payment of Fees. Any on-site review will be
conducted during regular business hours at Customer's offices. The parties will
use reasonable good faith efforts to promptly resolve any discrepancies between
licensed usage and actual usage.
## 6. APPLICABLE LAWS.
6.1. Each Party shall perform this Agreement in accordance with all Applicable
Laws. Without prejudice to the foregoing, each Party shall:
6.1.1. comply with all Applicable Laws relating to anti-bribery,
anti-corruption, anti-slavery and human trafficking, including the Bribery Act
2010 and the Modern Slavery Act 2015 (the "Relevant Requirements");
6.1.2. have and maintain in place throughout the Term its own policies and
procedures, including adequate procedures under the Bribery Act 2010, to ensure
compliance with the Relevant Requirements, and will enforce them where
appropriate;
6.1.3. (if not prohibited by law or regulation from doing so) promptly report
to the other Party any request or demand for any undue financial or other
advantage of any kind received by the reporting Party in connection with the
performance of this Agreement; and
6.1.4. (if not prohibited by law or regulation from doing so) notify the other
Party (and email shall be sufficient for this purpose) as soon as it becomes
aware of any actual or suspected slavery or human trafficking in a supply chain
which has a connection with this Agreement.
## 7. REPRESENTATIONS AND WARRANTIES.
7.1. Mutual Representations and Warranties. Each Party represents and warrants
to the other that: (i) it is a corporation lawfully incorporated and validly
existing pursuant to the laws of its place of incorporation; (ii) it has all
requisite power and authority, corporate or otherwise, to execute, deliver and
perform its obligations under this Agreement; and (iii) this Agreement
constitutes its legal, valid and binding obligations and may be enforced
against it.
7.2. Limited Memgraph Warranty; Remedies. Memgraph warrants that the Software,
when used as permitted hereunder, will operate in all material respects as
described in the applicable Documentation, and that Services will be provided
in a professional manner consistent with industry standards.
7.3. Limitations; Remedy. Memgraph does not warrant that the Software or the
Services will be error-free, uninterrupted or meet Customer's specific
requirements or that performance of the Services will be uninterrupted.
Memgraph will have no warranty obligation under Section 7.2 for Customer's
misuse or failure to use the Software in accordance with its Documentation or
this Agreement. Customer's sole and exclusive remedy, and Memgraph's sole and
exclusive obligation, for breach of warranty will be (i) during the thirty (30)
day period following initial Delivery of the Software under an Order,
Memgraph's correction of the program errors that cause the breach of warranty,
or if Memgraph cannot substantially correct such breach in a commercially
reasonable manner, a refund of the fees paid for the nonconforming Software
(ii) during the remainder of the relevant Subscription Term, Memgraph's
delivery of Support with respect to any such program errors. In the event of a
refund remedy, Customer's licences and right to use the Software or receive
Services will end. In the event of any noticed breach of warranty with respect
to Services, Memgraph's sole and exclusive obligation shall be the
re-performance of the deficient Services.
7.4. Disclaimer. THIS SECTION 7 IS A LIMITED WARRANTY AND, EXCEPT EXPRESSLY AS
SET FORTH IN SECTION 7.2, THE SOFTWARE, INCLUDING WITHOUT LIMITATION THE
THIRD-PARTY CODE, AND ALL SERVICES ARE PROVIDED "AS IS". MEMGRAPH MAKES NO
OTHER WARRANTIES OR REPRESENTATIONS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE,
AND DISCLAIMS ALL IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE, TITLE, AND NON-INFRINGEMENT.
## 8. INDEMNIFICATION.
8.1. By Memgraph. Memgraph will defend against any action against Customer
brought by a third party to the extent the action is based on a claim that the
Software infringes a third party's patent, copyright or trademark (a "Claim")
and indemnify Customer from the damages, liabilities, costs and expenses
(including reasonable attorneys' fees) awarded against Customer or agreed in
settlement by Customer resulting from such Claim. If your use of the Software
is (or in Memgraph's opinion likely to be) enjoined, then Memgraph may, at its
own expense and at its option: (i) substitute substantially similar
functionality for the Software which renders it non-infringing; (ii) procure
for Customer the right to continue to use the Software; or if (i) and (ii) are
not commercially reasonable, terminate this Agreement and refund Customer any
prepaid, unused (pro-rated) Fees for the duration of the then-current
Subscription Term. The foregoing obligations of Memgraph will not apply: (i) if
the Software is modified by any party other than Memgraph, but solely to the
extent the alleged infringement is caused by such modification; (ii) if the
Software is used in combination with other products or processes not provided
or authorized by Memgraph, but solely to the extent the alleged infringement is
caused by such combination; (iii) use of any version or release of Software
other than the most current version or release made available to Customer by
Memgraph, if its use would have avoided the infringement; (iv) any unauthorized
use of the Software. THIS SECTION 8.1 SETS FORTH MEMGRAPH'S SOLE LIABILITY AND
CUSTOMER'S SOLE AND EXCLUSIVE REMEDY WITH RESPECT TO ANY CLAIM OF INTELLECTUAL
PROPERTY INFRINGEMENT.
8.2. By Customer. Customer will indemnify and hold Memgraph and its suppliers
harmless against any claims, liabilities, costs, and expenses (including
reasonable attorneys' fees) that Memgraph or its suppliers may incur as a
result of a third-party claim arising from or related to Customer Data, or
misuse or unauthorised use of the Software by Customer or any User.
8.3. Conditions. All defence and indemnity obligations under Sections 8.1 and
8.2 are conditioned on the indemnitee (i) giving the indemnitor written notice
of the relevant claim within thirty (30) days after the indemnitee receives
notice of the Claim (or sooner if required by applicable law); (ii) reasonably
cooperating with the indemnitor, at the indemnitor's expense, in the defence of
the claim; and (iii) giving the indemnitor sole control of the defence and any
settlement negotiations. The indemnitee may participate in the defence at its
expense.
## 9. LIMITATION OF LIABILITY.
9.1. TO THE EXTENT PERMITTED BY LAW, NEITHER MEMGRAPH NOR CUSTOMER SHALL BE
LIABLE TO THE OTHER OR ANY THIRD PARTY FOR LOST PROFITS (WHETHER DIRECT OR
INDIRECT) OR LOSS OF USE OR DATA, SUBSTITUTE GOODS OR SERVICES, OR FOR
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, SPECIAL OR EXEMPLARY DAMAGES (INCLUDING
DAMAGE TO BUSINESS, REPUTATION OR GOODWILL), OR INDIRECT DAMAGES OF ANY TYPE
HOWEVER CAUSED, WHETHER BY BREACH OF WARRANTY, BREACH OF CONTRACT, IN TORT
(INCLUDING NEGLIGENCE) OR ANY OTHER LEGAL OR EQUITABLE CAUSE OF ACTION EVEN IF
SUCH PARTY HAS BEEN ADVISED OF SUCH DAMAGES IN ADVANCE OR IF SUCH DAMAGES WERE
FORESEEABLE.
9.2. LIMITATIONS ON DIRECT DAMAGES. EXCEPT FOR ANY EXCLUDED CLAIMS AND ANY
DAMAGES THAT CANNOT BE LIMITED UNDER APPLICABLE LAW, IN NO EVENT WILL
MEMGRAPH'S TOTAL AGGREGATE LIABILITY ARISING FROM OR RELATED TO THIS AGREEMENT,
EXCEED AN AMOUNT EQUAL TO THE TOTAL AMOUNT OF FEES PAID OR PAYABLE BY CUSTOMER
TO MEMGRAPH UNDER THIS AGREEMENT DURING THE TWELVE MONTHS PRECEDING THE CLAIM.
THE FOREGOING LIMITATIONS SHALL NOT APPLY TO: (i) PAYMENTS TO A THIRD PARTY
ARISING FROM A PARTY'S OBLIGATIONS UNDER SECTION 8 (INDEMNIFICATION); (ii)
BREACH BY A PARTY OF SECTION 10 (CONFIDENTIAL INFORMATION), AND (iii)
INFRINGEMENT BY A PARTY OF THE OTHER PARTY'S INTELLECTUAL PROPERTY RIGHTS
(COLLECTIVELY EXCLUSIONS (i)-(iii) ARE REFERRED TO AS THE "EXCLUDED CLAIMS").
WITH RESPECT TO ANY EXCLUDED CLAIMS, MEMGRAPH'S TOTAL AGGREGATE LIABILITY SHALL
IN NO EVENT EXCEED £1,000,000.
9.3. Nothing in this Agreement excludes the liability of Memgraph for death or
personal injury caused by the Supplier's negligence; or for fraud or fraudulent
misrepresentation.
## 10. CONFIDENTIALITY.
10.1. The Receiving Party will use the same degree of care that it uses to
protect the confidentiality of its own confidential information of like kind
(but not less than reasonable care) to (i) not use any confidential information
of the Disclosing Party for any purpose outside the scope of this agreement and
(ii) except as otherwise authorized by the Disclosing Party in writing, limit
access to confidential information of the Disclosing Party to those of its and
its affiliates' employees and contractors who need that access for purposes
consistent with this agreement and who have signed confidentiality agreements
with the receiving party containing protections not materially less protective
of the confidential information than those herein. Neither party will disclose
the terms of this agreement or any Orders to any third-party other than its
affiliates, legal counsel, and accountants without the other party's prior
written consent, provided that a party that makes any such disclosure to its
affiliate, legal counsel or accountants will remain responsible for such
affiliate's, legal counsel's, or accountant's compliance with this
"confidentiality" section.
10.2. Compelled Disclosure. The Receiving Party may disclose confidential
information of the Disclosing Party to the extent compelled by law to do so,
provided the Receiving Party gives the Disclosing Party prior notice of the
compelled disclosure (to the extent legally permitted) and reasonable
assistance, at the Disclosing Party's cost, if the Disclosing Party wishes to
contest the disclosure. If the receiving party is compelled by law to disclose
the Disclosing Party's confidential information as part of a civil proceeding
to which the Disclosing Party is a party, and the Disclosing Party is not
contesting the disclosure, the Disclosing Party will reimburse the Receiving
Party for its reasonable cost of complying and providing secure access to that
confidential information.
## 11. TERMINATION.
11.1. Term. The term ("Term") of this Agreement will commence on the Effective
Date and continue until all Subscriptions, licence terms and Orders expire,
unless earlier terminated in accordance with this Section 11.
11.2. Termination for Cause. In the event of a material breach of this
Agreement (excluding any breaches for which an exclusive remedy is expressly
provided), the non-breaching party may terminate this Agreement if such breach
is not cured within thirty (30) days after written notice thereof (except that
for a breach of Section 3.4 ("General Restrictions"), there will be no cure
period). For clarity, material breach of this Agreement includes, but is not
limited to, failure to timely pay amounts due hereunder, exceeding the scope of
any Licence granted hereunder (including the Licensed Capacity), violating the
Licence restrictions, breach of Section 6.1 and failing to protect the other
party's Confidential Information.
11.3. Without affecting any other right or remedy available to it, either party
may terminate this Agreement with immediate effect by giving written notice to
the other party if the other party:
11.3.1. suspends, or threatens to suspend, payment of its debts or is unable to
pay its debts as they fall due or admits inability to pay its debts or is
deemed unable to pay its debts within the meaning of section 123 of the
Insolvency Act 1986, as if the words "it is proved to the satisfaction of the
court" did not appear in sections 123(1)(e) or 123(2) of the Insolvency Act
1986; or
11.3.2. the other party commences negotiations with all or any class of its
creditors with a view to rescheduling any of its debts, or makes a proposal for
or enters into any compromise or arrangement with its creditors other than for
the sole purpose of a scheme for a solvent amalgamation of that other party
with one or more other companies or the solvent reconstruction of that other
party; or
11.3.3. a petition is filed, a notice is given, a resolution is passed, or an
order is made, for or in connection with the winding up of that other party
other than for the sole purpose of a scheme for a solvent amalgamation of that
other party with one or more other companies or the solvent reconstruction of
that other party; or
11.3.4. an application is made to court, or an order is made, for the
appointment of an administrator, or if a notice of intention to appoint an
administrator is given or if an administrator is appointed, over the other
party; or
11.3.5. the holder of a qualifying floating charge over the assets of that
other party has become entitled to appoint or has appointed an administrative
receiver; or
11.3.6. a person becomes entitled to appoint a receiver over the assets of the
other party or a receiver is appointed over the assets of the other party; or
11.3.7. a creditor or encumbrancer of the other party attaches or takes
possession of, or a distress, execution, sequestration or other such process is
levied or enforced on or sued against, the whole or any part of the other
party's assets and such attachment or process is not discharged within 30 days;
or
11.3.8. any event occurs, or proceeding is taken, with respect to the other
party in any jurisdiction to which it is subject that has an effect equivalent
or similar to any of the events mentioned in clause 11.3.1 to clause 11.3.7
(inclusive); or
11.3.9. the other party suspends or ceases, or threatens to suspend or cease,
carrying on all or a substantial part of its business.
11.4. Effect of Termination. Upon the termination of this Agreement: (i) all
licences will terminate; (ii) Customer will immediately discontinue all use of
the affected Software, erase all full and partial copies of the Software and
(subject to this Section) all other tangible embodiments of Memgraph
Confidential Information in Customer's possession or control, and promptly
certify the same to Memgraph; (iii) Memgraph may immediately cease providing
the Services; (iv) (subject to this Section), Memgraph will return or delete
all tangible embodiments of Customer Confidential Information in Memgraph's
possession or control; and (v) Sections 1 ("Definitions"), 3.4 ("General
Restrictions"), 3.5 ("Ownership; Reservation of Rights"), 5 ("Fees and
Payment"), 7.3 ("Limitations"), 7.4 ("Disclaimer"), 8 ("Indemnification"), 9
("Limitation of Liability"), 10 ("Confidentiality"), 11.4 ("Effect of
Termination"), and 12 ("Miscellaneous") will survive. If a party's file
retention policies or a valid legal order provides for backup or archival
copies of files to be retained, such party will notify the other party of such
policy or order, protect the other party's Confidential Information as required
hereunder, and permanently erase, delete, or destroy such Confidential
Information as soon as permissible under such policy or order.
## 12. MISCELLANEOUS.
12.1. Assignment. This Agreement will bind and inure to the benefit of each
party's permitted successors and assigns. Memgraph may assign this Agreement to
any affiliate or in connection with a merger, reorganization, acquisition, or
other transfer of all or substantially all of Memgraph's assets or voting
securities. Customer may not assign or transfer this Agreement, in whole or in
part, without Memgraph's written consent except that Customer may assign its
rights and obligations under this Agreement, in whole but not in part, without
Memgraph's written consent in connection with any merger, consolidation, sale
of all or substantially all of Customer's assets or voting stock, or any other
similar transaction provided that: (i) the assignee is not a direct competitor
of Memgraph; (ii) Customer provides prompt written notice of such assignment to
Memgraph; (iii) the assignee is capable of fully performing Customer's
obligations under this Agreement; and (iv) the assignee agrees to be bound by
the terms and conditions of this Agreement. Any attempt to transfer or assign
this Agreement without such written consent will be null and void.
12.2. Force Majeure. Memgraph shall have no liability to the Customer under
this Agreement if it is prevented from or delayed in performing its obligations
under this Agreement, or from carrying on its business, by acts, events,
omissions or accidents beyond its reasonable control, including strikes,
lock-outs or other industrial disputes (whether involving the workforce of
Memgraph or any other party), failure of a utility service or transport or
telecommunications network, act of God, war, pandemic, riot, civil commotion,
malicious damage, compliance with any law or governmental order, rule,
regulation or direction, accident, breakdown of plant or machinery, fire,
flood, storm or default of suppliers or subcontractors, provided that the
Customer is notified of such an event and its expected duration.
12.3. Governing Law. This Agreement and any dispute or claim arising out of or
in connection with it or its subject matter or formation (including
non-contractual disputes or claims) shall be governed by and construed in
accordance with the law of England and Wales.
12.4. Jurisdiction. Each party irrevocably agrees that the courts of England
and Wales shall have exclusive jurisdiction to settle any dispute or claim
arising out of or in connection with this Agreement or its subject matter or
formation (including non-contractual disputes or claims).
12.5. Severability; Waiver; Construction. If a court of competent jurisdiction
adjudges any provision of this Agreement to be invalid or unenforceable, the
remaining provisions of this Agreement, if capable of substantial performance,
will continue in full force and effect without being impaired or invalidated in
any way. The parties agree to replace any invalid provision with a valid
provision that most closely approximates the intent and economic effect of the
invalid provision. All waivers must be in writing. A party's consent to, or
waiver of, enforcement of this Agreement on one occasion will not be deemed a
waiver of any other provision or such provision on any other occasion. In this
Agreement, the word "including" means "including but not limited to." No
presumption will operate in favour of or against any party as a result of its
role in drafting this Agreement.
12.6. Subcontractors. Memgraph may use the services of subcontractors in
connection with its performance of this Agreement, provided that Memgraph
remains solely responsible for (i) compliance of any such subcontractor with
the terms of this Agreement and (ii) the overall performance of Memgraph as
required under this Agreement.
12.7. Use of Aggregate Data. Customer agrees that Memgraph may collect, use and
disclose quantitative data and metadata derived from the use of the Software
(i) for its own internal, statistical analysis, (ii) to develop and improve the
Software and (iii) to create and distribute reports and other materials
regarding use of the Software. For clarity, any such data collected, used, and
disclosed will be in anonymized aggregate form only and shall not identify
Customer or its Users, or disclose any Customer Data.
12.8. Independent Contractors. The parties are independent contractors. No
agency, partnership, franchise, joint venture, or employment relationship is
intended or created by this Agreement. Neither party has the power or authority
to create or assume any obligation, or make any representations or warranties,
on behalf of the other party.
12.9. Publicity. Memgraph may, in conformity with Customer's trademark usage
guidelines, use Customer's name and logo in Memgraph's sales and marketing
materials, including in business presentations, Customer lists, and on
websites. Neither party will issue a press release regarding this Agreement
without the other party's prior written consent. Neither party will disclose
the terms of this Agreement to any third party, except as required by law.
12.10. Notice. Any notice, consent, or waiver hereunder must be in writing,
addressed to the attention of "Legal Department" at the address set forth
above, and delivered by personal delivery, reputable rapid courier, or
certified/registered mail, return receipt requested, and will be deemed given
upon personal delivery, one (1) day after deposit with an overnight domestic
courier, two (2) days after deposit with an international courier, or five (5)
days after deposit in the certified or registered mail. A party may specify a
new address by providing notice to the other party in accordance with this
Section.
12.11. Compliance with Law. Each party will comply with all applicable laws,
regulations, and orders of any governmental authority of competent jurisdiction
in its performance under this Agreement, including but not limited to those
applicable to data collection and the privacy and security of personal
information, including trans-border data transfers and data breach notification
requirements as required of each party by law.
12.12. Supremacy; Modification. This Agreement will prevail over any written
instrument submitted by Customer; the terms of any purchase order,
acknowledgement, or similar document submitted by Customer to Memgraph will
have no effect. If the express terms of an Order Document conflict with this
Agreement, the terms on the Order Document will prevail, but only with respect
to that Order Document. This Agreement cannot be varied or supplemented by
course of dealing or by usage of trade. All modifications or amendments to this
Agreement must be in writing and signed by both parties, except that subsequent
renewals and purchases of additional Licensed Capacity can be procured by
payment against an issued invoice as set forth in Section 5 ("Fees and
payment") above.
12.13. No Third Party Beneficiaries. This Agreement is not intended and shall
not be construed to give any third party any interest or rights with respect to
or in connection with any agreement or provision herein, except as expressly
provided for in this Agreement.
12.14. Entire Agreement. This Agreement in its original English text, sets
forth the complete, exclusive, and final agreement of the parties concerning
the subject matter hereof, supersedes, replaces, and merges all prior and
contemporaneous agreements, communications, and understandings, both written
and oral, between them concerning the subject matter hereof. This Agreement may
be executed in counterparts.

View File

@@ -1,4 +0,0 @@
# Memgraph Release
Please continue in
[Notion](https://www.notion.so/memgraph/Release-621733518c82456ebc119d2a025b5dd3).

View File

@@ -1,2 +0,0 @@
/etc/memgraph/memgraph.conf
/etc/logrotate.d/memgraph

View File

@@ -1 +0,0 @@
../../LICENSE_COMMUNITY.md

1
release/debian/copyright Symbolic link
View File

@@ -0,0 +1 @@
../../LICENSE

View File

@@ -1 +0,0 @@
../../LICENSE_ENTERPRISE.md

View File

@@ -7,7 +7,7 @@ set -e
# Manage (remove) /etc/logrotate.d/memgraph_audit file because the whole
# logrotate config is moved to /etc/logrotate.d/memgraph since v1.2.0.
# Note: Only used to manage Memgraph Enterprise config but packaged into the
# Note: Only used to manage Memgraph config but it was packaged into the
# Memgraph Community as well.
if dpkg-maintscript-helper supports rm_conffile 2>/dev/null; then
# 1.1.999 is chosen because it's high enough version number. It's highly

View File

@@ -1,14 +1,14 @@
FROM debian:buster
FROM debian:bullseye
# NOTE: If you change the base distro update release/package as well.
ARG deb_release
RUN apt-get update && apt-get install -y \
openssl libcurl4 libssl1.1 python3 libpython3.7 python3-pip \
--no-install-recommends \
openssl libcurl4 libssl1.1 libseccomp2 python3 libpython3.9 python3-pip \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN pip3 install networkx==2.4 numpy==1.19.2 scipy==1.5.2
RUN pip3 install networkx==2.4 numpy==1.21.4 scipy==1.7.3
COPY ${deb_release} /
@@ -17,6 +17,11 @@ RUN dpkg -i ${deb_release}
# Memgraph listens for Bolt Protocol on this port by default.
EXPOSE 7687
# Snapshots and logging volumes
VOLUME /var/log/memgraph
VOLUME /var/lib/memgraph
# Configuration volume
VOLUME /etc/memgraph
USER memgraph
WORKDIR /usr/lib/memgraph

View File

@@ -1,25 +0,0 @@
FROM debian:buster
# NOTE: If you change the base distro update release/package as well.
ARG deb_release
RUN apt-get update && apt-get install -y \
openssl libcurl4 libssl1.1 libseccomp2 python3 libpython3.7 python3-pip \
--no-install-recommends \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN pip3 install networkx==2.4 numpy==1.19.2 scipy==1.5.2
COPY ${deb_release} /
# Install memgraph package
RUN dpkg -i ${deb_release}
# Memgraph listens for Bolt Protocol on this port by default.
EXPOSE 7687
USER memgraph
WORKDIR /usr/lib/memgraph
ENTRYPOINT ["/usr/lib/memgraph/memgraph"]
CMD [""]

View File

@@ -35,8 +35,7 @@ cd ${working_dir}
# Extract version and offering from deb name.
deb_name=`echo $(basename "$deb_path") | sed 's/.deb$//'`
version=`echo ${deb_name} | cut -d '_' -f 2 | rev | cut -d '-' -f 2- | rev | tr '+~' '__'`
offering=`echo ${version} | cut -d '-' -f 2`
dockerfile_path="${working_dir}/memgraph_${offering}.dockerfile"
dockerfile_path="${working_dir}/memgraph.dockerfile"
image_name="memgraph:${version}"
package_name="memgraph-${version}-docker.tar.gz"

View File

@@ -1,10 +1,11 @@
#!/usr/bin/env python3
import argparse
import os
import re
import subprocess
import sys
import os
import time
from functools import wraps
# This script is used to determine the current version of Memgraph. The script
# determines the current version using `git` automatically. The user can also
@@ -49,13 +50,13 @@ import os
# <VERSION>+<DISTANCE>~<SHORTHASH>-<OFFERING>[-<SUFFIX>]
# Examples:
# Release version:
# 0.50.1-community
# 0.50.1-enterprise
# 0.50.1-enterprise-veryimportantcustomer
# 0.50.1-open-source
# 0.50.1
# 0.50.1-veryimportantcustomer
# Development version (master, 12 commits after release/0.50):
# 0.50.0+12~7e1eef94-community
# 0.50.0+12~7e1eef94-enterprise
# 0.50.0+12~7e1eef94-enterprise-veryimportantcustomer
# 0.50.0+12~7e1eef94-open-source
# 0.50.0+12~7e1eef94
# 0.50.0+12~7e1eef94-veryimportantcustomer
#
# The DEB package version is determined using the following two templates:
# Release version:
@@ -64,13 +65,13 @@ import os
# <VERSION>+<DISTANCE>~<SHORTHASH>-<OFFERING>[-<SUFFIX>]-1
# Examples:
# Release version:
# 0.50.1-community-1
# 0.50.1-enterprise-1
# 0.50.1-enterprise-veryimportantcustomer-1
# 0.50.1-open-source-1
# 0.50.1-1
# 0.50.1-veryimportantcustomer-1
# Development version (master, 12 commits after release/0.50):
# 0.50.0+12~7e1eef94-community-1
# 0.50.0+12~7e1eef94-enterprise-1
# 0.50.0+12~7e1eef94-enterprise-veryimportantcustomer-1
# 0.50.0+12~7e1eef94-open-source-1
# 0.50.0+12~7e1eef94-1
# 0.50.0+12~7e1eef94-veryimportantcustomer-1
# For more documentation about the DEB package naming conventions see:
# https://www.debian.org/doc/debian-policy/ch-controlfields.html#version
#
@@ -81,46 +82,59 @@ import os
# <VERSION>_0.<DISTANCE>.<SHORTHASH>.<OFFERING>[.<SUFFIX>]
# Examples:
# Release version:
# 0.50.1_1.community
# 0.50.1_1.enterprise
# 0.50.1_1.enterprise.veryimportantcustomer
# 0.50.1_1.open-source
# 0.50.1_1
# 0.50.1_1.veryimportantcustomer
# Development version:
# 0.50.0_0.12.7e1eef94.community
# 0.50.0_0.12.7e1eef94.enterprise
# 0.50.0_0.12.7e1eef94.enterprise.veryimportantcustomer
# 0.50.0_0.12.7e1eef94.open-source
# 0.50.0_0.12.7e1eef94
# 0.50.0_0.12.7e1eef94.veryimportantcustomer
# For more documentation about the RPM package naming conventions see:
# https://docs.fedoraproject.org/en-US/packaging-guidelines/Versioning/
# https://fedoraproject.org/wiki/Package_Versioning_Examples
def retry(retry_limit, timeout=100):
def inner_func(func):
@wraps(func)
def wrapper(*args, **kwargs):
for _ in range(retry_limit):
try:
return func(*args, **kwargs)
except Exception:
time.sleep(timeout)
return func(*args, **kwargs)
return wrapper
return inner_func
@retry(3)
def get_output(*cmd, multiple=False):
ret = subprocess.run(cmd, stdout=subprocess.PIPE, check=True)
if multiple:
return list(map(lambda x: x.strip(),
ret.stdout.decode("utf-8").strip().split("\n")))
return list(map(lambda x: x.strip(), ret.stdout.decode("utf-8").strip().split("\n")))
return ret.stdout.decode("utf-8").strip()
def format_version(variant, version, offering, distance=None, shorthash=None,
suffix=None):
def format_version(variant, version, offering, distance=None, shorthash=None, suffix=None):
if not distance:
# This is a release version.
if variant == "deb":
# <VERSION>-<OFFERING>[-<SUFFIX>]-1
ret = "{}-{}".format(version, offering)
ret = "{}{}".format(version, "-" + offering if offering else "")
if suffix:
ret += "-" + suffix
ret += "-1"
return ret
elif variant == "rpm":
# <VERSION>_1.<OFFERING>[.<SUFFIX>]
ret = "{}_1.{}".format(version, offering)
ret = "{}_1{}".format(version, "." + offering if offering else "")
if suffix:
ret += "." + suffix
return ret
else:
# <VERSION>-<OFFERING>[-<SUFFIX>]
ret = "{}-{}".format(version, offering)
ret = "{}{}".format(version, "-" + offering if offering else "")
if suffix:
ret += "-" + suffix
return ret
@@ -128,59 +142,53 @@ def format_version(variant, version, offering, distance=None, shorthash=None,
# This is a development version.
if variant == "deb":
# <VERSION>+<DISTANCE>~<SHORTHASH>-<OFFERING>[-<SUFFIX>]-1
ret = "{}+{}~{}-{}".format(version, distance, shorthash, offering)
ret = "{}+{}~{}{}".format(version, distance, shorthash, "-" + offering if offering else "")
if suffix:
ret += "-" + suffix
ret += "-1"
return ret
elif variant == "rpm":
# <VERSION>_0.<DISTANCE>.<SHORTHASH>.<OFFERING>[.<SUFFIX>]
ret = "{}_0.{}.{}.{}".format(
version, distance, shorthash, offering)
ret = "{}_0.{}.{}{}".format(version, distance, shorthash, "." + offering if offering else "")
if suffix:
ret += "." + suffix
return ret
else:
# <VERSION>+<DISTANCE>~<SHORTHASH>-<OFFERING>[-<SUFFIX>]
ret = "{}+{}~{}-{}".format(version, distance, shorthash, offering)
ret = "{}+{}~{}{}".format(version, distance, shorthash, "-" + offering if offering else "")
if suffix:
ret += "-" + suffix
return ret
# Parse arguments.
parser = argparse.ArgumentParser(
description="Get the current version of Memgraph.")
parser = argparse.ArgumentParser(description="Get the current version of Memgraph.")
parser.add_argument("--open-source", action="store_true", help="set the current offering to 'open-source'")
parser.add_argument("version", help="manual version override, if supplied the version isn't " "determined using git")
parser.add_argument("suffix", help="custom suffix for the current version being built")
parser.add_argument(
"--enterprise", action="store_true",
help="set the current offering to enterprise (default 'community')")
"--variant",
choices=("binary", "deb", "rpm"),
default="binary",
help="which variant of the version string should be generated",
)
parser.add_argument(
"version", help="manual version override, if supplied the version isn't "
"determined using git")
parser.add_argument(
"suffix", help="custom suffix for the current version being built")
parser.add_argument(
"--variant", choices=("binary", "deb", "rpm"), default="binary",
help="which variant of the version string should be generated")
parser.add_argument(
"--memgraph-root-dir", help="The root directory of the checked out "
"Memgraph repository.", default=".")
"--memgraph-root-dir", help="The root directory of the checked out " "Memgraph repository.", default="."
)
args = parser.parse_args()
if not os.path.isdir(args.memgraph_root_dir):
raise Exception("The root directory ({}) is not a valid directory".format(
args.memgraph_root_dir))
raise Exception("The root directory ({}) is not a valid directory".format(args.memgraph_root_dir))
os.chdir(args.memgraph_root_dir)
offering = "enterprise" if args.enterprise else "community"
offering = "open-source" if args.open_source else None
# Check whether the version was manually supplied.
if args.version:
if not re.match(r"^[0-9]+\.[0-9]+\.[0-9]+$", args.version):
raise Exception("Invalid version supplied '{}'!".format(args.version))
print(format_version(args.variant, args.version, offering,
suffix=args.suffix), end="")
print(format_version(args.variant, args.version, offering, suffix=args.suffix), end="")
sys.exit(0)
# Within CI, after the regular checkout, master is sometimes (e.g. in the case
@@ -234,33 +242,28 @@ versions.sort(reverse=True)
current_version = None
for version in versions:
version_tuple, branch, master_branch_merge = version
current_branch_merge = get_output(
"git", "merge-base", current_hash, branch)
master_current_merge = get_output(
"git", "merge-base", current_hash, "master")
current_branch_merge = get_output("git", "merge-base", current_hash, branch)
master_current_merge = get_output("git", "merge-base", current_hash, "master")
# The first check checks whether this commit is a child of `master` and
# the version branch was created before us.
# The second check checks whether this commit is a child of the version
# branch.
if master_branch_merge == current_branch_merge or \
master_branch_merge == master_current_merge:
if master_branch_merge == current_branch_merge or master_branch_merge == master_current_merge:
current_version = version
break
# Determine current version.
if current_version is None:
raise Exception("You are attempting to determine the version for a very "
"old version of Memgraph!")
raise Exception("You are attempting to determine the version for a very " "old version of Memgraph!")
version, branch, master_branch_merge = current_version
distance = int(get_output("git", "rev-list", "--count", "--first-parent",
master_branch_merge + ".." + current_hash))
distance = int(get_output("git", "rev-list", "--count", "--first-parent", master_branch_merge + ".." + current_hash))
version_str = ".".join(map(str, version)) + ".0"
if distance == 0:
print(format_version(args.variant, version_str, offering,
suffix=args.suffix),
end="")
print(format_version(args.variant, version_str, offering, suffix=args.suffix), end="")
else:
print(format_version(args.variant, version_str, offering,
distance=distance, shorthash=current_hash_short,
suffix=args.suffix),
end="")
print(
format_version(
args.variant, version_str, offering, distance=distance, shorthash=current_hash_short, suffix=args.suffix
),
end="",
)

View File

@@ -1,7 +1,7 @@
# logrotate configuration for Memgraph Enterprise
# see "man logrotate" for details
/var/lib/memgraph/durability/audit/audit.log {
/var/lib/memgraph/audit/audit.log {
# rotate log files daily
daily
# keep one year worth of audit logs

View File

@@ -1,2 +0,0 @@
# logrotate configuration for Memgraph Community
# see "man logrotate" for details

View File

@@ -0,0 +1,17 @@
FROM debian:11
ARG TOOLCHAIN_VERSION
# Stops tzdata interactive configuration.
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y \
ca-certificates wget git
# Do NOT be smart here and clean the cache because the container is used in the
# stateful context.
RUN wget -q https://s3-eu-west-1.amazonaws.com/deps.memgraph.io/${TOOLCHAIN_VERSION}/${TOOLCHAIN_VERSION}-binaries-debian-11.tar.gz \
-O ${TOOLCHAIN_VERSION}-binaries-debian-11.tar.gz \
&& tar xzvf ${TOOLCHAIN_VERSION}-binaries-debian-11.tar.gz -C /opt
ENTRYPOINT ["sleep", "infinity"]

View File

@@ -16,6 +16,10 @@ services:
build:
context: debian-10
container_name: "mgbuild_debian-10"
mgbuild_debian-11:
build:
context: debian-11
container_name: "mgbuild_debian-11"
mgbuild_ubuntu-18.04:
build:
context: ubuntu-18.04

View File

@@ -3,49 +3,49 @@
set -Eeuo pipefail
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
SUPPORTED_OFFERING=(community enterprise)
SUPPORTED_OS=(centos-7 centos-8 debian-9 debian-10 ubuntu-18.04 ubuntu-20.04)
SUPPORTED_OS=(centos-7 centos-8 debian-9 debian-10 debian-11 ubuntu-18.04 ubuntu-20.04)
PROJECT_ROOT="$SCRIPT_DIR/../.."
TOOLCHAIN_VERSION="toolchain-v3"
ACTIVATE_TOOLCHAIN="source /opt/${TOOLCHAIN_VERSION}/activate"
HOST_OUTPUT_DIR="$PROJECT_ROOT/build/output"
print_help () {
echo "$0 init|package {offering} {os} [--for-docker]|docker|test"
echo "$0 init|package {os} [--for-docker|--for-platform]|docker|test"
echo ""
echo " offerings: ${SUPPORTED_OFFERING[*]}"
echo " OSs: ${SUPPORTED_OS[*]}"
exit 1
}
make_package () {
offering="$1"
offering_flag=" -DMG_ENTERPRISE=OFF "
if [[ "$offering" == "enterprise" ]]; then
offering_flag=" -DMG_ENTERPRISE=ON "
fi
if [[ "$offering" == "community" ]]; then
offering_flag=" -DMG_ENTERPRISE=OFF "
fi
os="$2"
os="$1"
build_container="mgbuild_$os"
echo "Building Memgraph for $os on $build_container..."
package_command=""
if [[ "$os" =~ ^"centos".* ]]; then
docker exec "$build_container" bash -c "yum -y update"
package_command=" cpack -G RPM --config ../CPackConfig.cmake && rpmlint memgraph*.rpm "
fi
if [[ "$os" =~ ^"debian".* ]]; then
docker exec "$build_container" bash -c "apt update"
package_command=" cpack -G DEB --config ../CPackConfig.cmake "
fi
if [[ "$os" =~ ^"ubuntu".* ]]; then
docker exec "$build_container" bash -c "apt update"
package_command=" cpack -G DEB --config ../CPackConfig.cmake "
fi
docker_flag=" -DBUILD_FOR_DOCKER=OFF "
if [[ "$#" -gt 2 ]]; then
if [[ "$3" == "--for-docker" ]]; then
docker_flag=" -DBUILD_FOR_DOCKER=ON "
telemetry_id_override_flag=""
if [[ "$#" -gt 1 ]]; then
if [[ "$2" == "--for-docker" ]]; then
telemetry_id_override_flag=" -DMG_TELEMETRY_ID_OVERRIDE=DOCKER "
elif [[ "$2" == "--for-platform" ]]; then
telemetry_id_override_flag=" -DMG_TELEMETRY_ID_OVERRIDE=DOCKER-PLATFORM"
else
print_help
exit
fi
fi
build_container="mgbuild_$os"
echo "Building Memgraph $offering for $os on $build_container..."
echo "Copying project files..."
# If master is not the current branch, fetch it, because the get_version
@@ -72,9 +72,9 @@ make_package () {
docker exec "$build_container" bash -c "/memgraph/environment/os/$os.sh install MEMGRAPH_BUILD_DEPS"
echo "Building targeted package..."
docker exec "$build_container" bash -c "cd /memgraph && ./init"
docker exec "$build_container" bash -c "cd /memgraph && $ACTIVATE_TOOLCHAIN && ./init"
docker exec "$build_container" bash -c "cd $container_build_dir && rm -rf ./*"
docker exec "$build_container" bash -c "cd $container_build_dir && $ACTIVATE_TOOLCHAIN && cmake -DCMAKE_BUILD_TYPE=release $offering_flag $docker_flag .."
docker exec "$build_container" bash -c "cd $container_build_dir && $ACTIVATE_TOOLCHAIN && cmake -DCMAKE_BUILD_TYPE=release $telemetry_id_override_flag .."
# ' is used instead of " because we need to run make within the allowed
# container resources.
# shellcheck disable=SC2016
@@ -100,8 +100,8 @@ case "$1" in
;;
docker)
# NOTE: Docker is build on top of Debian 10 package.
based_on_os="debian-10"
# NOTE: Docker is build on top of Debian 11 package.
based_on_os="debian-11"
# shellcheck disable=SC2012
last_package_name=$(cd "$HOST_OUTPUT_DIR/$based_on_os" && ls -t memgraph* | head -1)
docker_build_folder="$PROJECT_ROOT/release/docker"
@@ -118,17 +118,9 @@ case "$1" in
package)
shift 1
if [[ "$#" -lt 2 ]]; then
if [[ "$#" -lt 1 ]]; then
print_help
fi
offering="$1"
shift 1
is_offering_ok=false
for supported_offering in "${SUPPORTED_OFFERING[@]}"; do
if [[ "$supported_offering" == "${offering}" ]]; then
is_offering_ok=true
fi
done
os="$1"
shift 1
is_os_ok=false
@@ -137,8 +129,8 @@ case "$1" in
is_os_ok=true
fi
done
if [[ "$is_offering_ok" == true ]] && [[ "$is_os_ok" == true ]]; then
make_package "$offering" "$os" "$@"
if [[ "$is_os_ok" == true ]]; then
make_package "$os" "$@"
else
print_help
fi

View File

@@ -1,138 +0,0 @@
# -*- rpm-spec -*-
BuildRoot: %_topdir/@CPACK_PACKAGE_FILE_NAME@@CPACK_RPM_PACKAGE_COMPONENT_PART_PATH@
Summary: @CPACK_RPM_PACKAGE_SUMMARY@
Name: @CPACK_RPM_PACKAGE_NAME@
Version: @CPACK_RPM_PACKAGE_VERSION@
Release: @CPACK_RPM_PACKAGE_RELEASE@
License: @CPACK_RPM_PACKAGE_LICENSE@
# Group field is deprecated
# Group: @CPACK_RPM_PACKAGE_GROUP@
Vendor: @CPACK_RPM_PACKAGE_VENDOR@
BuildRequires: systemd
@TMP_RPM_URL@
@TMP_RPM_REQUIRES@
@TMP_RPM_REQUIRES_PRE@
@TMP_RPM_REQUIRES_POST@
@TMP_RPM_REQUIRES_PREUN@
@TMP_RPM_REQUIRES_POSTUN@
@TMP_RPM_PROVIDES@
@TMP_RPM_OBSOLETES@
@TMP_RPM_CONFLICTS@
@TMP_RPM_AUTOPROV@
@TMP_RPM_AUTOREQ@
@TMP_RPM_AUTOREQPROV@
@TMP_RPM_BUILDARCH@
@TMP_RPM_PREFIXES@
@TMP_RPM_DEBUGINFO@
# This is needed to prevent Python compilation errors when building the RPM
# package
# https://github.com/scylladb/scylla/issues/2235
%if 0%{?rhel} < 8
%global __os_install_post \
/usr/lib/rpm/redhat/brp-compress \
%{!?__debug_package:\
/usr/lib/rpm/redhat/brp-strip %{__strip} \
/usr/lib/rpm/redhat/brp-strip-comment-note %{__strip} %{__objdump} \
} \
/usr/lib/rpm/redhat/brp-strip-static-archive %{__strip} \
%{!?__jar_repack:/usr/lib/rpm/redhat/brp-java-repack-jars} \
%{nil}
%else
%global __os_install_post \
/usr/lib/rpm/brp-compress \
%{!?__debug_package:\
/usr/lib/rpm/brp-strip %{__strip} \
/usr/lib/rpm/brp-strip-comment-note %{__strip} %{__objdump} \
} \
/usr/lib/rpm/brp-strip-static-archive %{__strip} \
%{nil}
%endif
%define _rpmdir %_topdir/RPMS
%define _srcrpmdir %_topdir/SRPMS
@FILE_NAME_DEFINE@
%define _unpackaged_files_terminate_build 0
@TMP_RPM_SPEC_INSTALL_POST@
@CPACK_RPM_SPEC_MORE_DEFINE@
@CPACK_RPM_COMPRESSION_TYPE_TMP@
%description
@CPACK_RPM_PACKAGE_DESCRIPTION@
# This is a shortcutted spec file generated by CMake RPM generator
# we skip _install step because CPack does that for us.
# We do only save CPack installed tree in _prepr
# and then restore it in build.
%prep
# Put the systemd unit where it is expected on this system
mkdir -p $RPM_BUILD_ROOT/%{_unitdir}
mv $RPM_BUILD_ROOT/lib/systemd/system/memgraph.service $RPM_BUILD_ROOT/%{_unitdir}
rm -rf $RPM_BUILD_ROOT/lib
# Fix the incorrect directory permissions set by cpack (this is fixed in CMake 3.11)
find $RPM_BUILD_ROOT -type d | xargs chmod 755
# After setting up custom prep, continue with CMake's default
mv $RPM_BUILD_ROOT %_topdir/tmpBBroot
%install
if [ -e $RPM_BUILD_ROOT ];
then
rm -rf $RPM_BUILD_ROOT
fi
mv %_topdir/tmpBBroot $RPM_BUILD_ROOT
@TMP_RPM_DEBUGINFO_INSTALL@
%clean
%post
# memgraph user and group must be set in preinst
chown memgraph:memgraph /var/lib/memgraph || exit 1
chmod 750 /var/lib/memgraph || exit 1
chown memgraph:adm /var/log/memgraph || exit 1
chmod 750 /var/log/memgraph || exit 1
# Generate SSL certificates
if [ ! -d /etc/memgraph/ssl ]; then
mkdir /etc/memgraph/ssl || exit 1
openssl req -x509 -newkey rsa:4096 -days 3650 -nodes \
-keyout /etc/memgraph/ssl/key.pem -out /etc/memgraph/ssl/cert.pem \
-subj "/C=GB/ST=London/L=London/O=Memgraph Ltd./CN=Memgraph DB" || exit 1
chown memgraph:memgraph /etc/memgraph/ssl/* || exit 1
chmod 400 /etc/memgraph/ssl/* || exit 1
fi
@RPM_SYMLINK_POSTINSTALL@
@CPACK_RPM_SPEC_POSTINSTALL@
%postun
@CPACK_RPM_SPEC_POSTUNINSTALL@
%pre
# Add the 'memgraph' user and group
getent group memgraph >/dev/null || groupadd -r memgraph || exit 1
getent passwd memgraph >/dev/null || \
useradd -r -g memgraph -d /var/lib/memgraph -s /bin/bash memgraph || exit 1
echo "Don't forget to switch to the 'memgraph' user to use Memgraph" || exit 1
@CPACK_RPM_SPEC_PREINSTALL@
%preun
@CPACK_RPM_SPEC_PREUNINSTALL@
%files
%defattr(@TMP_DEFAULT_FILE_PERMISSIONS@,@TMP_DEFAULT_USER@,@TMP_DEFAULT_GROUP@,@TMP_DEFAULT_DIR_PERMISSIONS@)
@CPACK_RPM_INSTALL_FILES@
# Since we moved the memgraph.service file, declare it explicitly here.
# NOTE: memgraph.service must not be marked as configuration file.
%{_unitdir}/memgraph.service
# Override CPACK_RPM_ABSOLUTE_INSTALL_FILES with our %config(noreplace), cpack
# uses plain %config.
%config(noreplace) "/etc/memgraph/memgraph.conf"
%config(noreplace) "/etc/logrotate.d/memgraph"
@CPACK_RPM_USER_INSTALL_FILES@
%changelog
@CPACK_RPM_SPEC_CHANGELOG@

View File

@@ -8,14 +8,16 @@ add_subdirectory(io)
add_subdirectory(kvstore)
add_subdirectory(telemetry)
add_subdirectory(communication)
add_subdirectory(memory)
add_subdirectory(storage/v2)
add_subdirectory(integrations)
add_subdirectory(query)
add_subdirectory(slk)
add_subdirectory(rpc)
add_subdirectory(auth)
if (MG_ENTERPRISE)
add_subdirectory(audit)
add_subdirectory(auth)
endif()
string(TOLOWER ${CMAKE_BUILD_TYPE} lower_build_type)
@@ -31,18 +33,14 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(mg_single_node_v2_sources
glue/communication.cpp
memgraph.cpp
glue/auth.cpp
)
if (MG_ENTERPRISE)
set(mg_single_node_v2_sources
${mg_single_node_v2_sources}
glue/auth.cpp)
endif()
set(mg_single_node_v2_libs stdc++fs Threads::Threads
telemetry_lib mg-query mg-communication mg-new-delete mg-utils)
telemetry_lib mg-query mg-communication mg-memory mg-utils mg-auth mg-license mg-settings)
if (MG_ENTERPRISE)
# These are enterprise subsystems
set(mg_single_node_v2_libs ${mg_single_node_v2_libs} mg-auth mg-audit)
set(mg_single_node_v2_libs ${mg_single_node_v2_libs} mg-audit)
endif()
# memgraph main executable
@@ -108,13 +106,9 @@ install(FILES ${CMAKE_SOURCE_DIR}/include/mg_procedure.h
install(FILES ${CMAKE_BINARY_DIR}/config/memgraph.conf
DESTINATION /etc/memgraph RENAME memgraph.conf)
# Install logrotate configuration (must use absolute path).
if (MG_ENTERPRISE)
install(FILES ${CMAKE_SOURCE_DIR}/release/logrotate_enterprise.conf
install(FILES ${CMAKE_SOURCE_DIR}/release/logrotate.conf
DESTINATION /etc/logrotate.d RENAME memgraph)
else()
install(FILES ${CMAKE_SOURCE_DIR}/release/logrotate_community.conf
DESTINATION /etc/logrotate.d RENAME memgraph)
endif()
# Create empty directories for default location of lib and log.
install(CODE "file(MAKE_DIRECTORY \$ENV{DESTDIR}/var/log/memgraph
\$ENV{DESTDIR}/var/lib/memgraph)")

View File

@@ -1,5 +1,5 @@
set(audit_src_files log.cpp)
add_library(mg-audit STATIC ${audit_src_files})
target_link_libraries(mg-audit json gflags fmt)
target_link_libraries(mg-audit json gflags fmt::fmt)
target_link_libraries(mg-audit mg-utils mg-storage-v2)

View File

@@ -1,10 +1,20 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#include "audit/log.hpp"
#include <chrono>
#include <sstream>
#include <fmt/format.h>
#include <json/json.hpp>
#include "storage/v2/temporal.hpp"
#include "utils/logging.hpp"
#include "utils/string.hpp"
@@ -42,6 +52,37 @@ inline nlohmann::json PropertyValueToJson(const storage::PropertyValue &pv) {
}
break;
}
case storage::PropertyValue::Type::TemporalData: {
const auto temporal_data = pv.ValueTemporalData();
auto to_string = [](auto temporal_data) {
std::stringstream ss;
const auto ms = temporal_data.microseconds;
switch (temporal_data.type) {
case storage::TemporalType::Date: {
const auto date = utils::Date(ms);
ss << date;
return ss.str();
}
case storage::TemporalType::Duration: {
const auto dur = utils::Duration(ms);
ss << dur;
return ss.str();
}
case storage::TemporalType::LocalTime: {
const auto lt = utils::LocalTime(ms);
ss << lt;
return ss.str();
}
case storage::TemporalType::LocalDateTime: {
const auto ldt = utils::LocalDateTime(ms);
ss << ldt;
return ss.str();
}
}
};
ret = to_string(temporal_data);
break;
}
}
return ret;
}

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#pragma once
#include <atomic>

View File

@@ -7,7 +7,7 @@ set(auth_src_files
find_package(Seccomp REQUIRED)
add_library(mg-auth STATIC ${auth_src_files})
target_link_libraries(mg-auth json libbcrypt gflags fmt)
target_link_libraries(mg-auth json libbcrypt gflags fmt::fmt)
target_link_libraries(mg-auth mg-utils mg-kvstore)
target_link_libraries(mg-auth ${Seccomp_LIBRARIES})

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#include "auth/auth.hpp"
#include <cstring>
@@ -9,7 +17,10 @@
#include "auth/exceptions.hpp"
#include "utils/flag_validation.hpp"
#include "utils/license.hpp"
#include "utils/logging.hpp"
#include "utils/message.hpp"
#include "utils/settings.hpp"
#include "utils/string.hpp"
DEFINE_VALIDATED_string(auth_module_executable, "", "Absolute path to the auth module executable that should be used.",
@@ -58,6 +69,13 @@ Auth::Auth(const std::string &storage_directory) : storage_(storage_directory),
std::optional<User> Auth::Authenticate(const std::string &username, const std::string &password) {
if (module_.IsUsed()) {
const auto license_check_result = utils::license::global_license_checker.IsValidLicense(utils::global_settings);
if (license_check_result.HasError()) {
spdlog::warn(
utils::license::LicenseCheckErrorToString(license_check_result.GetError(), "authentication modules"));
return std::nullopt;
}
nlohmann::json params = nlohmann::json::object();
params["username"] = username;
params["password"] = password;
@@ -85,17 +103,15 @@ std::optional<User> Auth::Authenticate(const std::string &username, const std::s
if (FLAGS_auth_module_create_missing_user) {
user = AddUser(username, password);
if (!user) {
spdlog::warn(
"Couldn't authenticate user '{}' using the auth module because "
"the user already exists as a role!",
username);
spdlog::warn(utils::MessageWithLink(
"Couldn't create the missing user '{}' using the auth module because the user already exists as a role.",
username, "https://memgr.ph/auth"));
return std::nullopt;
}
} else {
spdlog::warn(
"Couldn't authenticate user '{}' using the auth module because the "
"user doesn't exist!",
username);
spdlog::warn(utils::MessageWithLink(
"Couldn't authenticate user '{}' using the auth module because the user doesn't exist.", username,
"https://memgr.ph/auth"));
return std::nullopt;
}
} else {
@@ -109,17 +125,16 @@ std::optional<User> Auth::Authenticate(const std::string &username, const std::s
role = AddRole(rolename);
if (!role) {
spdlog::warn(
"Couldn't authenticate user '{}' using the auth module "
"because the user's role '{}' already exists as a user!",
username, rolename);
utils::MessageWithLink("Couldn't authenticate user '{}' using the auth module because the user's "
"role '{}' already exists as a user.",
username, rolename, "https://memgr.ph/auth"));
return std::nullopt;
}
SaveRole(*role);
} else {
spdlog::warn(
"Couldn't authenticate user '{}' using the auth module because "
"the user's role '{}' doesn't exist!",
username, rolename);
spdlog::warn(utils::MessageWithLink(
"Couldn't authenticate user '{}' using the auth module because the user's role '{}' doesn't exist.",
username, rolename, "https://memgr.ph/auth"));
return std::nullopt;
}
}
@@ -133,11 +148,13 @@ std::optional<User> Auth::Authenticate(const std::string &username, const std::s
} else {
auto user = GetUser(username);
if (!user) {
spdlog::warn("Couldn't authenticate user '{}' because the user doesn't exist", username);
spdlog::warn(utils::MessageWithLink("Couldn't authenticate user '{}' because the user doesn't exist.", username,
"https://memgr.ph/auth"));
return std::nullopt;
}
if (!user->CheckPassword(password)) {
spdlog::warn("Couldn't authenticate user '{}'", username);
spdlog::warn(utils::MessageWithLink("Couldn't authenticate user '{}' because the password is not correct.",
username, "https://memgr.ph/auth"));
return std::nullopt;
}
return user;

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#pragma once
#include <mutex>
@@ -8,6 +16,7 @@
#include "auth/models.hpp"
#include "auth/module.hpp"
#include "kvstore/kvstore.hpp"
#include "utils/settings.hpp"
namespace auth {
@@ -20,7 +29,7 @@ namespace auth {
*/
class Auth final {
public:
Auth(const std::string &storage_directory);
explicit Auth(const std::string &storage_directory);
/**
* Authenticates a user using his username and password.

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#include "auth/crypto.hpp"
#include <libbcrypt/bcrypt.h>

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#pragma once
#include <string>

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include "utils/exceptions.hpp"

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#include "auth/models.hpp"
#include <regex>
@@ -7,11 +15,16 @@
#include "auth/crypto.hpp"
#include "auth/exceptions.hpp"
#include "utils/cast.hpp"
#include "utils/license.hpp"
#include "utils/settings.hpp"
#include "utils/string.hpp"
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
DEFINE_bool(auth_password_permit_null, true, "Set to false to disable null passwords.");
DEFINE_string(auth_password_strength_regex, ".+",
constexpr std::string_view default_password_regex = ".+";
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
DEFINE_string(auth_password_strength_regex, default_password_regex.data(),
"The regular expression that should be used to match the entire "
"entered password to ensure its strength.");
@@ -80,7 +93,8 @@ PermissionLevel Permissions::Has(Permission permission) const {
// Check for the deny first because it has greater priority than a grant.
if (denies_ & utils::UnderlyingCast(permission)) {
return PermissionLevel::DENY;
} else if (grants_ & utils::UnderlyingCast(permission)) {
}
if (grants_ & utils::UnderlyingCast(permission)) {
return PermissionLevel::GRANT;
}
return PermissionLevel::NEUTRAL;
@@ -190,26 +204,38 @@ User::User(const std::string &username, const std::string &password_hash, const
: username_(utils::ToLowerCase(username)), password_hash_(password_hash), permissions_(permissions) {}
bool User::CheckPassword(const std::string &password) {
if (password_hash_ == "") return true;
if (password_hash_.empty()) return true;
return VerifyPassword(password, password_hash_);
}
void User::UpdatePassword(const std::optional<std::string> &password) {
if (password) {
std::regex re(FLAGS_auth_password_strength_regex);
if (!std::regex_match(*password, re)) {
throw AuthException(
"The user password doesn't conform to the required strength! Regex: "
"{}",
FLAGS_auth_password_strength_regex);
}
password_hash_ = EncryptPassword(*password);
} else {
if (!password) {
if (!FLAGS_auth_password_permit_null) {
throw AuthException("Null passwords aren't permitted!");
}
password_hash_ = "";
return;
}
if (FLAGS_auth_password_strength_regex != default_password_regex) {
if (const auto license_check_result = utils::license::global_license_checker.IsValidLicense(utils::global_settings);
license_check_result.HasError()) {
throw AuthException(
"Custom password regex is a Memgraph Enterprise feature. Please set the config "
"(\"--auth-password-strength-regex\") to its default value (\"{}\") or remove the flag.\n{}",
default_password_regex,
utils::license::LicenseCheckErrorToString(license_check_result.GetError(), "password regex"));
}
}
std::regex re(FLAGS_auth_password_strength_regex);
if (!std::regex_match(*password, re)) {
throw AuthException(
"The user password doesn't conform to the required strength! Regex: "
"\"{}\"",
FLAGS_auth_password_strength_regex);
}
password_hash_ = EncryptPassword(*password);
}
void User::SetRole(const Role &role) { role_.emplace(role); }

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#pragma once
#include <optional>

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
#include "auth/module.hpp"
#include <cerrno>

View File

@@ -1,3 +1,11 @@
// Copyright 2021 Memgraph Ltd.
//
// Licensed as a Memgraph Enterprise file under the Memgraph Enterprise
// License (the "License"); by using this file, you agree to be bound by the terms of the License, and you may not use
// this file except in compliance with the License. You may obtain a copy of the License at https://memgraph.com/legal.
//
//
/// @file
#pragma once

View File

@@ -6,8 +6,10 @@ set(communication_src_files
helpers.cpp
init.cpp)
find_package(Boost REQUIRED)
add_library(mg-communication STATIC ${communication_src_files})
target_link_libraries(mg-communication Threads::Threads mg-utils mg-io fmt gflags)
target_link_libraries(mg-communication Boost::headers Threads::Threads mg-utils mg-io fmt::fmt gflags)
find_package(OpenSSL REQUIRED)
target_link_libraries(mg-communication ${OPENSSL_LIBRARIES})

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include "communication/bolt/v1/decoder/chunked_decoder_buffer.hpp"

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <cstdint>
@@ -20,6 +31,7 @@ enum class Signature : uint8_t {
Begin = 0x11,
Commit = 0x12,
Rollback = 0x13,
Route = 0x66,
Record = 0x71,
Success = 0x70,
@@ -30,6 +42,12 @@ enum class Signature : uint8_t {
Relationship = 0x52,
Path = 0x50,
UnboundRelationship = 0x72,
/// Temporal data types
Date = 0x44,
Duration = 0x45,
LocalDateTime = 0x64,
LocalTime = 0x74,
};
enum class Marker : uint8_t {

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <cstddef>
@@ -17,7 +28,7 @@ static constexpr size_t kChunkWholeSize = kChunkHeaderSize + kChunkMaxDataSize;
*/
static constexpr size_t kHandshakeSize = 20;
static constexpr uint16_t kSupportedVersions[3] = {0x0100, 0x0400, 0x0401};
static constexpr uint16_t kSupportedVersions[] = {0x0100, 0x0400, 0x0401, 0x0403};
static constexpr int kPullAll = -1;
static constexpr int kPullLast = -1;

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <algorithm>

View File

@@ -1,5 +1,18 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <array>
#include <chrono>
#include <string>
#include "communication/bolt/v1/codes.hpp"
@@ -7,6 +20,7 @@
#include "utils/cast.hpp"
#include "utils/endian.hpp"
#include "utils/logging.hpp"
#include "utils/temporal.hpp"
namespace communication::bolt {
@@ -69,12 +83,37 @@ class Decoder {
case Marker::Map16:
case Marker::Map32:
return ReadMap(marker, data);
case Marker::TinyStruct1: {
uint8_t signature = 0;
if (!buffer_.Read(&signature, 1)) {
return false;
}
switch (static_cast<Signature>(signature)) {
case Signature::Date:
return ReadDate(data);
case Signature::LocalTime:
return ReadLocalTime(data);
default:
return false;
}
}
case Marker::TinyStruct2: {
uint8_t signature = 0;
if (!buffer_.Read(&signature, 1)) {
return false;
}
switch (static_cast<Signature>(signature)) {
case Signature::LocalDateTime:
return ReadLocalDateTime(data);
default:
return false;
}
}
case Marker::TinyStruct3: {
// For tiny struct 3 we will also read the Signature to switch between
// vertex, unbounded_edge and path. Note that in those functions we
// won't perform an additional signature read.
uint8_t signature;
uint8_t signature = 0;
if (!buffer_.Read(&signature, 1)) {
return false;
}
@@ -89,10 +128,30 @@ class Decoder {
return false;
}
}
case Marker::TinyStruct5:
return ReadEdge(marker, data);
case Marker::TinyStruct4: {
uint8_t signature = 0;
if (!buffer_.Read(&signature, 1)) {
return false;
}
switch (static_cast<Signature>(signature)) {
case Signature::Duration:
return ReadDuration(data);
default:
return false;
}
}
case Marker::TinyStruct5: {
uint8_t signature = 0;
if (!buffer_.Read(&signature, 1)) {
return false;
}
switch (static_cast<Signature>(signature)) {
case Signature::Relationship:
return ReadEdge(data);
default:
return false;
}
}
default:
if ((value & 0xF0) == utils::UnderlyingCast(Marker::TinyString)) {
return ReadString(marker, data);
@@ -351,24 +410,11 @@ class Decoder {
return true;
}
bool ReadEdge(const Marker &marker, Value *data) {
uint8_t value;
bool ReadEdge(Value *data) {
Value dv;
*data = Value(Edge());
auto &edge = data->ValueEdge();
if (!buffer_.Read(&value, 1)) {
return false;
}
// check header
if (marker != Marker::TinyStruct5) {
return false;
}
if (value != utils::UnderlyingCast(Signature::Relationship)) {
return false;
}
// read ID
if (!ReadValue(&dv, Value::Type::Int)) {
return false;
@@ -468,5 +514,81 @@ class Decoder {
return true;
}
bool ReadDate(Value *data) {
Value dv;
if (!ReadValue(&dv, Value::Type::Int)) {
return false;
}
const auto chrono_days = std::chrono::days(dv.ValueInt());
const auto sys_days = std::chrono::sys_days(chrono_days);
const auto date = std::chrono::year_month_day(sys_days);
*data = Value(utils::Date(
{static_cast<int>(date.year()), static_cast<unsigned>(date.month()), static_cast<unsigned>(date.day())}));
return true;
}
bool ReadLocalTime(Value *data) {
Value dv;
if (!ReadValue(&dv, Value::Type::Int)) {
return false;
}
namespace chrono = std::chrono;
const auto nanos = chrono::nanoseconds(dv.ValueInt());
const auto microseconds = chrono::duration_cast<chrono::microseconds>(nanos);
*data = Value(utils::LocalTime(microseconds.count()));
return true;
}
bool ReadLocalDateTime(Value *data) {
Value secs;
if (!ReadValue(&secs, Value::Type::Int)) {
return false;
}
Value nanos;
if (!ReadValue(&nanos, Value::Type::Int)) {
return false;
}
namespace chrono = std::chrono;
const auto chrono_seconds = chrono::seconds(secs.ValueInt());
const auto sys_seconds = chrono::sys_seconds(chrono_seconds);
const auto sys_days = chrono::time_point_cast<chrono::days>(sys_seconds);
const auto date = chrono::year_month_day(sys_days);
const auto ldt = utils::Date(
{static_cast<int>(date.year()), static_cast<unsigned>(date.month()), static_cast<unsigned>(date.day())});
auto secs_leftover = chrono::seconds(sys_seconds - sys_days);
const auto h = utils::GetAndSubtractDuration<chrono::hours>(secs_leftover);
const auto m = utils::GetAndSubtractDuration<chrono::minutes>(secs_leftover);
const auto s = secs_leftover.count();
auto nanos_leftover = chrono::nanoseconds(nanos.ValueInt());
const auto ml = utils::GetAndSubtractDuration<chrono::milliseconds>(nanos_leftover);
const auto mi = chrono::duration_cast<chrono::microseconds>(nanos_leftover).count();
const auto params = utils::LocalTimeParameters{h, m, s, ml, mi};
const auto tm = utils::LocalTime(params);
*data = utils::LocalDateTime(ldt, tm);
return true;
}
bool ReadDuration(Value *data) {
Value dv;
std::array<int64_t, 4> values{0};
for (auto &val : values) {
if (!ReadValue(&dv, Value::Type::Int)) {
return false;
}
val = dv.ValueInt();
}
namespace chrono = std::chrono;
const auto months = chrono::months(values[0]);
const auto days = chrono::days(values[1]);
const auto secs = chrono::seconds(values[2]);
const auto nanos = chrono::nanoseconds(values[3]);
const auto micros = months + days + secs + chrono::duration_cast<chrono::microseconds>(nanos);
*data = Value(utils::Duration(micros.count()));
return true;
}
};
} // namespace communication::bolt

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <type_traits>
@@ -15,7 +26,8 @@ namespace communication::bolt {
/**
* Bolt BaseEncoder. Has public interfaces for writing Bolt encoded data.
* Supported types are: Null, Bool, Int, Double, String, List, Map, Vertex, Edge
* Supported types are: Null, Bool, Int, Double, String, List, Map, Vertex,
* Edge, Date, LocalDate, LocalDateTime, Duration.
*
* The purpose of this class is to stream bolt data into the given Buffer.
*
@@ -89,6 +101,7 @@ class BaseEncoder {
WriteTypeSize(value.size(), MarkerString);
WriteRAW(value.c_str(), value.size());
}
void WriteList(const std::vector<Value> &value) {
WriteTypeSize(value.size(), MarkerList);
for (auto &x : value) WriteValue(x);
@@ -168,6 +181,37 @@ class BaseEncoder {
for (auto &i : path.indices) WriteInt(i);
}
void WriteDate(const utils::Date &date) {
WriteRAW(utils::UnderlyingCast(Marker::TinyStruct1));
WriteRAW(utils::UnderlyingCast(Signature::Date));
WriteInt(date.DaysSinceEpoch());
}
void WriteLocalTime(const utils::LocalTime &local_time) {
WriteRAW(utils::UnderlyingCast(Marker::TinyStruct1));
WriteRAW(utils::UnderlyingCast(Signature::LocalTime));
WriteInt(local_time.NanosecondsSinceEpoch());
}
void WriteLocalDateTime(const utils::LocalDateTime &local_date_time) {
WriteRAW(utils::UnderlyingCast(Marker::TinyStruct2));
WriteRAW(utils::UnderlyingCast(Signature::LocalDateTime));
WriteInt(local_date_time.SecondsSinceEpoch());
WriteInt(local_date_time.SubSecondsAsNanoseconds());
}
void WriteDuration(const utils::Duration &duration) {
WriteRAW(utils::UnderlyingCast(Marker::TinyStruct4));
WriteRAW(utils::UnderlyingCast(Signature::Duration));
// This shall always be zero because internally we store microseconds
// and converting months to microseconds is an approximation. However,
// for the encoder, we implement ReadInt() to support the neo4j driver.
WriteInt(0);
WriteInt(duration.Days());
WriteInt(duration.SubDaysAsSeconds());
WriteInt(duration.SubSecondsAsNanoseconds());
}
void WriteValue(const Value &value) {
switch (value.type()) {
case Value::Type::Null:
@@ -203,6 +247,18 @@ class BaseEncoder {
case Value::Type::Path:
WritePath(value.ValuePath());
break;
case Value::Type::Date:
WriteDate(value.ValueDate());
break;
case Value::Type::LocalTime:
WriteLocalTime(value.ValueLocalTime());
break;
case Value::Type::LocalDateTime:
WriteLocalDateTime(value.ValueLocalDateTime());
break;
case Value::Type::Duration:
WriteDuration(value.ValueDuration());
break;
}
}

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <algorithm>

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include "communication/bolt/v1/codes.hpp"

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include "communication/bolt/v1/codes.hpp"

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
/// @file
#pragma once

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <optional>

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <cstdint>

View File

@@ -1,3 +1,14 @@
// Copyright 2021 Memgraph Ltd.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
// License, and you may not use this file except in compliance with the Business Source License.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.
#pragma once
#include <fmt/format.h>

Some files were not shown because too many files have changed in this diff Show More