Skip to content

Commit d65f89b

Browse files
committed
Merge pull request dresende#35 from devotis/master
Add support for mssql
2 parents f958505 + e8b6cc5 commit d65f89b

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed

Readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ npm install sql-query
1313
- MySQL
1414
- PostgreSQL
1515
- SQLite
16+
- MSSQL
1617

1718
## About
1819

lib/Dialects/mssql.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
var util = require("util");
2+
var helpers = require("../Helpers");
3+
4+
exports.DataTypes = {
5+
id: 'INT IDENTITY(1,1) NOT NULL PRIMARY KEY',
6+
int: 'INT',
7+
float: 'FLOAT',
8+
bool: 'BIT',
9+
text: 'TEXT'
10+
};
11+
12+
13+
exports.escape = function (query, args) {
14+
return helpers.escapeQuery(exports, query, args);
15+
}
16+
17+
exports.escapeId = function () {
18+
return Array.prototype.slice.apply(arguments).map(function (el) {
19+
if (typeof el == "object") {
20+
return el.str.replace(/\?:(id|value)/g, function (m) {
21+
if (m == "?:id") {
22+
return exports.escapeId(el.escapes.shift());
23+
}
24+
// ?:value
25+
return exports.escapeVal(el.escapes.shift());
26+
});
27+
}
28+
return "[" + el + "]";
29+
}).join(".");
30+
};
31+
32+
exports.escapeVal = function (val, timeZone) {
33+
if (val === undefined || val === null) {
34+
return 'NULL';
35+
}
36+
37+
if (Array.isArray(val)) {
38+
if (val.length === 1 && Array.isArray(val[0])) {
39+
return "(" + val[0].map(exports.escapeVal.bind(this)) + ")";
40+
}
41+
return "(" + val.map(exports.escapeVal.bind(this)).join(", ") + ")";
42+
}
43+
44+
if (util.isDate(val)) {
45+
return "'" + helpers.dateToString(val, timeZone || "local", { dialect: 'mssql' }) + "'";
46+
}
47+
48+
if (Buffer.isBuffer(val)) {
49+
return "X'" + val.toString("hex") + "'";
50+
}
51+
52+
switch (typeof val) {
53+
case "number":
54+
if (!isFinite(val)) {
55+
val = val.toString();
56+
break;
57+
}
58+
return val;
59+
case "boolean":
60+
return val ? 1 : 0;
61+
case "function":
62+
return val(exports);
63+
}
64+
65+
return "'" + val.replace(/\'/g, "''") + "'";
66+
};
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
var common = require('../common');
2+
var assert = require('assert');
3+
var dialect = common.getDialect('mssql');
4+
var d = new Date(1378322111133);
5+
var tzOffsetMillis = (d.getTimezoneOffset() * 60 * 1000);
6+
7+
assert.equal(
8+
dialect.escapeId('col'),
9+
"[col]"
10+
);
11+
12+
assert.equal(
13+
dialect.escapeId('table', 'col'),
14+
"[table].[col]"
15+
);
16+
17+
assert.equal(
18+
dialect.escapeId('table', 'co\'l'),
19+
"[table].[co\'l]"
20+
);
21+
22+
assert.equal(
23+
dialect.escapeVal(undefined),
24+
'NULL'
25+
);
26+
27+
assert.equal(
28+
dialect.escapeVal(null),
29+
'NULL'
30+
);
31+
32+
assert.equal(
33+
dialect.escapeVal(123),
34+
"123"
35+
);
36+
37+
assert.equal(
38+
dialect.escapeVal(NaN),
39+
"'NaN'"
40+
);
41+
42+
assert.equal(
43+
dialect.escapeVal(Infinity),
44+
"'Infinity'"
45+
);
46+
47+
assert.equal(
48+
dialect.escapeVal('abc'),
49+
"'abc'"
50+
);
51+
52+
assert.equal(
53+
dialect.escapeVal('ab\'c'),
54+
"'ab''c'"
55+
);
56+
57+
assert.equal(
58+
dialect.escapeVal([ 1, 'abc', 'a\'' ]),
59+
"(1, 'abc', 'a''')"
60+
);
61+
62+
assert.equal(
63+
dialect.escapeVal(true),
64+
"1"
65+
);
66+
67+
assert.equal(
68+
dialect.escapeVal(false),
69+
"0"
70+
);
71+
72+
assert.equal(
73+
dialect.escapeVal(new Date(d.getTime() + tzOffsetMillis)),
74+
"'2013-09-04T19:15:11.133Z'"
75+
);
76+
77+
assert.equal(
78+
dialect.escapeVal(new Date(d.getTime()), 'Z'),
79+
"'2013-09-04T19:15:11.133Z'"
80+
);
81+
82+
assert.equal(
83+
dialect.escapeVal(new Date(d.getTime()), '-0000'),
84+
"'2013-09-04T19:15:11.133Z'"
85+
);
86+
87+
assert.equal(
88+
dialect.escapeVal(new Date(d.getTime()), '-0400'),
89+
"'2013-09-04T15:15:11.133Z'"
90+
);
91+
92+
assert.equal(
93+
dialect.escapeVal(new Date(d.getTime())),
94+
dialect.escapeVal(new Date(d.getTime()), 'local')
95+
);

0 commit comments

Comments
 (0)