SlideShare a Scribd company logo
1 of 41
Download to read offline
NoSQL & JavaScript
  a Love Story!
    by Alexandre Morgaut




       TakeOff Conf - Lille 2013
Presentation
  W3C AC member
  Wakanda Community
  Web Architect
  JS Expert
  REST Lover
  NoSQL Fanboy
 @amorgaut
NoSQL facts
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
NoSQL Families
Document Store            Object store



                  Graph


Key-value store           Column store
NoSQL Families
Document Store            Object store



                  Graph


Key-value store           Column store
NoSQL Families
Document Store            Object store



                  Graph


Key-value store           Column store
JavaScript facts
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
JavaScript Engines
                                                                                                                                                C+
                                         C                                                                                                        +
 SpiderMonkey                                                       webkit JavaScriptCore: JSC
            3 JIT Compilers:                                                  SquirrelFish Extreme: SFX aka Nitro
             TraceMonkey,                                                               (JIT Compiler inside)
             JägerMonkey,
               IonMonkey


                                  Jav                                                                               C+
                                     a                                                                                +
            Rhino                                                                                         V8
  Interpreted or Compiled execution                                                               JIT Compiler: CrankShaft


Nashorn?
                                                                                                  ?
                                             Trident: MSHTML
                                                  Chakra
                                             -> Classic JScript, Managed JScript, & JScript.NET
                               C+                                                                                                   ?
                                 +
             Tamarin                                                                                             Carakan
       JIT Compiler: NanoJIT
      -> ActionScript / “ECMAScript 4”
                                                                                                      Previously: Linear A, Linear B, Futhark
Server-Side JavaScript
SpiderMonkey            JavaScriptCore




   Rhino                      V8


           Trident / Chakra
JavaScript & Databases
JavaScript & Databases
Netscape Enterprise Server
Microsoft: JScript, JScript.NET, ActiveX
Mozilla Rhino
JSDB
APE Project
W3C Web SQL
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();
                                        // Display the values
                                        write("<B>Customer Name:</B> " + cursor.name + "<BR>");

start/home.html                      }
                                        //Close the cursor
                                        cursor.close();




Shared Connections

   Note: Netscape Enterprise Server merged with Javagator to become iPlanet
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({
                                                    field1: reccordset("field1"),
                                                    field2: reccordset("field2")

Windows Script Hosting                          });
                                                rsAuthor2.MoveNext;

                                            }



.NET
                                            conn.Close();
                                            conn = null;




          Note: JScript is running on Microsoft IIS since 1997
MS JScript in the Browser

                var connection = new ActiveXObject("ADODB.Connection");
                  
                connection.Open(dsn, login, password);
                var reccordset = new ActiveXObject("ADODB.Recordset");

ActiveXObject
                 
                reccordset.Open(sqlQuery, connection);
                reccordset.MoveFirst;

                while(!reccordset.eof) {

   only IE      }
                   document.write(reccordset.fields(1));
                   reccordset.movenext;

                 
                reccordset.close;
                connection.close;
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;");

                                   while (resultSet.next()){

Access to JDBC                         print(
                                           resultSet.getString("name") +
                                           " - " +
                                           resultSet.getString("occupation")
                                       );

ex: RingoJS
                                   }

                                   resultSet.close();
                                   stat.close();
                                   conn.close();




                   https://developer.mozilla.org/en-US/docs/Rhino
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);

                                writeln('Data for Mr. Smith');
                                writeln(r.toString());

JS Server                       db.close();




               http://www.jsdb.org/
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',
                                                echo: params.ping

   Comet
                                            }
                                        );

                                        sql.query(
                                            'INSERT INTO table(log) VALUES("' +


   Web Sockets
                                            Ape.MySQL.escape(params.ping) +
                                            '")',
                                            function(res, errorNo) {
                                                Ape.log('Inserted ' + this.getInsertId());
                                            }


MySQL
                                        );
                                 });




                Note: APE means “Ajax Push Engine”
                          http://www.ape-project.org/
W3C Web SQL

HTML5                   var db = openDatabase('mydb', '1.0', 'my first db', 2 * 1024 * 1024);



                      db.transaction(function (tx) {

    Safari              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                              result = x.executeSqlSync('SELECT * FROM foo');
                                       for (var i = 0, len = results.rows.length; i < len; i++) {
                                         alert(results.rows.item(i).text);

Sync / Async                           }




 Note: standard paused because current implementations are only based on SQLite
                          http://html5doctor.com/introducing-web-sql-databases/
Data as a Service (DaaS)
Data as a Service
                    Amazon APIs
   OData
            APP

   GData          Twitter APIs
Touching the DB heart
Touching the DB Heart

Key-Value: Web Storage, Riak

Document: CouchDB, MongoDB, IndexedDB

Object: JavaScriptDB, WakandaDB

Multi-Model: OrientDB & ArangoDB
Key - Value
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;
                                                           sessionStorage.bar = foo;



session                                 // sync interface when data change, even from other window
                                        window.addEventListener("storage", handle_storage, false);




events
Note: Firefox used to propose “globalStorage”, Wakanda implements “user.storage”
                               http://www.w3.org/TR/webstorage/
Riak
 Buckets
                                   {"inputs": "goog",
                                     "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
                                function(value, keyData, arg){

 Erlang alternative:              var data = Riak.mapValuesJson(value)[0];
                                  var month = value.key.split('-').slice(0,2).join('-');
                                  var obj = {};
                                  obj[month] = data.High - data.Low;
                                  return [ obj ];


    SpiderMonkey
                                }



           // 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;
             })];
           }
Document
IndexedDB
W3C / WHATWG
                                            var request = indexedDB.open("MyTestDatabase", 3);



                                                    request.onerror =    function(event) {
                                                       // Do something   with request.errorCode!

   HTML5                                            };
                                                    request.onsuccess
                                                       // Do something
                                                                         = function(event) {
                                                                         with request.result!
                                                    };


Sync / Async                                        request.onupgradeneeded = function(event) {
                                                       // Update object stores and indices ....
                                                    }


Indexes           var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });

                  objectStore.createIndex("name", "name", { unique: false });


Transactions
                  objectStore.add({ ssn: "444-44-4444", name: "Bill", age: 35});




               var transaction = db.transaction(["customers"], IDBTransaction.READ_WRITE);

Cursors
                        http://www.w3.org/TR/IndexedDB/
CouchDB
                      function(doc) {
                        if (doc.Type == "customer") {
                          emit(doc.LastName, {FirstName: doc.FirstName, Addr: doc.Address});
                          emit(doc.FirstName, {LastName: doc.LastName, Addr: doc.Address});

Views                 }
                        }




JSON*
                                         {
                                              "total_rows":2,
                                              "offset":0,
                                              "rows":
                                              [


Map / Reduce
                                                {
                                                  "id":"64ACF01B05F53ACFEC48C062A5D01D89",
                                                  "key":"Katz",
                                                  "value":{"FirstName":"Damien", "Addr":"Charlotte NC"}
                                                },
                                                {

Erlang alternative:                               "id":"64ACF01B05F53ACFEC48C062A5D01D89",
                                                  "key":"Damien",
                                                  "value":{"LastName":"Katz", "Addr":"Charlotte NC"}
                                                },
                                              ]

   Spidermonkey                          }




         Note: CouchDB moved from XML to JSON & JS in 2007*
                             http://wiki.apache.org/couchdb/HTTP_view_API
                * http://jan.prima.de/~jan/plok/archives/89-CouchDb-updates.html
CouchBase

CouchDB alternative
   using V8
   adding memcache
   meant to be more scalable

                      http://www.couchbase.com/
MongoDB
                                          { text: "lmao! great article!",

Spidermonkey                              }
                                            author: 'kbanker',
                                            votes: 2




BSON                                              var map = function() {
                                                     emit(this.author, {votes: this.votes});
                                                  };


Map / Reduce                                          // Add up all the votes for each key.
                                                      var reduce = function(key, values) {
                                                         var sum = 0;

REST / JSON                                              values.forEach(function(doc) {
                                                           sum += doc.votes;
                                                         });
                                                         return {votes: sum};
                                                      };


REST / JS
               var op = db.comments.mapReduce(map, reduce, {out: "mr_results"});


Shell
               http://www.mongodb.org/display/DOCS/MapReduce
Object
Persevere JavaScriptDB
                                                            var d = new Data();
                                                            d.test = 12345;




Rhino
                                                                        {"id":"generated.js",
                                                                        "sources":[
                                                                          {
                                                                            "name":"Data",
                                                                            "extends":"Object",

REST / JSON                                                                 "schema":{
                                                                               "extends":{"$ref":"../Class/Object"},
                                                                               hello : function() {
                                                                                  console.log("hello hi");
                                                                               },

JSON Schema                                                                  }
                                                                               "prototype":{
                                                                               }

                                                                          }]


JSON Path
                                                                        }


                                                                curl localhost:8080/Data/1


JSON Query                                                      ({"id":"1","test":12345})


                                                            Data.hello(); // INFO: hi there


        http://www.sitepen.com/blog/2009/04/20/javascriptdb-perseveres-new-high-performance-storage-engine/
WakandaDB
 Webkit JavaScriptCore
 REST / JSON
 Data Classes
    auto-updatable
    accessors
                john = ds.Person.find("fistName eq John");

    events      conferences = john.allConferences;

                JohnJSConferences = conferences.filter("title eq :1", "*JavaScript*");


    methods     JSAttendeesJohnMet = JSConferences.allPeople;


                         http://wakanda.org/
Multi-Model
ArangoDB

V8                  actions.defineHttp({
                      url : "world",
                      context : "api",


     events
                        callback : function (req, res) {
                          var collection = db._collection(req.parameter.collection);

                           if (collection == null) {
                             ...


     filters
                           }
                           else {
                             ...
                           }



     transactions
                           actions.resultOk(req, res, actions.HTTP_OK, result);
                      }
                    });




Shell

                    http://www.ape-project.org/
OrientDB

rhino
                                                                 // create function getAllCustomer

REST / JSON
                                                                 return db.query("select from V")




transactions                                                          db.begin();
                                                                      try {
                                                                      "   // some code
                                                                      "   db.commit()

hooks (events)                                                        } catch (e) {
                                                                      "
                                                                      }
                                                                          db.rollback();"




stored procedures
new com.orientechnologies.orient.core.record.impl.ODocument('Profile').field('name', 'Luca').save()



                                      http://www.orientdb.org/
Reaching the DB
Reaching the DB
mongoose                       WAF (Wakanda)

mongodb-rhino                  Ext.data.proxy.Wakanda

riak control                   arango.client

backbone-couchdb               voltdb-client-nodejs

dojox.data.couchDBRestStore    redis-node-client

node-cassandra                 orientdb-api.js
Thank you!
Let’s keep in touch...

                                         Client & Server
    @amorgaut
                                         JavaScript APIs
    http://about.me/amorgaut   http://w3.org/community/jseverywhere/


    @wakandasoft                        @jseverywhere
    http://wakanda.org                  http://jseverywhere.org

More Related Content

What's hot

Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackGaryCoady
 
Morphia: Simplifying Persistence for Java and MongoDB
Morphia:  Simplifying Persistence for Java and MongoDBMorphia:  Simplifying Persistence for Java and MongoDB
Morphia: Simplifying Persistence for Java and MongoDBJeff Yemin
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDBJames Williams
 
What istheservicestack
What istheservicestackWhat istheservicestack
What istheservicestackDemis Bellot
 
Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBTobias Trelle
 
Cutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryCutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryWilliam Candillon
 
Using Grails to power your electric car
Using Grails to power your electric carUsing Grails to power your electric car
Using Grails to power your electric carMarco Pas
 
MongoDB 在盛大大数据量下的应用
MongoDB 在盛大大数据量下的应用MongoDB 在盛大大数据量下的应用
MongoDB 在盛大大数据量下的应用iammutex
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring DataAnton Sulzhenko
 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for CassandraEdward Capriolo
 
High Performance Core Data
High Performance Core DataHigh Performance Core Data
High Performance Core DataMatthew Morey
 
Grand Central Dispatch
Grand Central DispatchGrand Central Dispatch
Grand Central Dispatchcqtt191
 
Scalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDBScalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDBWilliam Candillon
 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaMongoDB
 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDBScott Hernandez
 
MongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaMongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaScott Hernandez
 
Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩HyeonSeok Choi
 

What's hot (19)

Http4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web StackHttp4s, Doobie and Circe: The Functional Web Stack
Http4s, Doobie and Circe: The Functional Web Stack
 
Morphia: Simplifying Persistence for Java and MongoDB
Morphia:  Simplifying Persistence for Java and MongoDBMorphia:  Simplifying Persistence for Java and MongoDB
Morphia: Simplifying Persistence for Java and MongoDB
 
Java development with MongoDB
Java development with MongoDBJava development with MongoDB
Java development with MongoDB
 
What istheservicestack
What istheservicestackWhat istheservicestack
What istheservicestack
 
Java Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDBJava Persistence Frameworks for MongoDB
Java Persistence Frameworks for MongoDB
 
Cutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQueryCutting Edge Data Processing with PHP & XQuery
Cutting Edge Data Processing with PHP & XQuery
 
Using Grails to power your electric car
Using Grails to power your electric carUsing Grails to power your electric car
Using Grails to power your electric car
 
MongoDB 在盛大大数据量下的应用
MongoDB 在盛大大数据量下的应用MongoDB 在盛大大数据量下的应用
MongoDB 在盛大大数据量下的应用
 
MongoDB + Java + Spring Data
MongoDB + Java + Spring DataMongoDB + Java + Spring Data
MongoDB + Java + Spring Data
 
Intravert Server side processing for Cassandra
Intravert Server side processing for CassandraIntravert Server side processing for Cassandra
Intravert Server side processing for Cassandra
 
High Performance Core Data
High Performance Core DataHigh Performance Core Data
High Performance Core Data
 
Grand Central Dispatch
Grand Central DispatchGrand Central Dispatch
Grand Central Dispatch
 
Scalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDBScalable XQuery Processing with Zorba on top of MongoDB
Scalable XQuery Processing with Zorba on top of MongoDB
 
Simplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with MorphiaSimplifying Persistence for Java and MongoDB with Morphia
Simplifying Persistence for Java and MongoDB with Morphia
 
Java Development with MongoDB
Java Development with MongoDBJava Development with MongoDB
Java Development with MongoDB
 
XQuery Design Patterns
XQuery Design PatternsXQuery Design Patterns
XQuery Design Patterns
 
MongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with MorphiaMongoDB: Easy Java Persistence with Morphia
MongoDB: Easy Java Persistence with Morphia
 
Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩Node 관계형 데이터베이스_바인딩
Node 관계형 데이터베이스_바인딩
 
Dropwizard
DropwizardDropwizard
Dropwizard
 

Similar to NoSQL and JavaScript: a love story

State of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJSState of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJSAlexandre Morgaut
 
State of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljsState of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljsAlexandre Morgaut
 
State of the art server side java script
State of the art server side java scriptState of the art server side java script
State of the art server side java scriptThibaud Arguillere
 
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...GITS Indonesia
 
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"Provectus
 
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012Alexandre Morgaut
 
State of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJSState of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJSAlexandre Morgaut
 
12 Monkeys Inside JS Engine
12 Monkeys Inside JS Engine12 Monkeys Inside JS Engine
12 Monkeys Inside JS EngineChengHui Weng
 
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012Alexandre Morgaut
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.Mike Brevoort
 
Hybrid apps - Your own mini Cordova
Hybrid apps - Your own mini CordovaHybrid apps - Your own mini Cordova
Hybrid apps - Your own mini CordovaAyman Mahfouz
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitAriya Hidayat
 
Full-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.jsFull-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.jsMichael Lehmann
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Roberto Franchini
 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitAriya Hidayat
 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitAriya Hidayat
 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAriya Hidayat
 

Similar to NoSQL and JavaScript: a love story (20)

State of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJSState of the art: server-side javaScript - NantesJS
State of the art: server-side javaScript - NantesJS
 
State of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljsState of the art: Server-Side JavaScript - dejeuner fulljs
State of the art: Server-Side JavaScript - dejeuner fulljs
 
State of the art server side java script
State of the art server side java scriptState of the art server side java script
State of the art server side java script
 
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
Fundamental Node.js (Workshop bersama Front-end Developer GITS Indonesia, War...
 
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"
Василевский Илья (Fun-box): "автоматизация браузера при помощи PhantomJS"
 
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
Wakanda: NoSQL & SSJS for Model-driven Web Applications - SourceDevCon 2012
 
GlassFish v3 : En Route Java EE 6
GlassFish v3 : En Route Java EE 6GlassFish v3 : En Route Java EE 6
GlassFish v3 : En Route Java EE 6
 
React october2017
React october2017React october2017
React october2017
 
State of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJSState of the art: Server-side JavaScript - MoscowJS
State of the art: Server-side JavaScript - MoscowJS
 
12 Monkeys Inside JS Engine
12 Monkeys Inside JS Engine12 Monkeys Inside JS Engine
12 Monkeys Inside JS Engine
 
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
Wakanda: NoSQL for Model-Driven Web applications - NoSQL matters 2012
 
Node.js - async for the rest of us.
Node.js - async for the rest of us.Node.js - async for the rest of us.
Node.js - async for the rest of us.
 
Hybrid apps - Your own mini Cordova
Hybrid apps - Your own mini CordovaHybrid apps - Your own mini Cordova
Hybrid apps - Your own mini Cordova
 
Hybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKitHybrid Apps (Native + Web) via QtWebKit
Hybrid Apps (Native + Web) via QtWebKit
 
Full-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.jsFull-Stack JavaScript with Node.js
Full-Stack JavaScript with Node.js
 
Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!Integration tests: use the containers, Luke!
Integration tests: use the containers, Luke!
 
JBoss World 2010
JBoss World 2010JBoss World 2010
JBoss World 2010
 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKit
 
Hybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKitHybrid Apps (Native + Web) using WebKit
Hybrid Apps (Native + Web) using WebKit
 
Analyzing the Performance of Mobile Web
Analyzing the Performance of Mobile WebAnalyzing the Performance of Mobile Web
Analyzing the Performance of Mobile Web
 

More from Alexandre Morgaut

Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...Alexandre Morgaut
 
Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017Alexandre Morgaut
 
angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42Alexandre Morgaut
 
Carnet de Route du Développeur - ENSIMAG 2012
Carnet de Route du Développeur - ENSIMAG 2012Carnet de Route du Développeur - ENSIMAG 2012
Carnet de Route du Développeur - ENSIMAG 2012Alexandre Morgaut
 
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014Alexandre Morgaut
 
HTML5 in automotive - web2day 2014
HTML5 in automotive  - web2day 2014HTML5 in automotive  - web2day 2014
HTML5 in automotive - web2day 2014Alexandre Morgaut
 
JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)Alexandre Morgaut
 
Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)Alexandre Morgaut
 
End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013Alexandre Morgaut
 
From Web App Model Design to Production with Wakanda
From Web App Model Design to Production with WakandaFrom Web App Model Design to Production with Wakanda
From Web App Model Design to Production with WakandaAlexandre Morgaut
 
Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Alexandre Morgaut
 
End to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) EuropeEnd to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) EuropeAlexandre Morgaut
 
Wakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) EuropeWakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) EuropeAlexandre Morgaut
 
End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012Alexandre Morgaut
 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveAlexandre Morgaut
 
NantesJS premier meetup - Welcome
NantesJS premier meetup - WelcomeNantesJS premier meetup - Welcome
NantesJS premier meetup - WelcomeAlexandre Morgaut
 
Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011Alexandre Morgaut
 
Benefits of an Open environment with Wakanda
Benefits of an Open environment with WakandaBenefits of an Open environment with Wakanda
Benefits of an Open environment with WakandaAlexandre Morgaut
 
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...Alexandre Morgaut
 

More from Alexandre Morgaut (20)

Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
Lint, coverage, doc, autocompletion, transpilation, minification... powered b...
 
Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017Past, present, and future of web assembly - Devfest Nantes 2017
Past, present, and future of web assembly - Devfest Nantes 2017
 
angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42angular-wakanda ngParis meetup 15 at 42
angular-wakanda ngParis meetup 15 at 42
 
Carnet de Route du Développeur - ENSIMAG 2012
Carnet de Route du Développeur - ENSIMAG 2012Carnet de Route du Développeur - ENSIMAG 2012
Carnet de Route du Développeur - ENSIMAG 2012
 
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
Conquer Architectural Challenges with End-to-End JavaScript - enterJS 2014
 
HTML5 in automotive - web2day 2014
HTML5 in automotive  - web2day 2014HTML5 in automotive  - web2day 2014
HTML5 in automotive - web2day 2014
 
JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)JS in SMS - JS.everywhere(2013)
JS in SMS - JS.everywhere(2013)
 
Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)Js in Automotive - JS.everywhere(2013)
Js in Automotive - JS.everywhere(2013)
 
End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013End-to-end HTML5 APIs - The Geek Gathering 2013
End-to-end HTML5 APIs - The Geek Gathering 2013
 
From Web App Model Design to Production with Wakanda
From Web App Model Design to Production with WakandaFrom Web App Model Design to Production with Wakanda
From Web App Model Design to Production with Wakanda
 
Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29Wakanda - apps.berlin.js - 2012-11-29
Wakanda - apps.berlin.js - 2012-11-29
 
End to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) EuropeEnd to-end W3C - JS.everywhere(2012) Europe
End to-end W3C - JS.everywhere(2012) Europe
 
Wakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) EuropeWakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
Wakanda and the top 5 security risks - JS.everyrwhere(2012) Europe
 
End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012End-to-end W3C APIs - tpac 2012
End-to-end W3C APIs - tpac 2012
 
End-to-end W3C APIs
End-to-end W3C APIsEnd-to-end W3C APIs
End-to-end W3C APIs
 
Etat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS GeneveEtat de l'art Server-Side JavaScript - JS Geneve
Etat de l'art Server-Side JavaScript - JS Geneve
 
NantesJS premier meetup - Welcome
NantesJS premier meetup - WelcomeNantesJS premier meetup - Welcome
NantesJS premier meetup - Welcome
 
Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011Wakanda NoSQL Object Datastore - MoscowJS 2011
Wakanda NoSQL Object Datastore - MoscowJS 2011
 
Benefits of an Open environment with Wakanda
Benefits of an Open environment with WakandaBenefits of an Open environment with Wakanda
Benefits of an Open environment with Wakanda
 
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
State of the art: Server-Side JavaScript - WebWorkersCamp IV - Open World For...
 

Recently uploaded

Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.IPLOOK Networks
 
From the origin to the future of Open Source model and business
From the origin to the future of  Open Source model and businessFrom the origin to the future of  Open Source model and business
From the origin to the future of Open Source model and businessFrancesco Corti
 
LF Energy Webinar - Unveiling OpenEEMeter 4.0
LF Energy Webinar - Unveiling OpenEEMeter 4.0LF Energy Webinar - Unveiling OpenEEMeter 4.0
LF Energy Webinar - Unveiling OpenEEMeter 4.0DanBrown980551
 
IT Service Management (ITSM) Best Practices for Advanced Computing
IT Service Management (ITSM) Best Practices for Advanced ComputingIT Service Management (ITSM) Best Practices for Advanced Computing
IT Service Management (ITSM) Best Practices for Advanced ComputingMAGNIntelligence
 
Technical SEO for Improved Accessibility WTS FEST
Technical SEO for Improved Accessibility  WTS FESTTechnical SEO for Improved Accessibility  WTS FEST
Technical SEO for Improved Accessibility WTS FESTBillieHyde
 
2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdf2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdfThe Good Food Institute
 
UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3DianaGray10
 
Where developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is goingWhere developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is goingFrancesco Corti
 
Introduction to RAG (Retrieval Augmented Generation) and its application
Introduction to RAG (Retrieval Augmented Generation) and its applicationIntroduction to RAG (Retrieval Augmented Generation) and its application
Introduction to RAG (Retrieval Augmented Generation) and its applicationKnoldus Inc.
 
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightSafe Software
 
Extra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdfExtra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdfInfopole1
 
UiPath Studio Web workshop series - Day 1
UiPath Studio Web workshop series  - Day 1UiPath Studio Web workshop series  - Day 1
UiPath Studio Web workshop series - Day 1DianaGray10
 
Graphene Quantum Dots-Based Composites for Biomedical Applications
Graphene Quantum Dots-Based Composites for  Biomedical ApplicationsGraphene Quantum Dots-Based Composites for  Biomedical Applications
Graphene Quantum Dots-Based Composites for Biomedical Applicationsnooralam814309
 
CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024Brian Pichman
 
Top 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTop 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTopCSSGallery
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
 
AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024Brian Pichman
 
3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud Data3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud DataEric D. Schabell
 

Recently uploaded (20)

Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.
 
From the origin to the future of Open Source model and business
From the origin to the future of  Open Source model and businessFrom the origin to the future of  Open Source model and business
From the origin to the future of Open Source model and business
 
LF Energy Webinar - Unveiling OpenEEMeter 4.0
LF Energy Webinar - Unveiling OpenEEMeter 4.0LF Energy Webinar - Unveiling OpenEEMeter 4.0
LF Energy Webinar - Unveiling OpenEEMeter 4.0
 
IT Service Management (ITSM) Best Practices for Advanced Computing
IT Service Management (ITSM) Best Practices for Advanced ComputingIT Service Management (ITSM) Best Practices for Advanced Computing
IT Service Management (ITSM) Best Practices for Advanced Computing
 
Technical SEO for Improved Accessibility WTS FEST
Technical SEO for Improved Accessibility  WTS FESTTechnical SEO for Improved Accessibility  WTS FEST
Technical SEO for Improved Accessibility WTS FEST
 
2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdf2024.03.12 Cost drivers of cultivated meat production.pdf
2024.03.12 Cost drivers of cultivated meat production.pdf
 
UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3
 
Where developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is goingWhere developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is going
 
SheDev 2024
SheDev 2024SheDev 2024
SheDev 2024
 
Introduction to RAG (Retrieval Augmented Generation) and its application
Introduction to RAG (Retrieval Augmented Generation) and its applicationIntroduction to RAG (Retrieval Augmented Generation) and its application
Introduction to RAG (Retrieval Augmented Generation) and its application
 
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
Extra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdfExtra-120324-Visite-Entreprise-icare.pdf
Extra-120324-Visite-Entreprise-icare.pdf
 
UiPath Studio Web workshop series - Day 1
UiPath Studio Web workshop series  - Day 1UiPath Studio Web workshop series  - Day 1
UiPath Studio Web workshop series - Day 1
 
Graphene Quantum Dots-Based Composites for Biomedical Applications
Graphene Quantum Dots-Based Composites for  Biomedical ApplicationsGraphene Quantum Dots-Based Composites for  Biomedical Applications
Graphene Quantum Dots-Based Composites for Biomedical Applications
 
CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024CyberSecurity - Computers In Libraries 2024
CyberSecurity - Computers In Libraries 2024
 
Top 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTop 10 Squarespace Development Companies
Top 10 Squarespace Development Companies
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024
 
3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud Data3 Pitfalls Everyone Should Avoid with Cloud Data
3 Pitfalls Everyone Should Avoid with Cloud Data
 

NoSQL and JavaScript: a love story

  • 1. NoSQL & JavaScript a Love Story! by Alexandre Morgaut TakeOff Conf - Lille 2013
  • 2. Presentation W3C AC member Wakanda Community Web Architect JS Expert REST Lover NoSQL Fanboy @amorgaut
  • 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
  • 5. NoSQL Families Document Store Object store Graph Key-value store Column store
  • 6. NoSQL Families Document Store Object store Graph Key-value store Column store
  • 7. NoSQL Families Document Store Object store Graph Key-value store Column store
  • 9. 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
  • 10. JavaScript Engines C+ C + SpiderMonkey webkit JavaScriptCore: JSC 3 JIT Compilers: SquirrelFish Extreme: SFX aka Nitro TraceMonkey, (JIT Compiler inside) JägerMonkey, IonMonkey Jav C+ a + Rhino V8 Interpreted or Compiled execution JIT Compiler: CrankShaft Nashorn? ? Trident: MSHTML Chakra -> Classic JScript, Managed JScript, & JScript.NET C+ ? + Tamarin Carakan JIT Compiler: NanoJIT -> ActionScript / “ECMAScript 4” Previously: Linear A, Linear B, Futhark
  • 11. Server-Side JavaScript SpiderMonkey JavaScriptCore Rhino V8 Trident / Chakra
  • 13. JavaScript & Databases Netscape Enterprise Server Microsoft: JScript, JScript.NET, ActiveX Mozilla Rhino JSDB APE Project W3C Web SQL
  • 14. 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(); // Display the values write("<B>Customer Name:</B> " + cursor.name + "<BR>"); start/home.html } //Close the cursor cursor.close(); Shared Connections Note: Netscape Enterprise Server merged with Javagator to become iPlanet
  • 15. 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({ field1: reccordset("field1"), field2: reccordset("field2") Windows Script Hosting }); rsAuthor2.MoveNext; } .NET conn.Close(); conn = null; Note: JScript is running on Microsoft IIS since 1997
  • 16. MS JScript in the Browser var connection = new ActiveXObject("ADODB.Connection");    connection.Open(dsn, login, password); var reccordset = new ActiveXObject("ADODB.Recordset"); ActiveXObject   reccordset.Open(sqlQuery, connection); reccordset.MoveFirst; while(!reccordset.eof) { only IE } document.write(reccordset.fields(1)); reccordset.movenext;   reccordset.close; connection.close;
  • 17. 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;"); while (resultSet.next()){ Access to JDBC print( resultSet.getString("name") + " - " + resultSet.getString("occupation") ); ex: RingoJS } resultSet.close(); stat.close(); conn.close(); https://developer.mozilla.org/en-US/docs/Rhino
  • 18. 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); writeln('Data for Mr. Smith'); writeln(r.toString()); JS Server db.close(); http://www.jsdb.org/
  • 19. 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', echo: params.ping Comet } ); sql.query( 'INSERT INTO table(log) VALUES("' + Web Sockets Ape.MySQL.escape(params.ping) + '")', function(res, errorNo) { Ape.log('Inserted ' + this.getInsertId()); } MySQL ); }); Note: APE means “Ajax Push Engine” http://www.ape-project.org/
  • 20. W3C Web SQL HTML5 var db = openDatabase('mydb', '1.0', 'my first db', 2 * 1024 * 1024); db.transaction(function (tx) { Safari 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 result = x.executeSqlSync('SELECT * FROM foo'); for (var i = 0, len = results.rows.length; i < len; i++) { alert(results.rows.item(i).text); Sync / Async } Note: standard paused because current implementations are only based on SQLite http://html5doctor.com/introducing-web-sql-databases/
  • 21. Data as a Service (DaaS)
  • 22. Data as a Service Amazon APIs OData APP GData Twitter APIs
  • 24. Touching the DB Heart Key-Value: Web Storage, Riak Document: CouchDB, MongoDB, IndexedDB Object: JavaScriptDB, WakandaDB Multi-Model: OrientDB & ArangoDB
  • 26. 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; sessionStorage.bar = foo; session // sync interface when data change, even from other window window.addEventListener("storage", handle_storage, false); events Note: Firefox used to propose “globalStorage”, Wakanda implements “user.storage” http://www.w3.org/TR/webstorage/
  • 27. Riak Buckets {"inputs": "goog", "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 function(value, keyData, arg){ Erlang alternative: var data = Riak.mapValuesJson(value)[0]; var month = value.key.split('-').slice(0,2).join('-'); var obj = {}; obj[month] = data.High - data.Low; return [ obj ]; SpiderMonkey } // 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; })]; }
  • 29. IndexedDB W3C / WHATWG var request = indexedDB.open("MyTestDatabase", 3); request.onerror = function(event) { // Do something with request.errorCode! HTML5 }; request.onsuccess // Do something = function(event) { with request.result! }; Sync / Async request.onupgradeneeded = function(event) { // Update object stores and indices .... } Indexes var objectStore = db.createObjectStore("customers", { keyPath: "ssn" }); objectStore.createIndex("name", "name", { unique: false }); Transactions objectStore.add({ ssn: "444-44-4444", name: "Bill", age: 35}); var transaction = db.transaction(["customers"], IDBTransaction.READ_WRITE); Cursors http://www.w3.org/TR/IndexedDB/
  • 30. CouchDB function(doc) { if (doc.Type == "customer") { emit(doc.LastName, {FirstName: doc.FirstName, Addr: doc.Address}); emit(doc.FirstName, {LastName: doc.LastName, Addr: doc.Address}); Views } } JSON* { "total_rows":2, "offset":0, "rows": [ Map / Reduce { "id":"64ACF01B05F53ACFEC48C062A5D01D89", "key":"Katz", "value":{"FirstName":"Damien", "Addr":"Charlotte NC"} }, { Erlang alternative: "id":"64ACF01B05F53ACFEC48C062A5D01D89", "key":"Damien", "value":{"LastName":"Katz", "Addr":"Charlotte NC"} }, ] Spidermonkey } Note: CouchDB moved from XML to JSON & JS in 2007* http://wiki.apache.org/couchdb/HTTP_view_API * http://jan.prima.de/~jan/plok/archives/89-CouchDb-updates.html
  • 31. CouchBase CouchDB alternative using V8 adding memcache meant to be more scalable http://www.couchbase.com/
  • 32. MongoDB { text: "lmao! great article!", Spidermonkey } author: 'kbanker', votes: 2 BSON var map = function() { emit(this.author, {votes: this.votes}); }; Map / Reduce // Add up all the votes for each key. var reduce = function(key, values) { var sum = 0; REST / JSON values.forEach(function(doc) { sum += doc.votes; }); return {votes: sum}; }; REST / JS var op = db.comments.mapReduce(map, reduce, {out: "mr_results"}); Shell http://www.mongodb.org/display/DOCS/MapReduce
  • 34. Persevere JavaScriptDB var d = new Data(); d.test = 12345; Rhino {"id":"generated.js", "sources":[ { "name":"Data", "extends":"Object", REST / JSON "schema":{ "extends":{"$ref":"../Class/Object"}, hello : function() { console.log("hello hi"); }, JSON Schema } "prototype":{ } }] JSON Path } curl localhost:8080/Data/1 JSON Query ({"id":"1","test":12345}) Data.hello(); // INFO: hi there http://www.sitepen.com/blog/2009/04/20/javascriptdb-perseveres-new-high-performance-storage-engine/
  • 35. WakandaDB Webkit JavaScriptCore REST / JSON Data Classes auto-updatable accessors john = ds.Person.find("fistName eq John"); events conferences = john.allConferences; JohnJSConferences = conferences.filter("title eq :1", "*JavaScript*"); methods JSAttendeesJohnMet = JSConferences.allPeople; http://wakanda.org/
  • 37. ArangoDB V8 actions.defineHttp({ url : "world", context : "api", events callback : function (req, res) { var collection = db._collection(req.parameter.collection); if (collection == null) { ... filters } else { ... } transactions actions.resultOk(req, res, actions.HTTP_OK, result); } }); Shell http://www.ape-project.org/
  • 38. OrientDB rhino // create function getAllCustomer REST / JSON return db.query("select from V") transactions db.begin(); try { " // some code " db.commit() hooks (events) } catch (e) { " } db.rollback();" stored procedures new com.orientechnologies.orient.core.record.impl.ODocument('Profile').field('name', 'Luca').save() http://www.orientdb.org/
  • 40. Reaching the DB mongoose WAF (Wakanda) mongodb-rhino Ext.data.proxy.Wakanda riak control arango.client backbone-couchdb voltdb-client-nodejs dojox.data.couchDBRestStore redis-node-client node-cassandra orientdb-api.js
  • 41. Thank you! Let’s keep in touch... Client & Server @amorgaut JavaScript APIs http://about.me/amorgaut http://w3.org/community/jseverywhere/ @wakandasoft @jseverywhere http://wakanda.org http://jseverywhere.org