You may all know that JSON is a subset of JavaScript, but… Did you know that HTML5 implements NoSQL databases? Did you know that JavaScript was recommended for REST by HTTP co-creator Roy T. Fielding himself? Did you know that map & reduce are part of the native JavaScript API? Did you know that most NoSQL solutions integrate a JavaScript engine? CouchDB, MongoDB, WakandaDB, ArangoDB, OrientDB, Riak…. And when they don’t, they have a shell client which does. The story of NoSQL and JavaScript goes beyond your expectations and opens more opportunities than you might imagine… What better match could you find than a flexible and dynamic language for schemaless databases? Isn’t an event-driven language what you’ve been waiting for to manage consistency? When NoSQL doesn’t come to JavaScript, JavaScript comes to NoSQL. And does it very well.
4. NoSQL Facts
Mostly Schemaless
Often with REST / JSON API
Many store JSON
Many embed a JavaScript engine
Map / Reduce
events
Many propose a JavaScript Shell
6. JavaScript Facts
Created in 1995
Running in Netscape Server in 1996, and then in IIS
Mostly Event-Driven
Recommended in the REST definition in 2000
Integrated in CouchDB in 2007
HTML5 Datastores appeared in 2009
8. JavaScript & Databases
Netscape Enterprise Server
Microsoft: JScript, JScript.NET, ActiveX
Mozilla Rhino
JSDB
APE Project
W3C Web SQL
9. Netscape Enterprise Server
SQLTable() pool = new DbPool("ORACLE", addr, user, pwd, "", 5, true);
connection = pool.connection("A connection");
cursor = connection.cursor("select name from customer");
DbPool if ( cursor && (connection.majorErrorCode() == 0) ) {
// Get the first row
cursor.next();
start/home.html
// Display the values
write("<B>Customer Name:</B> " + cursor.name + "<BR>");
//Close the cursor
cursor.close();
}
Shared Connections
Note: Netscape Enterprise Server merged with Javagator to become iPlanet
10. MS JScript on the server
conn = Server.CreateObject("ADODB.Connection");
Active Server Page conn.Open(dsn, login, password);
reccordset = conn.Execute(sqlQuery);
result = [];
runat=”server” while (!reccordset.EOF) {
result.push({
Windows Script Hosting
field1: reccordset("field1"),
field2: reccordset("field2")
});
rsAuthor2.MoveNext;
.NET }
conn.Close();
conn = null;
Note: JScript is running on Microsoft IIS since 1997
11. MS JScript in the Browser
var connection = new ActiveXObject("ADODB.Connection");
connection.Open(dsn, login, password);
ActiveXObject
var reccordset = new ActiveXObject("ADODB.Recordset");
reccordset.Open(sqlQuery, connection);
reccordset.MoveFirst;
only IE while(!reccordset.eof) {
document.write(reccordset.fields(1));
reccordset.movenext;
}
reccordset.close;
connection.close;
12. Mozilla Rhino
importPackage(java.sql);
java.lang.Class.forName("org.sqlite.JDBC");
Java environment conn = DriverManager.getConnection("jdbc:sqlite:test.db");
stat = conn.createStatement();
resultSet = stat.executeQuery("select * from people;");
Access to JDBC while (resultSet.next()){
print(
resultSet.getString("name") +
" - " +
ex: RingoJS
resultSet.getString("occupation")
);
}
resultSet.close();
stat.close();
conn.close();
https://developer.mozilla.org/en-US/docs/Rhino
13. JSDB
var db = new ODBC(dsn);
var result = db.query("select * from mytable");
SpiderMonkey var searcher = new Index;
for (var i=1; i <= result.count; i++)
{
searcher.add(result.get('NAME'));
Shell
}
var i = searcher.find('Mr. Smith');
var r = result.getRow(i + 1);
JS Server writeln('Data for Mr. Smith');
writeln(r.toString());
db.close();
http://www.jsdb.org/
14. APE Project
var sql = new Ape.MySQL(ip + ":3306", user, password, db);
Ape.registerCmd('foo', true, function(params, cmd) {
Real Time Web cmd.user.sendRaw(
'bar', {
hello: 'world',
Comet );
}
echo: params.ping
sql.query(
Web Sockets 'INSERT INTO table(log) VALUES("' +
Ape.MySQL.escape(params.ping) +
'")',
function(res, errorNo) {
MySQL
Ape.log('Inserted ' + this.getInsertId());
}
);
});
Note: APE means “Ajax Push Engine”
http://www.ape-project.org/
15. W3C Web SQL
HTML5 var db = openDatabase('mydb', '1.0', 'my first db', 2 * 1024 * 1024);
Safari
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)');
tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "synergies")');
});
Chrome tx.executeSql('SELECT * FROM foo', [], function (tx, results) {
for (var i = 0, len = results.rows.length; i < len; i++) {
alert(results.rows.item(i).text);
Opera }
});
Sync / Async
result = x.executeSqlSync('SELECT * FROM foo');
for (var i = 0, len = results.rows.length; i < len; i++) {
alert(results.rows.item(i).text);
}
Note: standard paused because current implementations are only based on SQLite
http://html5doctor.com/introducing-web-sql-databases/
21. Web Storage
W3C / WHATWG // set or get items by methods
localStorage.setItem("storedItem", "value");
var value = localStorage.getItem("storedItem");
HTML5 // set or get items using the store as a map
localStorage.storedItem = value;
var value = localStorage.storedItem;
local // accessible only for this session
var foo = sessionStorage.bar;
session
sessionStorage.bar = foo;
// sync interface when data change, even from other window
window.addEventListener("storage", handle_storage, false);
events
Note: Firefox also implement “globalStorage”, and Wakanda “user.storage”
http://www.w3.org/TR/webstorage/
22. Riak
{"inputs": "goog",
Buckets "query": [
{"map": {"language": "javascript",
"source": "function(value, keyData, arg){...}"
}},
REST / JSON
{"reduce": {"language": "javascript",
"source": "function(values, arg){...}",
"keep": true
}}
]
Map / Reduce }
// Map: compute the daily variance, key it by the month
Erlang alternative:
function(value, keyData, arg){
var data = Riak.mapValuesJson(value)[0];
var month = value.key.split('-').slice(0,2).join('-');
var obj = {};
obj[month] = data.High - data.Low;
SpiderMonkey }
return [ obj ];
// Reduce: find the maximum variance per month
function(values, arg) {
return [values.reduce(function(acc, item){
for (var month in item) {
acc[month] = acc[month] ? Math.max(item[month], acc[month]) : item[month];
}
return acc;
})];
}
http://wiki.basho.com/MapReduce-Implementation.html