# Database Binding
+
This binding provide a database API with key/value semantics.
The backend is currently a Berkeley DB.
## Verbs
+
* **insert**:
- This verb insert a key/value pair in the database.
- If the key already exist, the verb fails.
-
+
+ This verb insert a key/value pair in the database.
+ If the key already exist, the verb fails.
+
* **update**:
- This verb update an existing record.
- If the key doesn't exist, the verb fails.
-
+
+ This verb update an existing record.
+ If the key doesn't exist, the verb fails.
+
* **delete**:
- This verb remove an existing key/value pair from the database.
- If no matching record is found, the verb fails.
+
+ This verb remove an existing key/value pair from the database.
+ If no matching record is found, the verb fails.
* **read**:
- This verb get the value associated with the specified key.
- If no matching record is found, the verb fails.
+
+ This verb get the value associated with the specified key.
+ If no matching record is found, the verb fails.
## Arguments
+
* The **read** and **delete** verbs need only a **key** to work:
-```
+
+```code
{
- "key": "mykey"
+ "key": "mykey"
}
```
* The **insert** and **update** verbs need a **key** and a **value** to work:
-```
+
+```code
{
- "key": "mykey",
- "value": "my value"
+ "key": "mykey",
+ "value": "my value"
}
```
+
The **value** can be any valid json.
+
+## Dependencies
+
+You must install BerkeleyDB and GDBM
\ No newline at end of file
--- /dev/null
+###########################################################################
+# Copyright 2015 - 2018 IoT.bzh
+#
+# author:Frédéric Marec <frederic.marec@iot.bzh>
+#
+# 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.
+###########################################################################
+
+
+# Include any directory not starting with _
+# -----------------------------------------------------
+PROJECT_SUBDIRS_ADD(${PROJECT_SRC_DIR_PATTERN})
+
+ADD_TEST(NAME AGL_SERVICE_DATA-PERSISTENCE_TESTS
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMAND afb-test.sh ${CMAKE_BINARY_DIR}
+)
\ No newline at end of file
--- /dev/null
+#!/bin/sh
+
+BINDER=$(command -v afb-daemon)
+AFBTEST="$(pkg-config --variable libdir afb-test)/aft.so"
+PROCNAME="aft-persistence"
+PORT=1234
+TOKEN=
+LOGFILE="test.log"
+[ "$1" ] && BUILDDIR="$1" || exit 1
+
+TESTPACKAGEDIR="${BUILDDIR}/package-test"
+export AFT_CONFIG_PATH="${TESTPACKAGEDIR}/etc"
+export AFT_PLUGIN_PATH="${TESTPACKAGEDIR}/var:${TESTPACKAGEDIR}/lib/plugins"
+
+pkill $PROCNAME
+
+timeout -s 9 10 "${BINDER}" --name="${PROCNAME}" \
+ --port="${PORT}" \
+ --roothttp=. \
+ --tracereq=common \
+ --token=${TOKEN} \
+ --workdir="${TESTPACKAGEDIR}" \
+ --binding="../package/lib/afb-persistence-binding.so" \
+ --binding="$AFBTEST" \
+ --call="aft-persistence/launch_all_tests:{}" \
+ --call="aft-persistence/exit:{}" \
+ -vvv > "${LOGFILE}" 2>&1
+
+find "${BUILDDIR}" -name test_results.log -exec cat {} \;
--- /dev/null
+###########################################################################
+# Copyright 2018 IoT.bzh
+#
+# author:Frédéric Marec <frederic.marec@iot.bzh>
+#
+# 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.
+###########################################################################
+
+##################################################
+# Data persistence test configuration files
+##################################################
+PROJECT_TARGET_ADD(afb-test-config)
+
+ file(GLOB CONF_FILES "*.json")
+
+ add_input_files("${CONF_FILES}")
+
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ LABELS "TEST-CONFIG"
+ OUTPUT_NAME ${TARGET_NAME}
+ )
\ No newline at end of file
--- /dev/null
+{
+ "id": "http://iot.bzh/download/public/schema/json/ctl-schema.json#",
+ "$schema": "http://iot.bzh/download/public/schema/json/ctl-schema.json#",
+ "metadata": {
+ "uid": "Test",
+ "version": "1.0",
+ "api": "aft-persistence",
+ "info": "AFB-test binding configuration file to test persistence api.",
+ "require": [
+ "persistence"
+ ]
+ },
+ "testVerb": {
+ "uid": "launch_all_tests",
+ "info": "Launch all the tests",
+ "action": "lua://AFT#_launch_test",
+ "args": {
+ "trace": "persistence",
+ "files": ["persistence_BasicAPITest.lua"]
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+###########################################################################
+# Copyright 2018 IoT.bzh
+#
+# author:Frédéric Marec <frederic.marec@iot.bzh>
+#
+# 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.
+###########################################################################
+
+##################################################
+# Data persistence test configuration files
+##################################################
+PROJECT_TARGET_ADD(data-files)
+
+ file(GLOB DATA_FILES "*.json")
+ add_input_files("${DATA_FILES}")
+
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ LABELS "TEST-DATA"
+ OUTPUT_NAME ${TARGET_NAME}
+ )
--- /dev/null
+{"test":
+ {
+ "test":"test"
+ }
+}
\ No newline at end of file
--- /dev/null
+###########################################################################
+# Copyright 2018 IoT.bzh
+#
+# author:Frédéric Marec <frederic.marec@iot.bzh>
+#
+# 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.
+###########################################################################
+
+
+##################################################
+# Data persistence Lua Scripts
+##################################################
+PROJECT_TARGET_ADD(test-files)
+
+ file(GLOB LUA_FILES "*.lua")
+ add_input_files("${LUA_FILES}")
+
+ SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES
+ LABELS "TEST-DATA"
+ OUTPUT_NAME ${TARGET_NAME}
+ )
\ No newline at end of file
--- /dev/null
+--[[
+ Copyright (C) 2018 "IoT.bzh"
+ Author Frédéric Marec <frederic.marec@iot.bzh>
+
+ 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.
+
+
+ NOTE: strict mode: every global variables should be prefixed by '_'
+--]]
+
+local testPrefix ="persistence_BasicAPITest_"
+
+-- This tests the 'insert' verb of the persistence API
+_AFT.testVerbStatusSuccess(testPrefix.."insert","persistence","insert", {key="TEST", value="myvalue"}, nil,
+ function()
+ _AFT.callVerb("persistence", "delete", {key="TEST"})
+ end)
+
+-- This tests the 'delete' verb of the persistence API
+_AFT.testVerbStatusSuccess(testPrefix.."delete","persistence","delete", {key="TEST"},
+ function()
+ _AFT.callVerb("persistence", "insert", {key="TEST", value="myvalue"})
+ end, nil)
+
+-- This tests the 'update' verb of the persistence API
+_AFT.testVerbStatusSuccess(testPrefix.."update","persistence","update", {key="TEST", value="test"},
+ function()
+ _AFT.callVerb("persistence", "insert", {key="TEST", value="myvalue"})
+ end,
+ function()
+ _AFT.callVerb("persistence", "delete", {key="TEST"})
+ end)
+
+-- This tests the 'read' verb of the persistence API
+_AFT.testVerbStatusSuccess(testPrefix.."read","persistence","read", {key="TEST"},
+ function()
+ _AFT.callVerb("persistence", "insert", {key="TEST", value="myvalue"})
+ end,
+ function()
+ _AFT.callVerb("persistence", "delete", {key="TEST"})
+ end)
+
+-- This tests the 'read' verb of the persistence API
+_AFT.testVerbStatusError(testPrefix.."read-unknow-value","persistence","read", {key="TEST"}, nil, nil)
+
+-- This tests the 'insert' verb of the persistence API
+_AFT.testVerbStatusError(testPrefix.."insert-without-value","persistence","insert", {key="TEST"}, nil,
+ function()
+ _AFT.callVerb("persistence", "delete", {key="TEST"})
+ end)
+
+-- This tests the 'delete' verb of the persistence API
+_AFT.testVerbStatusError(testPrefix.."delete-unknow-key","persistence","delete", {key="TEST"}, nil, nil)
+
+-- This tests the 'insert' verb of the persistence API
+_AFT.testVerbStatusError(testPrefix.."insert-with-anything","persistence","insert", {value="talenka"}, nil, nil)
+
+-- This tests the 'update' verb of the persistence API
+_AFT.testVerbStatusError(testPrefix.."update-unkwon-null-value","persistence","update", {key=null}, nil, nil)
+
+_AFT.exitAtEnd()