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

Node js Alt.net Hispano
Node js Alt.net HispanoNode js Alt.net Hispano
Node js Alt.net Hispano
hdgarcia
 
Desarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con TwistedDesarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con Twisted
jjconti
 
Sincronizar Threads
Sincronizar ThreadsSincronizar Threads
Sincronizar Threads
jubacalo
 

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 (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
 
Introducción Android NDK
Introducción Android NDKIntroducción Android NDK
Introducción Android NDK
Fe
 
Scripting para Pentesters v1.0
Scripting para Pentesters v1.0Scripting para Pentesters v1.0
Scripting para Pentesters v1.0
wcuestas
 
Dce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnetDce0 programacion oo_c__vbnet
Dce0 programacion oo_c__vbnet
victdiazm
 

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 (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

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Recently uploaded (12)

investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 

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