UNPKG

1.49 kBJavaScriptView Raw
1'use strict'
2
3const co = require('co')
4const cli = require('heroku-cli-util')
5const pg = require('heroku-pg')
6
7function * run (context, heroku) {
8 let db = yield pg.fetcher(heroku).database(context.app, context.args.database)
9
10 let truncatedQueryString = prefix => {
11 let column = `${prefix}query`
12 if (context.flags.truncate) {
13 return `CASE WHEN length(${column}) <= 40 THEN ${column} ELSE substr(${column}, 0, 39) || '…' END`
14 } else {
15 return column
16 }
17 }
18
19 let query = `
20 SELECT
21 pg_stat_activity.pid,
22 pg_class.relname,
23 pg_locks.transactionid,
24 pg_locks.granted,
25 ${truncatedQueryString('pg_stat_activity.')} AS query_snippet,
26 age(now(),pg_stat_activity.query_start) AS "age"
27 FROM pg_stat_activity,pg_locks left
28 OUTER JOIN pg_class
29 ON (pg_locks.relation = pg_class.oid)
30 WHERE pg_stat_activity.query <> '<insufficient privilege>'
31 AND pg_locks.pid = pg_stat_activity.pid
32 AND pg_locks.mode = 'ExclusiveLock'
33 AND pg_stat_activity.pid <> pg_backend_pid() order by query_start;
34 `
35
36 let output = yield pg.psql.exec(db, query)
37 process.stdout.write(output)
38}
39
40const cmd = {
41 topic: 'pg',
42 description: 'display queries with active locks',
43 needsApp: true,
44 needsAuth: true,
45 args: [{name: 'database', optional: true}],
46 flags: [{name: 'truncate', char: 't', description: 'truncates queries to 40 charaters'}],
47 run: cli.command(co.wrap(run))
48}
49
50module.exports = [
51 Object.assign({command: 'locks'}, cmd)
52]