slide1
Download
Skip this Video
Download Presentation
A COMMAND PROMPT TALK

Loading in 2 Seconds...

play fullscreen
1 / 85

A COMMAND PROMPT TALK - PowerPoint PPT Presentation


  • 87 Views
  • Uploaded on

A COMMAND PROMPT TALK. Node.js and postgres. An Introductory Glance With Live Code, Later. 2010 AURYNN SHAW, COMMAND PROMPT INC. Hi!. What is Node.js. Fast Pure event-driven server-side javascript programming environment. Ew, javascript. Built on Google’s V8

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' A COMMAND PROMPT TALK' - omar


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
node js and postgres
Node.js and postgres
  • An Introductory Glance
  • With Live Code, Later

2010 AURYNN SHAW, COMMAND PROMPT INC.

what is node js
What is Node.js
  • Fast
  • Pure event-driven
  • server-side
  • javascript programming environment
ew javascript
Ew, javascript
  • Built on Google’s V8
  • Runs on modern unix-likes (Linux, OSX, Freebsd, Cygwin)
  • Speaks network natively, and easily (Hello world is in http!)
  • Ends up Similar to Python, Perl, Ruby, ETc.
did i mention fast
Did I mention fast?
  • Single thread can do many thousands of connections
  • standard library doesn’t block
did i mention fast1
Did I mention fast?
  • Single thread can do many thousands of connections
  • standard library doesn’t block
  • Keeps the slow tasks from blocking
  • Keeps the quick tasks quick
blocking
blocking?

# Standard synchronous processing

fh = open(“somefile”,”r”)

contents = fh.read()

# what if somefile is huge, 1GB+ ?

print contents

did i mention fast2
Did I mention fast?
  • Single thread can do many thousands of connections
  • standard library doesn’t block
  • Keeps the slow tasks from blocking
  • Keeps the quick tasks quick
non blocking
Non-blocking!

fs.open(“somefile”, function (fd) {

// When the file descriptor gets returned.

var buffer = null;

fs.read(fd, buffer, length, position, function (e, bytes) {

// bytes read are here.

// buffer will be not-null.

});

});

some caveats
Some caveats
  • node is entirely single-threaded
  • Event-driven programming is *really* different
a maze of callbacks
A maze of callbacks

fs.open(“/tmp/hello”, function (fd) {

var buffer = null;

fs.read(fd, buffer, length, position, function (e, bytes) {

// bytes read are here.

// buffer will be not-null.

});

});

some caveats1
Some caveats
  • node is entirely single-threaded
  • Event-driven programming is *really* different
  • Javascript’s prototype model is also really different
  • The syntax has warts
build a bridge out of her
Build a bridge out of her?

/*

This allows you to kind of inherit properly.

*/

var o = function () {};

var p = function () {

/* Because ‘this’ changes */

var self = this;

o.call(this);

};

p.prototype = o;

p.prototype.constructor = p;

why is it important
Why is it important?
  • Javascript owns the frontend
why is it important1
Why is it important?
  • Javascript owns the frontend
  • More jquery and javascript programmers every day
why is it important2
Why is it important?
  • Javascript owns the frontend
  • More jquery and javascript programmers every day
  • Javascript is fast
when i got here
When I got here...
  • postgres.js worked.
when i got here1
When I got here...
  • postgres.js worked.
  • Used the simple query protocol
when i got here2
When I got here...
  • postgres.js worked.
  • Used the simple query protocol
  • Used SQL escape to prevent injection attacks.
whyyyy
whyyyy

SOURCE: http://www.flickr.com/photos/striatic/2192192956/

to prepare a query
to prepare a query
  • postgres.js Didn’t use libpq.
to prepare a query1
to prepare a query
  • postgres.js Didn’t use libpq.
  • Speaks pure protocol
to prepare a query2
to prepare a query
  • postgres.js Didn’t use libpq.
  • Speaks pure protocol
  • ...So I had to learn the protocol.
complexity abounds
Complexity Abounds
  • Simple protocol sends one message to pg
  • Easy to queue, internally.
slide42

REALLY SIMPLE MESSAGE QUEUE

QUERY

QUERY

QUERY

QUERY

QUERY

QUERY

RESULTS

really though
Really, though
  • Simple protocol sends one message to PG
  • Easy to queue, internally.
  • Prepared statements require at least 5
  • Parse, describe, execute, bind, flush
slide44

THIS TYPE OF QUEUE DOESN’T WORK

SYNC

EXECUTE

BIND

DESCRIBE

PARSE

QUERY

QUERY

and while all this is happening
And while all this is happening
  • You cannot block the main thread
  • And postgres expects a synchronous request/response
  • But it does give responses...
and while all this is happening1
And while all this is happening
  • You cannot block the main thread
and while all this is happening2
And while all this is happening
  • You cannot block the main thread
  • And postgres expects a synchronous request/response
and while all this is happening3
And while all this is happening
  • You cannot block the main thread
  • And postgres expects a synchronous request/response
  • But it does give responses...
slide50

KIND OF LIKE THIS

SIMPLE

PREPARED

GROUP

SIMPLE

SIMPLE

PREPARED

GROUP

SIMPLE

SIMPLE

using postgres js
Using postgres.js

/* Node setup */

var pg = require(“lib/postgres-pure.js”),

sys = require(“sys”);

var db = new pg.connect("pgsql://test:[email protected]:5432/template1");

/* We now have a working DB handle.

Or, we have an error. Either way.

*/

using postgres js1
Using postgres.js

/* We now have a working DB handle. */

/* From here, we do: */

db.query(“select 1::int;”, function (err, rs) {

// Wait, a function?

console.log(sys.inspect(rs));

});

what s going on here
What’s going on here?

/* We now have a working DB handle. */

/* From here, we do: */

db.query(“select 1::int;”, function (err, rs) {

// Wait, a function?

console.log(sys.inspect(rs));

});

what you get
What you get

1

3

// A little while later

2

it s happening asynchronously
It’s happening asynchronously!
  • The function argument is what’s going to happen when the DB comes back
  • db.query returns immediately
  • and your app keeps on going!
prepared queries
Prepared queries

/* Prepared queries work the same way */

db.prepare(“select ?::int as foobar;”, function (sth) {

sth.execute(1, function (err, rs) {

console.log(sys.inspect(rs));

});

sth.execute(2, function (err, rs) {

console.log(sys.inspect(rs));

});

});

prepared queries1
Prepared queries

/* which will return */

[ { foobar: 1 } ]

[ { foobar: 2 } ]

or this
Or this!

/*

This becomes a prepared statement behind the scenes

*/

db.query(“select ?::int as foobar;”,

1, // A single argument

function (err, rs) {

console.log(sys.inspect(rs));

});

it would return
It would return

[ { foobar: 1 } ]

bad bad bad
Bad, bad, bad.
  • postgres.js is still very alpha.
  • Node API is in flux
  • Learning Node takes a while
things that are pleasing
Things that are pleasing
  • clean, perl DBI-based API.
  • Official support from Command prompt
  • Performance!
vroom
Vroom

[ananke:~/src/postgres-js] aurynn> time node benchmark.js 40000

[ { count: 40001 } ]

node benchmark.js 40000 18.85s user 2.75s system 87% cpu 24.602 total

Just over 2122 queries/second.

shiny things
Shiny things!
  • Notify support
pg notifications
PG notifications

/* Event-driven frameworks are ideal for this, and

the notification setup can be handled behind the

scenes.

*/

db.on(“<NOTIFYNAME>”, function (payload) {

// Do something useful as a result of

// the notification from PG

});

shiny things1
Shiny things!
  • Notify support
  • Stability
shiny things2
Shiny things!
  • Notify support
  • Stability
  • Better error handling
shiny things3
Shiny things!
  • Notify support
  • Stability
  • Better error handling
  • More test cases
shiny things4
Shiny things!
  • Notify support
  • Stability
  • Better error handling
  • More test cases
  • Better type coercion
https github com commandprompt postgres js

FORK IT, AND HELP!

UNSTABLE

https://github.com/commandprompt/postgres-js/

https://github.com/aurynn/postgres-js/

NOT QUITE AS UNSTABLE

ad