2014-07-04 17:12:00 +02:00
2019-11-13 14:31:08 +01:00
< script type = "text/html" data-template-name = "sqlitedb" >
2014-07-04 17:12:00 +02:00
< div class = "form-row" >
2014-07-27 17:09:50 +02:00
< label for = "node-config-input-db" > < i class = "fa fa-database" > < / i > Database< / label >
2014-07-04 17:12:00 +02:00
< input type = "text" id = "node-config-input-db" placeholder = "/tmp/sqlite" >
< / div >
2018-08-11 15:03:16 +02:00
< div class = "form-row" >
< label for = "node-config-input-mode" > Mode< / label >
< select id = "node-config-input-mode" style = "width:70%" >
< option value = "RWC" > Read-Write-Create< / option >
< option value = "RW" > Read-Write< / option >
< option value = "RO" > Read-Only< / option >
< / select >
< / div >
< div class = "form-tips" > < b > Note< / b > : Setting the database name to < code > :memory:< / code >
will create a non-persistant in memory database.< / div >
2014-07-04 17:12:00 +02:00
< / script >
< script type = "text/javascript" >
RED.nodes.registerType('sqlitedb',{
category: 'config',
defaults: {
2018-08-11 15:03:16 +02:00
db: {value:"", required:true},
mode: {value:"RWC"}
2014-07-04 17:12:00 +02:00
},
label: function() {
return this.db;
}
});
< / script >
2019-11-13 14:31:08 +01:00
< script type = "text/html" data-template-name = "sqlite" >
2018-03-20 20:04:23 +01:00
< 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 >
2014-07-04 17:12:00 +02:00
< div class = "form-row" >
2014-07-27 17:09:50 +02:00
< label for = "node-input-mydb" > < i class = "fa fa-database" > < / i > Database< / label >
2014-07-04 17:12:00 +02:00
< input type = "text" id = "node-input-mydb" >
< / div >
< div class = "form-row" >
2018-03-20 20:04:23 +01:00
< label for = "" > < i class = "fa fa-code" > < / i > SQL Query< / label >
< select id = "node-input-sqlquery" >
< option value = "msg.topic" > Via msg.topic< / option >
< option value = "fixed" > Fixed Statement< / option >
< option value = "prepared" > Prepared Statement< / option >
2018-07-19 13:33:43 +02:00
< option value = "batch" > Batch without response< / option >
2018-03-20 20:04:23 +01:00
< / select >
< / div >
< div class = "form-row" style = "margin-bottom: 0px;" >
< label for = "" style = "width: unset;" id = "node-input-sqllabel" > < i class = "fa fa-code" > < / i > SQL Statement< / label >
< / div >
< div >
< input type = "hidden" id = "node-input-sql" autofocus = "autofocus" >
< / div >
< div class = "form-row node-text-editor-row" >
< div style = "height: 250px; min-height:150px;" class = "node-text-editor" id = "node-input-sql-editor" > < / div >
2014-07-04 17:12:00 +02:00
< / div >
< / script >
2019-11-13 14:31:08 +01:00
< script type = "text/html" data-help-name = "sqlite" >
2018-03-20 20:04:23 +01:00
< p > Allows access to a Sqlite database.< / p >
< p > SQL Query sets how the query is passed to the node.< / p >
< p > SQL Query < i > Via msg.topic< / i > and < i > Fixed Statement< / i > uses the < b > db.all< / b > operation against the configured database. This does allow INSERTS, UPDATES and DELETES.
2016-03-02 14:27:22 +01:00
By its very nature it is SQL injection... so < i > be careful out there...< / i > < / p >
2018-03-20 20:04:23 +01:00
< p > SQL Type < i > Prepared Statement< / i > also uses < b > db.all< / b > but sanitizes parameters passed, eliminating the possibility of SQL injection.< / p >
2018-07-19 13:33:43 +02:00
< p > SQL Type < i > Batch without response< / i > uses < b > db.exec< / b > which runs all SQL statements in the provided string. No result rows are returned.< / p >
< p > When using < i > Via msg.topic< / i > or < i > Batch without response< / i > < code > msg.topic< / code > must hold the < i > query< / i > for the database.< / p >
2018-03-20 20:04:23 +01:00
< p > When using Normal or Prepared the < i > query< / i > must be entered in the node config.< / p >
< p > Pass in the parameters as an object in < code > msg.params< / code > for Prepared. Ex:< br / >
< code > msg.params = {< br / >
$id:1,< br / >
$name:"John Doe"< br / >
}< / code > < br / >
Parameter object names must match parameters set up in the Prepared Statement. If you get the error < code > SQLITE_RANGE: bind or column index out of range< / code >
be sure to include $ on the parameter object key.< / p >
< p > Using any SQL Query, the result is returned in < code > msg.payload< / code > < / p >
2014-07-04 17:12:00 +02:00
< p > Typically the returned payload will be an array of the result rows, (or an error).< / p >
2018-08-22 14:58:55 +02:00
< p > You can load sqlite extensions by inputting a < code > msg.extension< / code > property containing the full
path and filename.< / p >
2014-07-04 17:12:00 +02:00
< p > The reconnect timeout in milliseconds can be changed by adding a line to < b > settings.js< / b >
< pre > sqliteReconnectTime: 20000,< / pre > < / p >
< / script >
2019-11-13 14:31:08 +01:00
< script type = "text/html" data-help-name = "sqlitedb" >
2019-02-01 09:57:01 +01:00
< p > The default directory for the database file is the user's home directory through which the NR process was started. You can specify absolute path to change it.< / p >
< / script >
2014-07-04 17:12:00 +02:00
< script type = "text/javascript" >
RED.nodes.registerType('sqlite',{
category: 'storage-input',
color:"#e97b00",
defaults: {
mydb: {type:"sqlitedb",required:true},
2018-03-20 20:04:23 +01:00
sqlquery: {value:"msg.topic",required:true},
sql: {value:""},
2014-07-04 17:12:00 +02:00
name: {value:""}
},
inputs:1,
outputs:1,
icon: "sqlite.png",
label: function() {
var dbNode = RED.nodes.node(this.mydb);
return this.name||(dbNode?dbNode.label():"sqlite");
},
2018-03-20 20:04:23 +01:00
labelStyle: function() {
2014-07-04 17:12:00 +02:00
return this.name?"node_label_italic":"";
2018-03-20 20:04:23 +01:00
},
oneditprepare: function() {
var ace = this;
this.editor = RED.editor.createEditor({
id: 'node-input-sql-editor',
mode: 'ace/mode/sql',
value: $("#node-input-sql").val(),
globals: {
msg:true,
context:true,
RED: true,
util: true,
flow: true,
global: true,
console: true,
Buffer: true,
setTimeout: true,
clearTimeout: true,
setInterval: true,
clearInterval: true
}
});
2018-08-11 15:03:16 +02:00
2018-03-20 20:04:23 +01:00
$("#node-input-sqlquery").change(function() {
2018-07-19 13:33:43 +02:00
if ($("#node-input-sqlquery").val() == "msg.topic" || $("#node-input-sqlquery").val() == "batch"){
2018-03-20 20:04:23 +01:00
$("#node-input-sqllabel").hide();
$("#node-input-sql-editor").hide();
}
else{
$("#node-input-sqllabel").show();
$("#node-input-sql-editor").show();
ace.editor.renderer.updateFull();
}
});
$("#node-input-sqlquery").change();
},
oneditsave: function() {
$("#node-input-sql").val(this.editor.getValue());
this.editor.destroy();
delete this.editor;
},
oneditresize: function(size) {
var rows = $("#dialog-form>div:not(.node-text-editor-row)");
var height = $("#dialog-form").height();
for (var i=0; i< rows.size ( ) ; i + + ) {
height -= $(rows[i]).outerHeight(true);
}
var editorRow = $("#dialog-form>div.node-text-editor-row");
height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
$(".node-text-editor").css("height",height+"px");
this.editor.resize();
2014-07-04 17:12:00 +02:00
}
});
< / script >