SlideShare a Scribd company logo
1 of 37
node­db
    La excusa perfecta para hablar de C++ y 
                    Node.js


                        
                                @mgiglesias
Se dice de mi
    Que soy nerd
    Que me gusta Apple
      Sí, ¡ni te imaginás cuánto!

    Que soy de opinar
      @mgiglesias es una mescolanza preocupante

    Que todos los lenguajes me quedan bien
      Duh! ¿De qué era esta charla?

    Que está en algún que otro proyecto FOSS
                                     
Se dice de mi
    Le sobraba el tiempo, y arrancó WORKANA
      Che, es http://workana.com

    Le gusta Seinfeld
      Y los zombies :­/

    Se mandó a mudar a Miramar
    Se encerró en un baño de un avión



                                    
Cortá el chamullo

              ¿De qué voy a hablar?




    Node­db
    Node.js + C++


                         
Había una vez un Alemán




             @felixge
                 
Propuesta node­db
    API C++ unificada
    Separar lo intrínseco de los protocolos
    Librerías DB blocking y non blocking
    API en JS land sencillo
    Performance
    Solo relacionales
      MySQL
      Oracle
                               
A laburar
$ npm install db­mysql

var dbmysql = require('db­mysql');
new dbmysql.Database({
       hostname: 'localhost',
       user: 'root',
       password: 'password',
       database: 'node'
}).connect(function(error, server) {
       if (error) {
             throw new Error('ERROR: ' + error);
       }
       console.log(server);
});

{ version: '5.5.24',
  hostname: 'localhost',
  user: 'root',
                                               
  database: 'node' }
Pooleando conexiones
var mysql = require('db­mysql'),
    generic_pool = require('generic­pool');

var pool = generic_pool.Pool({
    name: 'mysql',
    max: 10,
    create: function(callback) {
        new mysql.Database({ … }).connect(function(err, server) { 
              callback(err, this); 
         });
    },
    destroy: function(db) {
        db.disconnect();
    }
});

pool.acquire(function(err, db) {
      pool.release(db);
});
                                                
A consultar se ha dicho
db.query()
        .select(["id", "user", "email"])
        .from("users")
        .where("role IN ?", [ ["administrator", "user"] ])
        .and("created > ?", [ new Date(2011, 1, 1) ])
        .execute(function(error, rows, columns){
            if (error) {
                console.log('ERROR: ' + error);
                return;
            }
            // Hacer algo mas interesante
        });

                             http://nodejsdb.org
                                       
¿Qué hay detrás del telón?
    db­mysql.js
      exports.Database
      exports.Query
    lib/node­db
      binding.cc, query.cc, events.cc
      connection.cc, result.cc, exception.cc
    src/
      mysql.cc, query.cc
      connection.cc, result.cc    
En el fondo...



     Javascript
     C++
     V8: un amigo



                           
¿¿¿¿¿¿C++??????




            
C++ en Node.js
    Performance
      Ojo, ¡no siempre!
    Librerias C/C++
    Código proprietario
    Integración con otros lenguajes
      Python en Node.js via boost:python?



                               
C++ en Node.js
    Ya que estamos, le damos una mano




                     
C++ en Node.js

    V8
    libuv
    libeio
    Y lo que gustes... ¡es C++ después 
     de todo!
    waf / gyp
                       
¿¿¿¿¿¿WINDOWS??????




 
    Birra para el que adivina de qué película es esta foto
                                  
Muerte a los hola mundos
var binding = require('./build/Release/binding');

cerveza = new binding.Cerveza();
console.log(cerveza.estado());
cerveza.tomar(1);
console.log(cerveza.estado());
cerveza.tomar(2);
console.log(cerveza.estado());
cerveza.tomar(5);
console.log(cerveza.estado());


$ node test.js 
Arranca a tomar de una vez!
Segui tomando tranquilo
Mas vale que no manejes
Me parece que te falto el agua para las macetas
                                                
Qué ganas de una cerveza...
#ifndef CERVEZA_H_
#define CERVEZA_H_

#include <node.h>
#include <node_object_wrap.h>

class Cerveza : public node::ObjectWrap {
       public:
            static void Init(v8::Handle<v8::Object> target);

         protected:
              long liters;

              Cerveza();
              static v8::Handle<v8::Value> New(const v8::Arguments& args);
              static v8::Handle<v8::Value> Tomar(const v8::Arguments& args);
              static v8::Handle<v8::Value> Estado(const v8::Arguments& args);
};

#endif
                                                     
Qué ganas de una cerveza...
void Cerveza::Init(v8::Handle<v8::Object> target) {
       v8::HandleScope scope;

       v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(New);
       v8::Persistent<v8::FunctionTemplate> constructorTemplate;
       constructorTemplate = v8::Persistent<v8::FunctionTemplate>::New(t);
       constructorTemplate­>InstanceTemplate()­>SetInternalFieldCount(1);

       NODE_ADD_PROTOTYPE_METHOD(constructorTemplate, "tomar", Tomar);
       NODE_ADD_PROTOTYPE_METHOD(constructorTemplate, "estado", Estado);

       target­>Set(v8::String::NewSymbol("Cerveza"), constructorTemplate­>GetFunction());
}

v8::Handle<v8::Value> Cerveza::New(const v8::Arguments& args) {
       v8::HandleScope scope;

       Cerveza* cerveza = new Cerveza();
       if (cerveza == NULL) { THROW_EXCEPTION("Ops! Tamos en el horno!") }

       cerveza­>Wrap(args.This());
       return scope.Close(args.This());                
}
Qué ganas de una cerveza...




                  
Los métodos expuestos
v8::Handle<v8::Value> Cerveza::Tomar(const v8::Arguments& args) {
      v8::HandleScope scope;

      if (args.Length() != 1) {
            THROW_EXCEPTION("Si no me decis cuantos litros que queres que haga?");
      } else if (!args[0]­>IsInt32()) {
            THROW_EXCEPTION("Que te tomaste?");
      } else if (args[0]­>ToInt32()­>Value() < 0) {
            THROW_EXCEPTION("Limpia ese enchastre!")
      }

    Cerveza* cerveza = node::ObjectWrap::Unwrap<Cerveza>(args.This());
    assert(cerveza);

    cerveza­>liters += (args[0]­>ToInt32()­>Value());

    return scope.Close(v8::Undefined());
}
                                                
Los métodos expuestos
v8::Handle<v8::Value> Cerveza::Estado(const v8::Arguments& args) {
       v8::HandleScope scope;

       Cerveza* cerveza = node::ObjectWrap::Unwrap<Cerveza>(args.This());
       assert(cerveza);

       const char* estado;

       if (cerveza­>liters > 4) {
             estado = "Me parece que te falto el agua para las macetas";
       } else if (cerveza­>liters > 2) {
             estado = "Mas vale que no manejes";
       } else if (cerveza­>liters > 0) {
             estado = "Segui tomando tranquilo";
       } else {
             estado = "Arranca a tomar de una vez!";
       }

    return scope.Close(v8::String::New(estado));
}
                                                    
Y le decimos a Node
extern “C” void init(v8::Handle<v8::Object> target) {
        Cerveza::Init(target);
}

NODE_MODULE(binding, init);


{
  "targets": [
    {
      "target_name": "binding",
      "sources": [ "cerveza.cc" ]
    }
  ]
}


$ node­gyp configure build
info it worked if it ends with ok
make: Leaving directory `/home/mariano/Documents/Talks/JSConf/src/build'
info done ok 
                                           
libuv

“El mundo no es perfecto. 
   A veces no podemos 
  hacer non­blocking....... 
       sin threads”

               
libuv

cerveza.comprar(function() {
     cerveza.comprar(function(compradas) {
         console.log('Ya compre ' + compradas + ' cervezas');
     });
});




$ node test.js 
Ya compre 2 cervezas


                                     
libuv
uv_work_t* request = new uv_work_t();
request­>data = // ….
uv_queue_work(uv_default_loop(), request, uvComprar, uvComprado);
uv_ref(uv_default_loop());


       void uvComprar(uv_work_t* uvRequest)



       void uvComprado(uv_work_t* uvRequest)



        uv_unref(uv_default_loop());
                                    
A comprar cerveza
class Cerveza : public node::ObjectWrap {
       protected:
              long compradas;
              pthread_mutex_t compradasLock;
              struct compra_t {
                   Cerveza* cerveza;
                   v8::Persistent<v8::Function>* callback;
                   v8::Persistent<v8::Object> context;
              };

              static v8::Handle<v8::Value> Comprar(const v8::Arguments& args);
         static void uvComprar(uv_work_t* uvRequest);
         static void uvComprado(uv_work_t* uvRequest);
};

Cerveza::Cerveza():litros(0), compradas(0) {
      pthread_mutex_init(&(this­>compradasLock), NULL);
}
Cerveza::~Cerveza() {
      pthread_mutex_destroy(&(this­>compradasLock));
                                              
}
v8::Handle<v8::Value> Cerveza::Comprar(const v8::Arguments& args) {
      v8::HandleScope scope;

      Cerveza* cerveza = node::ObjectWrap::Unwrap<Cerveza>(args.This());
      assert(cerveza);

      compra_t* compra = new compra_t();
      if (compra == NULL) { THROW_EXCEPTION("Sin espacio!") }

      cerveza­>Ref();
      compra­>context = v8::Persistent<v8::Object>::New(args.This());
      compra­>cerveza = cerveza;
      compra­>callback = NULL;
      if (args.Length() > 0) {
            compra­>callback = node::cb_persist(args[0]);
      }

      uv_work_t* req = new uv_work_t();
      req­>data = compra;
      uv_queue_work(uv_default_loop(), req, uvComprar, uvComprado);
      uv_ref(uv_default_loop());

      return scope.Close(v8::Undefined());
                                              
}
void Cerveza::uvComprar(uv_work_t* uvRequest) {
     compra_t* compra = static_cast<compra_t*>(uvRequest­>data);
     assert(compra);

     pthread_mutex_lock(&(compra­>cerveza­>compradasLock));
     compra­>cerveza­>compradas++;
     pthread_mutex_unlock(&(compra­>cerveza­>compradasLock));
}




                                  
void Cerveza::uvComprado(uv_work_t* uvRequest) {
       v8::HandleScope scope;

      compra_t* compra = static_cast<compra_t*>(uvRequest­>data);
      assert(compra);

      uv_unref(uv_default_loop());
      compra­>cerveza­>Unref();

      if (compra­>callback != NULL) {
            v8::Local<v8::Value> argv[1] = {
                 v8::Number::New(compra­>cerveza­>compradas)
            };

           v8::TryCatch tryCatch;
           (*(compra­>callback))­>Call(compra­>context, 1, argv);
           if (tryCatch.HasCaught()) {
                  node::FatalException(tryCatch);
           }
      }

      compra­>context.Dispose();
      if (compra­>callback != NULL) {
            compra­>callback­>Dispose();
      }

      delete compra;                             
}
libeio

       “libeio es como si me 
    teletransportara del laburo 
     al bar. Cada 5 segundos”


                  
libeio

cerveza.consultar(function(r) {
    console.log(r);
});




$ node test.js 
John Doe


                              
libeio
ev_io* ioRequest = new ev_io();
ev_init(ioRequest, eioConsultado);
ev_io_set(ioRequest, fd, EV_READ);
ev_io_start(EV_DEFAULT_UC_ ioRequest);



      void eioConsultado(EV_P_ ev_io* ioRequest, int revents)



      ev_io_stop(EV_A_ ioRequest);


                                  
v8::Handle<v8::Value> Cerveza::Comprar(const v8::Arguments& args) {
      consulta­>connection = mysql_init(NULL);
      mysql_real_connect(consulta­>connection, "localhost", "root", "password", 
  "node", 3306, NULL, 0);
      mysql_send_query(consulta­>connection, "SELECT * FROM users", 20);

     consulta­>context = v8::Persistent<v8::Object>::New(args.This());
     consulta­>cerveza = cerveza;
     consulta­>callback = NULL;
     if (args.Length() > 0) {
          consulta­>callback = node::cb_persist(args[0]);
     }

     consulta­>cerveza­>Ref();

     ev_io* ioRequest = new ev_io();
     ioRequest­>data = consulta;

     ev_init(ioRequest, eioConsultado);
     ev_io_set(ioRequest, consulta­>connection­>net.fd, EV_READ);
     ev_io_start(EV_DEFAULT_UC_ ioRequest);
}                                        
void Cerveza::eioConsultado(EV_P_ ev_io* ioRequest, int revents) {
      v8::HandleScope scope;

     consulta_t* consulta = static_cast<consulta_t*>(ioRequest­>data);
     assert(consulta);

     ev_io_stop(EV_A_ ioRequest);
     consulta­>cerveza­>Unref();

     mysql_read_query_result(consulta­>connection);

     MYSQL_RES* result = mysql_store_result(consulta­>connection);
     assert(result);
     char** row = mysql_fetch_row(result);

     // …

     mysql_free_result(result);
     mysql_close(consulta­>connection);
}                                       
Conclusión
    C++ sigue sirviendo para algo
    libuv y libeio te simplifican la vida
      ¡No solo para Node.js eh!
    Ojeá el fuente de Node. Hay cosas interesantes 
     ahí ;)
    No minimices el poder de V8. Por algo se llama 
     V8


                                
¿Preguntas?




            :­)
 
    www.workana.com
                  
                          @mgiglesias

More Related Content

What's hot

Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)videos
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispanohdgarcia
 
Aprende a programar con KDE y una patata
Aprende a programar con KDE y una patataAprende a programar con KDE y una patata
Aprende a programar con KDE y una patatakdeespana
 
Programación reactiva con Vert.x
Programación reactiva con Vert.xProgramación reactiva con Vert.x
Programación reactiva con Vert.xFran García
 
Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11Sebastián Vizcay
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkMario IC
 
Desarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con TwistedDesarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con Twistedjjconti
 
Ansible administracion simplificada
Ansible   administracion simplificada Ansible   administracion simplificada
Ansible administracion simplificada bcoca
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvmsuperserch
 
Node al limite con Nest
Node al limite con NestNode al limite con Nest
Node al limite con NestArturo Silvelo
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threadsjubacalo
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandboxTensor
 

What's hot (18)

Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)Aprendiendo a usar NDK Android Day(castellano)
Aprendiendo a usar NDK Android Day(castellano)
 
Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispano
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Aprende a programar con KDE y una patata
Aprende a programar con KDE y una patataAprende a programar con KDE y una patata
Aprende a programar con KDE y una patata
 
MODELO PASO DE MENSAJES
MODELO PASO DE MENSAJESMODELO PASO DE MENSAJES
MODELO PASO DE MENSAJES
 
Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
Programación reactiva con Vert.x
Programación reactiva con Vert.xProgramación reactiva con Vert.x
Programación reactiva con Vert.x
 
Ajax
AjaxAjax
Ajax
 
Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11Concurrencia y nuevas características en C++11
Concurrencia y nuevas características en C++11
 
Terraspace, the definitive terraform framework
Terraspace, the definitive terraform frameworkTerraspace, the definitive terraform framework
Terraspace, the definitive terraform framework
 
Desarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con TwistedDesarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con Twisted
 
Ansible administracion simplificada
Ansible   administracion simplificada Ansible   administracion simplificada
Ansible administracion simplificada
 
Jvmmx docker jvm
Jvmmx docker jvmJvmmx docker jvm
Jvmmx docker jvm
 
Node al limite con Nest
Node al limite con NestNode al limite con Nest
Node al limite con Nest
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threads
 
Groovy
GroovyGroovy
Groovy
 
Pyrapidc
PyrapidcPyrapidc
Pyrapidc
 
Cuckoo sandbox
Cuckoo sandboxCuckoo sandbox
Cuckoo sandbox
 

Viewers also liked

Node.js/io.js Native C++ Addons
Node.js/io.js Native C++ AddonsNode.js/io.js Native C++ Addons
Node.js/io.js Native C++ AddonsChris Barber
 
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++Writing native bindings to node.js in C++
Writing native bindings to node.js in C++nsm.nikhil
 
Using Cloud in an Enterprise Environment
Using Cloud in an Enterprise EnvironmentUsing Cloud in an Enterprise Environment
Using Cloud in an Enterprise EnvironmentMike Crabb
 

Viewers also liked (6)

Node.js/io.js Native C++ Addons
Node.js/io.js Native C++ AddonsNode.js/io.js Native C++ Addons
Node.js/io.js Native C++ Addons
 
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++Writing native bindings to node.js in C++
Writing native bindings to node.js in C++
 
Node.js extensions in C++
Node.js extensions in C++Node.js extensions in C++
Node.js extensions in C++
 
Extending Node.js using C++
Extending Node.js using C++Extending Node.js using C++
Extending Node.js using C++
 
Using Cloud in an Enterprise Environment
Using Cloud in an Enterprise EnvironmentUsing Cloud in an Enterprise Environment
Using Cloud in an Enterprise Environment
 
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4jBases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
Bases de Datos No Relacionales (NoSQL): Cassandra, CouchDB, MongoDB y Neo4j
 

Similar to node-db: La excusa perfecta para hablar de C++ y Node.js

José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]RootedCON
 
Hardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RADHardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RADestialvarez
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesMartín Volpe
 
PHPAJAX
PHPAJAXPHPAJAX
PHPAJAXrodasc
 
CouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidCouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidRicardo Monagas Medina
 
Reactvolution
ReactvolutionReactvolution
Reactvolution_Lagash
 
Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDKFe
 
Introducción android ndk
Introducción android ndkIntroducción android ndk
Introducción android ndkBarcelona GTUG
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0wcuestas
 
Dce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetDce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetvictdiazm
 
Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valeraguestf280e2
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redesguest5d7f33c
 
Cloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de PersistenciaCloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de PersistenciaDavid J. Brenes
 

Similar to node-db: La excusa perfecta para hablar de C++ y Node.js (20)

Hardware Hacking Rad
Hardware Hacking RadHardware Hacking Rad
Hardware Hacking Rad
 
7 curso
7 curso7 curso
7 curso
 
José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]José Ramón Palanco - NoSQL Security [RootedCON 2011]
José Ramón Palanco - NoSQL Security [RootedCON 2011]
 
Hardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RADHardware Hacking con Arduino y RAD
Hardware Hacking con Arduino y RAD
 
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantesUsando Twisted para hacer aplicaciones de escritorio no bloqueantes
Usando Twisted para hacer aplicaciones de escritorio no bloqueantes
 
PHPAJAX
PHPAJAXPHPAJAX
PHPAJAX
 
CouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones AndroidCouchDB y el desarrollo de aplicaciones Android
CouchDB y el desarrollo de aplicaciones Android
 
Reactvolution
ReactvolutionReactvolution
Reactvolution
 
Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDK
 
Introducción android ndk
Introducción android ndkIntroducción android ndk
Introducción android ndk
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0
 
Dce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetDce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnet
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valera
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
 
Cloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de PersistenciaCloud Computing: las nuevas Capas de Persistencia
Cloud Computing: las nuevas Capas de Persistencia
 

More from Mariano Iglesias

ElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden GoogleElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden GoogleMariano Iglesias
 
Workana: work in your underwear and still get paid
Workana: work in your underwear and still get paidWorkana: work in your underwear and still get paid
Workana: work in your underwear and still get paidMariano Iglesias
 
Random tips that will save your project's life
Random tips that will save your project's lifeRandom tips that will save your project's life
Random tips that will save your project's lifeMariano Iglesias
 
ONGs como Extreme Startups
ONGs como Extreme StartupsONGs como Extreme Startups
ONGs como Extreme StartupsMariano Iglesias
 
Node.js - Eventos para Todos
Node.js - Eventos para TodosNode.js - Eventos para Todos
Node.js - Eventos para TodosMariano Iglesias
 
Things that suck... and some that don't
Things that suck... and some that don'tThings that suck... and some that don't
Things that suck... and some that don'tMariano Iglesias
 
Going crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHPGoing crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHPMariano Iglesias
 

More from Mariano Iglesias (8)

Go nuts with Go and PHP
Go nuts with Go and PHPGo nuts with Go and PHP
Go nuts with Go and PHP
 
ElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden GoogleElasticSearch: la tenés atroden Google
ElasticSearch: la tenés atroden Google
 
Workana: work in your underwear and still get paid
Workana: work in your underwear and still get paidWorkana: work in your underwear and still get paid
Workana: work in your underwear and still get paid
 
Random tips that will save your project's life
Random tips that will save your project's lifeRandom tips that will save your project's life
Random tips that will save your project's life
 
ONGs como Extreme Startups
ONGs como Extreme StartupsONGs como Extreme Startups
ONGs como Extreme Startups
 
Node.js - Eventos para Todos
Node.js - Eventos para TodosNode.js - Eventos para Todos
Node.js - Eventos para Todos
 
Things that suck... and some that don't
Things that suck... and some that don'tThings that suck... and some that don't
Things that suck... and some that don't
 
Going crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHPGoing crazy with Node.JS and CakePHP
Going crazy with Node.JS and CakePHP
 

Recently uploaded

La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)JuanStevenTrujilloCh
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armadob7fwtwtfxf
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdfBetianaJuarez1
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfcristianrb0324
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfFernandoOblitasVivan
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxhasbleidit
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDAVIDROBERTOGALLEGOS
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024u20211198540
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar24roberto21
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptxHugoGutierrez99
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docxobandopaula444
 
La tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadLa tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadEduardoSantiagoSegov
 
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Marketing BRANDING
 

Recently uploaded (20)

La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)Análisis de los artefactos (nintendo NES)
Análisis de los artefactos (nintendo NES)
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Viguetas Pretensadas en concreto armado
Viguetas Pretensadas  en concreto armadoViguetas Pretensadas  en concreto armado
Viguetas Pretensadas en concreto armado
 
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
_Planificacion Anual NTICX 2024.SEC.21.4.1.docx.pdf
 
La electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdfLa electricidad y la electronica.10-7.pdf
La electricidad y la electronica.10-7.pdf
 
certificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdfcertificado de oracle academy cetrificado.pdf
certificado de oracle academy cetrificado.pdf
 
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docxPLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
PLANEACION DE CLASES TEMA TIPOS DE FAMILIA.docx
 
David_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptxDavid_Gallegos - tarea de la sesión 11.pptx
David_Gallegos - tarea de la sesión 11.pptx
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
Inteligencia Artificial. Matheo Hernandez Serrano USCO 2024
 
Actividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolarActividades de computación para alumnos de preescolar
Actividades de computación para alumnos de preescolar
 
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
#Tare10ProgramacionWeb2024aaaaaaaaaaaa.pptx
 
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docxTALLER DE ANALISIS SOLUCION  PART 2 (1)-1.docx
TALLER DE ANALISIS SOLUCION PART 2 (1)-1.docx
 
La tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedadLa tecnología y su impacto en la sociedad
La tecnología y su impacto en la sociedad
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
Agencia Marketing Branding Google Workspace Deployment Services Credential Fe...
 

node-db: La excusa perfecta para hablar de C++ y Node.js

Editor's Notes

  1. - Douglas Crockford: cuando hablas de JS, tenes que hablar de el no? Chuck norris de JS? - db-mysql.js: JS land. Extiende Query y Database de EventEmitter. Alli se llevaran los helper methods para escribir SQL - binding.cc: exports.Database - query.cc: exports Query - events.cc: usa el EventEmitter extendido de db-mysql.js
  2. * Librerias: una cosa es implementar un cliente Paypal Payments Pro en Node, otra cosa es implementar un cliente Oracle puro en JS * Codigo proprietario: integracion con Ideafix
  3. * Isaac Schlueter
  4. * V8: Lo usamos para “convertir” datos JS en C++. Para exportar funciones. * libuv: nace como wrapper alrededor de libev, solo unix, para abstraer IOCP en Windows. Tiene thread pool, DNS asincrono, spawn de procesos, non blocking TCP * libeio: parecido a libev, manejo asincrono de file resources (open, close, read, write), ev_timer para timeouts * waf: via node-waf, hecho en Python. Syntaxis sencilla. * gyp: tb Python, mucho mas piola para cross-platform. En particular node-gyp es el equivalente a node-waf
  5. * NODE_ADD_PROTOTYPE_METHOD: Define en cerveza.h que crea un nuevo prototype en base a un callback
  6. * THROW_EXCEPTION: #define que RETORNA un v8::ThrowException
  7. * NODE_MODULE: #define de node, Crea la estructura del modulo, dandole un nombre al modulo, y definiendo la funcion de inicio * EXTERN “C”: Le decimos a C++ que hay funciones C adentro
  8. * uvComprar: en el thread pool * uvComprado: en el thread de V8
  9. * Ref(): metemos una referencia asi no nos borra el garbage collector
  10. * El callback se ejecuta cada vez que el evento sucede: en este caso cada vez que el FD es leible * revents: bitset de los eventos recibidos: EV_READ, EV_TIMEOUT, EV_ERROR, y otros