UNPKG

node-red-contrib-leveldb-hyper-ttl

Version:

Support for live backup, TTL, streams, batch - LevelDB database

459 lines (411 loc) 20.5 kB
<!-- Copyright 2013 IBM Corp. 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. 06 Oct - 2015 added TTL, Readers and Batch support. by min0n 08 Mar - 2016 added live backup using level-hyper. by jonn26 --> <script type="text/x-red" data-template-name="leveldbttlbase"> <div class="form-row"> <label for="node-config-input-db"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-config-input-db" placeholder="database path/name"> </div> <div class="form-row"> <label for="node-config-input-defaultttl"><i class="fa fa-briefcase"></i> Default TTL</label> <input type="number" id="node-config-input-defaultttl" min="0" placeholder="0s - disable def TTL"> </div> <div class="form-row"> <label for="node-config-input-checkfreq"><i class="fa fa-briefcase"></i> TTL scan</label> <input type="number" id="node-config-input-checkfreq" min="1" placeholder="10s - def check freq"> </div> <div class="form-tips" id="defaultttl-tip"><span>Default TTL value in seconds for all the keys(0 disabled). This can be overriden.</span></div> <div class="form-tips" id="checkfreq-tip"><span>Level TTL uses an internal scan every 10 seconds by default.</span></div> </script> <script type="text/javascript"> RED.nodes.registerType('leveldbttlbase',{ category: 'config', defaults: { db: {value:"",required:true}, defaultttl: {value:0,required:true,validate:RED.validators.number()}, checkfreq: {value:10,required:true,validate:RED.validators.number()} }, label: function() { return this.db; } }); </script> <script type="text/x-red" data-template-name="leveldb-ttl in"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> </script> <script type="text/x-red" data-help-name="leveldb-ttl in"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>Use this node to <b>get</b>, or retrieve the data already saved in the database.</p> <p><b>msg.topic</b> must hold the <i>key</i> for the database, and the result is returned in <b>msg.payload</b>.</p> <p>If nothing is found for the key then <b>msg.payload</b> is set to the <i>null</i> object.</p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl in',{ category: 'storage-input', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, name: {value:""} }, inputs:1, outputs:1, icon: "leveldb.png", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <script type="text/x-red" data-template-name="leveldb-ttl out"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-operation"><i class="fa fa-wrench"></i> Operation</label> <select type="text" id="node-input-operation" style="display: inline-block; vertical-align: top;"> <option value="store">Store</option> <option value="delete">Delete</option> </select> </div> <div class="form-row"> <label for="node-input-nodettl"><i class="fa fa-briefcase"></i> Node TTL</label> <input type="number" id="node-input-nodettl" min="0" placeholder="0s - disable node TTL"> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodettl-tip"><span>Node TTL overrides default TTL if any.(0 sec disabled)</span></div> <div class="form-tips" id="nodettl-tip2"><span>Node TTL can be overriden by msg.ttl</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl out"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>Use this node to either <b>put</b> (store) the <b>msg.payload</b> to the named database file, using <b>msg.topic</b> as the key. Optionally <b>msg.tll</b> overrides node ttl, or the default ttl, if any. </p> <p>To <b>delete</b> information select delete in the properties dialogue and again use <b>msg.topic</b> as the key.</b>.</p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl out',{ category: 'storage-output', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, operation: {value:"store"}, name: {value:""}, nodettl: {value:0,required:true,validate:RED.validators.number()}, //Overrides default TTL if any. 0-disable node TTL. }, inputs:1, outputs:0, icon: "leveldb.png", align: "right", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <!-- 08 Mar 2016: backup node added --> <script type="text/x-red" data-template-name="leveldb-ttl backup"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-backup"><i class="fa fa-briefcase"></i> Backup Name</label> <input type="text" id="node-input-backup"> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodettl-tip"><span>A successful live backup will result in a backup folder named backup-:<b>name</b> inside the location folder of the current database.</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl backup"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>Use this node to perform a <b>live backup</b> of the database. The <b>name</b> parameter is a String. A successful live backup will result in a backup folder named backup-:<b>name</b> inside the location folder of the current database. The backup name can be set by the <b>msg.payload</b> or in the properties of this node which overrides anything specified in the <b>msg.payload</b>.</p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl backup',{ category: 'storage-output', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, backup: {value:""}, name: {value:""}, }, inputs:1, outputs:0, icon: "leveldb.png", align: "right", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <!-- 06 Oct 2015: new nodes added --> <script type="text/x-red" data-template-name="leveldb-ttl stream"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-stype"><i class="fa fa-wrench"></i> Stream type</label> <select type="text" id="node-input-stype" style="display: inline-block; vertical-align: top;"> <option value="keys">KeyStream</option> <option value="values">ValueStream</option> <option value="read">ReadStream</option> </select> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodestype-tip"><span>The ReadStream type includes keys and values.</span></div> <div class="form-tips" id="nodestype-tip2"><span>The stream type can be overriden by msg.payload</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl stream"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>Use this node to <a href="https://github.com/Level/levelup#dbcreatereadstreamoptions" target="_new"><i>obtain a ReadStream, KeyStream or ValueStream</i></a> of the database.</p> <p><b>msg.payload</b> can hold the <i>options object</i> to control the range of keys that are streamed, and the results are returned in <b>msg.payload</b>. If no options are passed, then all the database is streamed.</p> <p>example: msg.payload = {start: 'key1~', end: 'key1~~'} </p> <p>If nothing is found <b>msg.payload</b> is set to the <i>null</i> object.</p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl stream',{ category: 'storage-input', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, stype: {value:"read"}, name: {value:""} }, inputs:1, outputs:1, icon: "leveldb.png", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <script type="text/x-red" data-template-name="leveldb-ttl stream2"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-stype"><i class="fa fa-wrench"></i> Stream type</label> <select type="text" id="node-input-stype" style="display: inline-block; vertical-align: top;"> <option value="keys">KeyStream</option> <option value="values">ValueStream</option> <option value="read">ReadStream</option> </select> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodestype-tip"><span>The ReadStream type includes keys and values.</span></div> <div class="form-tips" id="nodestype-tip2"><span>The stream type can be overriden by msg.payload</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl stream2"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>This node returns just one msg.payload with all the results<p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl stream2',{ category: 'storage-input', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, stype: {value:"read"}, name: {value:""} }, inputs:1, outputs:1, icon: "leveldb.png", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <script type="text/x-red" data-template-name="leveldb-ttl keyttl"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-operation"><i class="fa fa-wrench"></i> Operation</label> <select type="text" id="node-input-operation" style="display: inline-block; vertical-align: top;"> <option value="store">Store</option> <option value="delete">Delete</option> </select> </div> <div class="form-row"> <label for="node-input-nodettl"><i class="fa fa-briefcase"></i> Node TTL</label> <input type="number" id="node-input-nodettl" min="0" placeholder="0s-disable node TTL"> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodettl-tip"><span>Node TTL overrides default TTL if any.(0 sec disabled)</span></div> <div class="form-tips" id="nodettl-tip2"><span>Node TTL can be overriden by msg.ttl</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl keyttl"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>This node can serve to insert or update a ttl for any given key from <b>msg.topic</b> in the database (even if that key doesn't exist but may in the future as described at <a href="https://github.com/Level/level-ttl" target="_new"><i>LevelDB-TTL</i></a> </p> <p>Node TTL can be overriden by passing <b>msg.ttl</b></p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl keyttl',{ category: 'storage-output', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, operation: {value:"store"}, name: {value:""}, nodettl: {value:0,required:true,validate:RED.validators.number()}, //Overrides default TTL if any. 0-disable key TTL. }, inputs:1, outputs:0, icon: "leveldb.png", align: "right", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <script type="text/x-red" data-template-name="leveldb-ttl batchout"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-nodettl"><i class="fa fa-briefcase"></i> Node TTL</label> <input type="number" id="node-input-nodettl" min="0" placeholder="0s-disable node TTL"> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodettl-tip"><span>Node TTL overrides default TTL if any.(0 sec disabled)</span></div> <div class="form-tips" id="nodettl-tip2"><span>Node TTL can be overriden by msg.ttl</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl batchout"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>Use this node to <b>batch</b>the <b>msg.payload</b> array object to the named database. The array batch object is described at <a href="https://github.com/Level/levelup#dbbatcharray-options-callback-array-form" target="_new"><i>levelup docs</i></a>. Optionally <b>msg.tll</b> overrides node ttl, or the default ttl, if any. </p> <p>example of batch object: msg.payload = [{type:'del', key: 'k1'}, {type:'put', key: 'k2' , value: 'v2'}]</p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl batchout',{ category: 'storage-output', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, name: {value:""}, nodettl: {value:0,required:true,validate:RED.validators.number()}, //Overrides default TTL if any. 0-disable node TTL. }, inputs:1, outputs:0, icon: "leveldb.png", align: "right", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script> <script type="text/x-red" data-template-name="leveldb-ttl batchout2"> <div class="form-row node-input-level"> <label for="node-input-level"><i class="fa fa-briefcase"></i> Database</label> <input type="text" id="node-input-level"> </div> <div class="form-row"> <label for="node-input-batchsize"><i class="fa fa-briefcase"></i> Batch size</label> <input type="number" id="node-input-batchsize" min="1" placeholder="number of db operations"> </div> <div class="form-row"> <label for="node-input-nodettl"><i class="fa fa-briefcase"></i> Node TTL</label> <input type="number" id="node-input-nodettl" min="0" placeholder="0s-disable node TTL"> </div> <div class="form-row"> <label for="node-input-name"><i class="fa fa-tag"></i> Name</label> <input type="text" id="node-input-name" placeholder="Name"> </div> <div class="form-tips" id="nodettl-tip"><span>Node TTL overrides default TTL if any.(0 sec disabled)</span></div> </script> <script type="text/x-red" data-help-name="leveldb-ttl batchout2"> <p>Uses <a href="https://code.google.com/p/leveldb/" target="_new"><i>LevelDB</i></a> for a simple key value pair database.</p> <p>This node keeps in memory <i>batchsize</i> msg.payloads before doing the batch operation to the database. The array batch object is described at <a href="https://github.com/Level/levelup#dbbatcharray-options-callback-array-form" target="_new"><i>levelup docs</i></a>.</p> <p>example of msg.payload = {type:'put', key: 'k2' , value: 'v2'}</p> </script> <script type="text/javascript"> RED.nodes.registerType('leveldb-ttl batchout2',{ category: 'storage-output', color:"#dbb84d", defaults: { level: {type:"leveldbttlbase",required:true}, name: {value:""}, batchsize: {value:1,required:true,validate:RED.validators.number()}, //number of msg to keep before doing the batch nodettl: {value:0,required:true,validate:RED.validators.number()}, //Overrides default TTL if any. 0-disable node TTL. }, inputs:1, outputs:0, icon: "leveldb.png", align: "right", label: function() { var levelNode = RED.nodes.node(this.level); return this.name||(levelNode?levelNode.label():"leveldb"); }, labelStyle: function() { return this.name?"node_label_italic":""; } }); </script>