JS: Improve mssql model

This commit is contained in:
Asger Feldthaus
2021-03-30 10:06:14 +01:00
parent 95937c9ac7
commit 93500bd95a
4 changed files with 37 additions and 7 deletions

View File

@@ -371,15 +371,32 @@ private module MsSql {
/** Gets a reference to the `mssql` module. */
API::Node mssql() { result = API::moduleImport("mssql") }
/** Gets an expression that creates a request object. */
API::Node request() {
// new require('mssql').Request()
result = mssql().getMember("Request").getInstance()
/** Gets a node referring to an instance of the given class. */
API::Node mssqlClass(string name) {
result = mssql().getMember(name).getInstance()
or
// request.input(...)
result = request().getMember("input").getReturn()
result = API::Node::ofType("mssql", name)
}
/** Gets an API node referring to a Request object. */
API::Node request() {
result = mssqlClass("Request")
or
result = request().getMember(["input", "replaceInput", "output", "replaceOutput"]).getReturn()
or
result = [transaction(), pool()].getMember("request").getReturn()
}
/** Gets an API node referring to a Transaction object. */
API::Node transaction() {
result = mssqlClass("Transaction")
or
result = pool().getMember("transaction").getReturn()
}
/** Gets a API node referring to a ConnectionPool object. */
API::Node pool() { result = mssqlClass("ConnectionPool") }
/** A tagged template evaluated as a query. */
private class QueryTemplateExpr extends DatabaseAccess, DataFlow::ValueNode {
override TaggedTemplateExpr astNode;
@@ -395,7 +412,7 @@ private module MsSql {
/** A call to a MsSql query method. */
private class QueryCall extends DatabaseAccess, DataFlow::MethodCallNode {
QueryCall() { this = request().getMember(["query", "batch"]).getACall() }
QueryCall() { this = [mssql(), request()].getMember(["query", "batch"]).getACall() }
override DataFlow::Node getAQueryArgument() { result = getArgument(0) }
}

View File

@@ -1,9 +1,11 @@
| mssql1.js:7:40:7:72 | select ... e id = |
| mssql1.js:7:75:7:79 | value |
| mssql1.js:10:19:10:30 | 'SELECT 123' |
| mssql2.js:5:15:5:34 | 'select 1 as number' |
| mssql2.js:13:15:13:66 | 'create ... table' |
| mssql2.js:22:24:22:43 | 'select 1 as number' |
| mssql2.js:29:30:29:81 | 'create ... table' |
| mssql-types.ts:7:31:7:42 | 'SELECT 123' |
| mysql1.js:13:18:13:43 | 'SELECT ... lution' |
| mysql1.js:18:18:22:1 | {\\n s ... vid']\\n} |
| mysql1a.js:17:18:17:43 | 'SELECT ... lution' |

View File

@@ -0,0 +1,9 @@
import { ConnectionPool } from "mssql";
class Foo {
constructor(private pool: ConnectionPool) {}
doSomething() {
this.pool.request().query('SELECT 123');
}
}

View File

@@ -6,6 +6,8 @@ async () => {
const pool = await sql.connect('mssql://username:password@localhost/database')
const result = await sql.query`select * from mytable where id = ${value}`
console.dir(result)
sql.query('SELECT 123');
} catch (err) {
// ... error checks
}