Skip to content

Commit 76ac3db

Browse files
author
Raymond Feng
committed
Bring up the postgresql connector
1 parent 2b82a34 commit 76ac3db

File tree

4 files changed

+53
-38
lines changed

4 files changed

+53
-38
lines changed

lib/discovery.js

+16-27
Original file line numberDiff line numberDiff line change
@@ -352,42 +352,31 @@ function mixinDiscovery(PostgreSQL) {
352352
function mysqlDataTypeToJSONType(mysqlType, dataLength) {
353353
var type = mysqlType.toUpperCase();
354354
switch (type) {
355-
case 'CHAR':
356-
if (dataLength === 1) {
357-
// Treat char(1) as boolean
358-
return 'Boolean';
359-
} else {
360-
return 'String';
361-
}
362-
355+
case 'BOOLEAN':
356+
return 'Boolean';
357+
case 'CHARACTER VARYING':
363358
case 'VARCHAR':
364-
case 'TINYTEXT':
365-
case 'MEDIUMTEXT':
366-
case 'LONGTEXT':
359+
case 'CHARACTER':
367360
case 'TEXT':
368-
case 'ENUM':
369-
case 'SET':
370361
return 'String';
371-
case 'TINYBLOB':
372-
case 'MEDIUMBLOB':
373-
case 'LONGBLOB':
374-
case 'BLOB':
375-
case 'BINARY':
376-
case 'VARBINARY':
377-
case 'BIT':
362+
case 'BYTEA':
378363
return 'Binary';
379-
case 'TINYINT':
380364
case 'SMALLINT':
381-
case 'INT':
382-
case 'MEDIUMINT':
383-
case 'YEAR':
384-
case 'FLOAT':
385-
case 'DOUBLE':
365+
case 'INTEGER':
366+
case 'BIGINT':
367+
case 'DECIMAL':
368+
case 'NUMERIC':
369+
case 'REAL':
370+
case 'DOUBLE PRECISION':
371+
case 'SERIAL':
372+
case 'BIGSERIAL':
386373
return 'Number';
387374
case 'DATE':
388375
case 'TIMESTAMP':
389-
case 'DATETIME':
376+
case 'TIME':
390377
return 'Date';
378+
case 'POINT':
379+
return 'GeoPoint';
391380
default:
392381
return 'String';
393382
}

lib/postgresql.js

+34-8
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ PostgreSQL.prototype.count = function count(model, callback, filter) {
201201
this.query('SELECT count(*) as "cnt" FROM '
202202
+ ' ' + this.toFilter(model, filter && {where: filter}), function (err, data) {
203203
if (err) return callback(err);
204-
callback(err, data && data[0] && data[0].cnt);
204+
var c = data && data[0] && data[0].cnt;
205+
callback(err, Number(c));
205206
}.bind(this));
206207
};
207208

@@ -468,18 +469,41 @@ PostgreSQL.prototype.toDatabase = function (prop, val) {
468469
return 'NULL';
469470
}
470471
}
472+
if (!val) {
473+
if( prop.autoIncrement ) {
474+
return 'DEFAULT';
475+
}
476+
else {
477+
return 'NULL';
478+
}
479+
}
480+
if (!val.toISOString) {
481+
val = new Date(val);
482+
}
483+
var iso = escape(val.toISOString());
484+
return 'TIMESTAMP WITH TIME ZONE ' + iso;
485+
/*
471486
if (!val.toUTCString) {
472487
val = new Date(val);
473488
}
474489
return dateToPostgreSQL(val, prop.type.name === 'Date');
490+
*/
475491
}
476492

477493
// PostgreSQL support char(1) Y/N
478494
if (prop.type.name === 'Boolean') {
479495
if (!val) {
480-
return "'Y'";
496+
return "TRUE";
481497
} else {
482-
return "'N'";
498+
return "FALSE";
499+
}
500+
}
501+
502+
if (prop.type.name === 'GeoPoint') {
503+
if(val) {
504+
return '(' + val.lat + ',' + val.lng +')';
505+
} else {
506+
return 'NULL';
483507
}
484508
}
485509

@@ -958,7 +982,9 @@ function getAddModifyColumns(model, actualFields) {
958982
sql = sql.concat(getColumnsToAdd.call(self, model, actualFields));
959983
var drops = getPropertiesToModify.call(self, model, actualFields);
960984
if(drops.length > 0) {
961-
sql = sql.concat(', ');
985+
if(sql.length > 0) {
986+
sql = sql.concat(', ');
987+
}
962988
sql = sql.concat(drops);
963989
}
964990
// sql = sql.concat(getColumnsToDrop.call(self, model, actualFields));
@@ -1230,7 +1256,7 @@ function escape(val) {
12301256

12311257
switch (typeof val) {
12321258
case 'boolean':
1233-
return (val) ? "'Y'" : "'N'";
1259+
return (val) ? "true" : "false";
12341260
case 'number':
12351261
return val + '';
12361262
}
@@ -1299,11 +1325,11 @@ PostgreSQL.prototype.columnDataType = function (model, property) {
12991325
case 'Number':
13001326
return 'INTEGER';
13011327
case 'Date':
1302-
return 'DATE';
1328+
return 'TIMESTAMP WITH TIME ZONE';
13031329
case 'Timestamp':
1304-
return 'TIMESTAMP(3)';
1330+
return 'TIMESTAMP WITH TIME ZONE';
13051331
case 'Boolean':
1306-
return 'CHAR(1)'; // PostgreSQL doesn't have built-in boolean
1332+
return 'BOOLEAN'; // PostgreSQL doesn't have built-in boolean
13071333
}
13081334
};
13091335

run-tests

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/bin/bash
22
ROOT=`dirname $0`
3-
$ROOT/node_modules/.bin/mocha --timeout 30000 --require $ROOT/test/init.js $ROOT/test/*.test.js
3+
$ROOT/node_modules/.bin/mocha --timeout 10000 --require $ROOT/test/init.js $ROOT/test/*.test.js
44

test/postgresql.discover.test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ describe('Discover model foreign keys', function () {
172172
});
173173
});
174174

175-
describe('Discover ADL schema from a table', function () {
176-
it('should return an ADL schema for INVENTORY', function (done) {
175+
describe('Discover LDL schema from a table', function () {
176+
it('should return an LDL schema for INVENTORY', function (done) {
177177
db.discoverSchema('INVENTORY', {owner: 'STRONGLOOP'}, function (err, schema) {
178178
// console.log('%j', schema);
179179
assert(schema.name === 'Inventory');

0 commit comments

Comments
 (0)