diff --git a/.gitignore b/.gitignore index 169eef37..8bdbeb0f 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,6 @@ typings/ # TernJS port file .tern-port + +# TypeScript output files +dist/ diff --git a/dist/api.js b/dist/api.js deleted file mode 100644 index d521d1a6..00000000 --- a/dist/api.js +++ /dev/null @@ -1,15 +0,0 @@ -"use strict"; -var express_1 = require("express"); -var cors = require("cors"); -var connectionMiddleware_1 = require("./lib/connectionMiddleware"); -var router = express_1.Router(); -router.use(cors()); -router.use('/config', connectionMiddleware_1.addConnectionToRequest, require('./api/config')); -router.use('/columns', connectionMiddleware_1.addConnectionToRequest, require('./api/columns')); -router.use('/extensions', connectionMiddleware_1.addConnectionToRequest, require('./api/extensions')); -router.use('/query', connectionMiddleware_1.addConnectionToRequest, require('./api/query')); -router.use('/schemas', connectionMiddleware_1.addConnectionToRequest, require('./api/schemas')); -router.use('/tables', connectionMiddleware_1.addConnectionToRequest, require('./api/tables')); -router.use('/types', connectionMiddleware_1.addConnectionToRequest, require('./api/types')); -router.use('/roles', connectionMiddleware_1.addConnectionToRequest, require('./api/roles')); -module.exports = router; diff --git a/dist/api/columns.js b/dist/api/columns.js deleted file mode 100644 index 52dbc65c..00000000 --- a/dist/api/columns.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var connectionPool_1 = require("../lib/connectionPool"); -var sql = require("../lib/sql"); -var columns = sql.columns; -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, columns.list)]; - case 1: - data = (_a.sent()).data; - return [2 /*return*/, res.status(200).json(data)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error'); - res.status(500).send('Database error.'); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -module.exports = router; diff --git a/dist/api/config.js b/dist/api/config.js deleted file mode 100644 index 3ae734af..00000000 --- a/dist/api/config.js +++ /dev/null @@ -1,81 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var connectionPool_1 = require("../lib/connectionPool"); -var sql = require("../lib/sql"); -var config = sql.config; -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, config.list)]; - case 1: - data = (_a.sent()).data; - return [2 /*return*/, res.status(200).json(data)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error'); - res.status(500).send('Database error.'); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -router.get('/version', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, error_2; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, config.version)]; - case 1: - data = (_a.sent()).data; - return [2 /*return*/, res.status(200).json(data[0])]; // only one row - case 2: - error_2 = _a.sent(); - console.log('throwing error'); - res.status(500).send('Database error.'); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -module.exports = router; diff --git a/dist/api/extensions.js b/dist/api/extensions.js deleted file mode 100644 index 7c4090f9..00000000 --- a/dist/api/extensions.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var connectionPool_1 = require("../lib/connectionPool"); -var sql = require("../lib/sql"); -var extensions = sql.extensions; -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, extensions.list)]; - case 1: - data = (_a.sent()).data; - return [2 /*return*/, res.status(200).json(data)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error'); - res.status(500).json({ error: 'Database error', status: 500 }); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -module.exports = router; diff --git a/dist/api/query.js b/dist/api/query.js deleted file mode 100644 index fbe81177..00000000 --- a/dist/api/query.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var connectionPool_1 = require("../lib/connectionPool"); -var router = express_1.Router(); -router.post('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var query, data, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - query = req.body.query; - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, query)]; - case 1: - data = (_a.sent()).data; - return [2 /*return*/, res.status(200).json(data || [])]; - case 2: - error_1 = _a.sent(); - // For this one, we always want to give back the error to the customer - console.log('Soft error!', error_1); - res.status(200).json([{ error: error_1.toString() }]); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -module.exports = router; diff --git a/dist/api/roles.js b/dist/api/roles.js deleted file mode 100644 index 8f91c253..00000000 --- a/dist/api/roles.js +++ /dev/null @@ -1,84 +0,0 @@ -"use strict"; -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var sql = require("../lib/sql"); -var roles = sql.roles; -var connectionPool_1 = require("../lib/connectionPool"); -var schemas_1 = require("../lib/constants/schemas"); -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, query, payload, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, roles.list)]; - case 1: - data = (_a.sent()).data; - query = req.query; - payload = data; - if (!(query === null || query === void 0 ? void 0 : query.includeSystemSchemas)) - payload = removeSystemSchemas(data); - return [2 /*return*/, res.status(200).json(payload)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error'); - res.status(500).json({ error: 'Database error', status: 500 }); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -var removeSystemSchemas = function (data) { - return data.map(function (role) { - var grants = role.grants.filter(function (x) { return !schemas_1.DEFAULT_SYSTEM_SCHEMAS.includes(x.schema); }); - return __assign(__assign({}, role), { grants: grants }); - }); -}; -module.exports = router; diff --git a/dist/api/schemas.js b/dist/api/schemas.js deleted file mode 100644 index cd5bd939..00000000 --- a/dist/api/schemas.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var sql = require("../lib/sql"); -var schemas = sql.schemas; -var connectionPool_1 = require("../lib/connectionPool"); -var schemas_1 = require("../lib/constants/schemas"); -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, query, payload, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, schemas.list)]; - case 1: - data = (_a.sent()).data; - query = req.query; - payload = data; - if (!(query === null || query === void 0 ? void 0 : query.includeSystemSchemas)) - payload = removeSystemSchemas(data); - return [2 /*return*/, res.status(200).json(payload)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error'); - res.status(500).json({ error: 'Database error', status: 500 }); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -var removeSystemSchemas = function (data) { - return data.filter(function (x) { return !schemas_1.DEFAULT_SYSTEM_SCHEMAS.includes(x.name); }); -}; -module.exports = router; diff --git a/dist/api/tables.js b/dist/api/tables.js deleted file mode 100644 index a400fbfa..00000000 --- a/dist/api/tables.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var sql = require("../lib/sql"); -var tables = sql.tables; -var connectionPool_1 = require("../lib/connectionPool"); -var schemas_1 = require("../lib/constants/schemas"); -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, query, payload, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, tables.list)]; - case 1: - data = (_a.sent()).data; - query = req.query; - payload = data; - if (!(query === null || query === void 0 ? void 0 : query.includeSystemSchemas)) - payload = removeSystemSchemas(data); - return [2 /*return*/, res.status(200).json(payload)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error', error_1); - res.status(500).json({ error: 'Database error', status: 500 }); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -var removeSystemSchemas = function (data) { - return data.filter(function (x) { return !schemas_1.DEFAULT_SYSTEM_SCHEMAS.includes(x.schema); }); -}; -module.exports = router; diff --git a/dist/api/types.js b/dist/api/types.js deleted file mode 100644 index 1effc80e..00000000 --- a/dist/api/types.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var express_1 = require("express"); -var sql = require("../lib/sql"); -var types = sql.types; -var connectionPool_1 = require("../lib/connectionPool"); -var schemas_1 = require("../lib/constants/schemas"); -var router = express_1.Router(); -router.get('/', function (req, res) { return __awaiter(void 0, void 0, void 0, function () { - var data, query, payload, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - _a.trys.push([0, 2, , 3]); - return [4 /*yield*/, connectionPool_1.RunQuery(req.headers.pg, types.list)]; - case 1: - data = (_a.sent()).data; - query = req.query; - payload = data; - if (!(query === null || query === void 0 ? void 0 : query.includeSystemSchemas)) - payload = removeSystemSchemas(data); - return [2 /*return*/, res.status(200).json(payload)]; - case 2: - error_1 = _a.sent(); - console.log('throwing error'); - res.status(500).json({ error: 'Database error', status: 500 }); - return [3 /*break*/, 3]; - case 3: return [2 /*return*/]; - } - }); -}); }); -var removeSystemSchemas = function (data) { - return data.filter(function (x) { return !schemas_1.DEFAULT_SYSTEM_SCHEMAS.includes(x.schema); }); -}; -module.exports = router; diff --git a/dist/lib/connectionMiddleware.js b/dist/lib/connectionMiddleware.js deleted file mode 100644 index 050e3195..00000000 --- a/dist/lib/connectionMiddleware.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.addConnectionToRequest = void 0; -var CryptoJS = require("crypto-js"); -var constants_1 = require("./constants"); -/** - * Adds a "pg" object to the request if it doesn't exist - */ -exports.addConnectionToRequest = function (req, res, next) { return __awaiter(void 0, void 0, void 0, function () { - var encryptedHeader; - return __generator(this, function (_a) { - try { - req.headers['pg'] = constants_1.PG_CONNECTION; - encryptedHeader = 'x-connection-encrypted' in req.headers ? req.headers['x-connection-encrypted'] : null; - if (encryptedHeader) { - req.headers['pg'] = CryptoJS.AES.decrypt(encryptedHeader, constants_1.CRYPTO_KEY).toString(CryptoJS.enc.Utf8); - } - return [2 /*return*/, next()]; - } - catch (error) { - console.log('error', error); - return [2 /*return*/, res.status(500).json({ status: 500, error: 'Server error.' })]; - } - return [2 /*return*/]; - }); -}); }; diff --git a/dist/lib/connectionPool.js b/dist/lib/connectionPool.js deleted file mode 100644 index 4772cdf0..00000000 --- a/dist/lib/connectionPool.js +++ /dev/null @@ -1,73 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.RunQuery = void 0; -var pg = require("pg"); -pg.types.setTypeParser(20, 'text', parseInt); -var Pool = pg.Pool; -exports.RunQuery = function (connectionString, sql) { return __awaiter(void 0, void 0, void 0, function () { - var pool, results, error_1; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - pool = new Pool({ connectionString: connectionString }); - _a.label = 1; - case 1: - _a.trys.push([1, 3, 4, 5]); - return [4 /*yield*/, pool.query(sql)]; - case 2: - results = _a.sent(); - return [2 /*return*/, { data: results.rows, error: null }]; - case 3: - error_1 = _a.sent(); - console.log('PG Error'); - throw error_1; - case 4: - // Try to close the connection - // Not necessary? - try { - pool.end(); - } - catch (error) { - console.log('pool.end error', error); - } - return [7 /*endfinally*/]; - case 5: return [2 /*return*/]; - } - }); -}); }; diff --git a/dist/lib/constants.js b/dist/lib/constants.js deleted file mode 100644 index a31c6c0b..00000000 --- a/dist/lib/constants.js +++ /dev/null @@ -1,7 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.PG_CONNECTION = exports.CRYPTO_KEY = exports.PG_API_PORT = exports.PG_API_URL = void 0; -exports.PG_API_URL = process.env.PG_API_URL || 'http://localhost'; -exports.PG_API_PORT = Number(process.env.PG_API_PORT || 1337); -exports.CRYPTO_KEY = process.env.CRYPTO_KEY || 'SAMPLE_KEY'; -exports.PG_CONNECTION = 'postgres://postgres:postgres@localhost:5432/postgres'; diff --git a/dist/lib/constants/schemas.js b/dist/lib/constants/schemas.js deleted file mode 100644 index 897efd32..00000000 --- a/dist/lib/constants/schemas.js +++ /dev/null @@ -1,10 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DEFAULT_SYSTEM_SCHEMAS = void 0; -exports.DEFAULT_SYSTEM_SCHEMAS = [ - 'information_schema', - 'pg_catalog', - 'pg_toast_temp_1', - 'pg_temp_1', - 'pg_toast', -]; diff --git a/dist/lib/interfaces/roles.js b/dist/lib/interfaces/roles.js deleted file mode 100644 index c8ad2e54..00000000 --- a/dist/lib/interfaces/roles.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/lib/interfaces/schemas.js b/dist/lib/interfaces/schemas.js deleted file mode 100644 index c8ad2e54..00000000 --- a/dist/lib/interfaces/schemas.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/lib/interfaces/tables.js b/dist/lib/interfaces/tables.js deleted file mode 100644 index c8ad2e54..00000000 --- a/dist/lib/interfaces/tables.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/lib/interfaces/types.js b/dist/lib/interfaces/types.js deleted file mode 100644 index c8ad2e54..00000000 --- a/dist/lib/interfaces/types.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/lib/sql/columns/list.sql b/dist/lib/sql/columns/list.sql deleted file mode 100644 index 99acda5e..00000000 --- a/dist/lib/sql/columns/list.sql +++ /dev/null @@ -1,11 +0,0 @@ -select - table_schema, - table_name, - column_name, - column_default, - is_nullable::boolean, - data_type, - udt_name as format, - col_description((table_schema || '."' || table_name || '"')::regclass, ordinal_position) -from information_schema.columns -order by table_schema, table_name, ordinal_position diff --git a/dist/lib/sql/config/list.sql b/dist/lib/sql/config/list.sql deleted file mode 100644 index 06da8369..00000000 --- a/dist/lib/sql/config/list.sql +++ /dev/null @@ -1,25 +0,0 @@ -select - "name", - setting, - category, - TRIM(split_part(category, '/', 1)) as "group", - TRIM(split_part(category, '/', 2)) as "subgroup", - unit, - short_desc, - extra_desc, - context, - vartype, - "source", - min_val, - max_val, - enumvals, - boot_val, - reset_val, - sourcefile, - sourceline, - pending_restart -FROM - pg_settings -ORDER BY - category, - name \ No newline at end of file diff --git a/dist/lib/sql/config/version.sql b/dist/lib/sql/config/version.sql deleted file mode 100644 index c221d21a..00000000 --- a/dist/lib/sql/config/version.sql +++ /dev/null @@ -1,5 +0,0 @@ -select * from -(SELECT version()) "version", -(SELECT current_setting('server_version_num') as version_number) version_number, -(SELECT count(pid) as active_connections FROM pg_stat_activity WHERE state = 'active') active_connections, -(SELECT setting as max_connections from pg_settings where name = 'max_connections') max_connections; \ No newline at end of file diff --git a/dist/lib/sql/constraints/list.sql b/dist/lib/sql/constraints/list.sql deleted file mode 100644 index ac1c3ce5..00000000 --- a/dist/lib/sql/constraints/list.sql +++ /dev/null @@ -1,26 +0,0 @@ -select - coalesce(table_schema, referenced_schema) as table_schema, - coalesce(table_name, referenced_table) as table_name, - coalesce(column_name, referenced_column) as column_name, - constraint_schema, - constraint_name, - constraint_type, - check_clause, - referenced_schema, - referenced_table, - referenced_column - -from information_schema.table_constraints -natural full join information_schema.key_column_usage -natural full join information_schema.check_constraints -inner join ( - select - table_schema as referenced_schema, - table_name as referenced_table, - column_name as referenced_column, - constraint_name - from information_schema.constraint_column_usage -) as referenced_columns using (constraint_name) - -where constraint_schema = ? -order by table_schema, table_name, ordinal_position diff --git a/dist/lib/sql/extensions/enabled.sql b/dist/lib/sql/extensions/enabled.sql deleted file mode 100644 index 8d9c7a05..00000000 --- a/dist/lib/sql/extensions/enabled.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT e.extname AS "name", e.extversion AS "version", n.nspname AS "schema", c.description AS "description" -FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass -ORDER BY 1; \ No newline at end of file diff --git a/dist/lib/sql/index.js b/dist/lib/sql/index.js deleted file mode 100644 index 5a5b8cf8..00000000 --- a/dist/lib/sql/index.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; -var fs = require("fs"); -var path = require("path"); -module.exports = { - columns: { - list: fs.readFileSync(path.join(__dirname, '/columns/list.sql')).toString(), - }, - config: { - list: fs.readFileSync(path.join(__dirname, '/config/list.sql')).toString(), - version: fs.readFileSync(path.join(__dirname, '/config/version.sql')).toString(), - }, - constraints: { - list: fs.readFileSync(path.join(__dirname, '/constraints/list.sql')).toString(), - }, - joins: { - list: fs.readFileSync(path.join(__dirname, '/joins/list.sql')).toString(), - }, - extensions: { - list: fs.readFileSync(path.join(__dirname, '/extensions/list.sql')).toString(), - }, - policies: { - list: fs.readFileSync(path.join(__dirname, '/policies/list.sql')).toString(), - }, - stats: { - tableSize: fs.readFileSync(path.join(__dirname, '/stats/table_size.sql')).toString(), - }, - sequences: { - list: fs.readFileSync(path.join(__dirname, '/sequences/list.sql')).toString(), - }, - schemas: { - list: fs.readFileSync(path.join(__dirname, '/schemas/list.sql')).toString(), - }, - types: { - list: fs.readFileSync(path.join(__dirname, '/types/list.sql')).toString(), - }, - tables: { - list: fs.readFileSync(path.join(__dirname, '/tables/list.sql')).toString(), - }, - roles: { - list: fs.readFileSync(path.join(__dirname, '/roles/list.sql')).toString(), - }, - views: { - list: fs.readFileSync(path.join(__dirname, '/views/list.sql')).toString(), - }, -}; diff --git a/dist/lib/sql/index.ts b/dist/lib/sql/index.ts deleted file mode 100644 index 0e98b167..00000000 --- a/dist/lib/sql/index.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as fs from 'fs' -import * as path from 'path' - -export = { - columns: { - list: fs.readFileSync(path.join(__dirname, '/columns/list.sql')).toString(), - }, - config: { - list: fs.readFileSync(path.join(__dirname, '/config/list.sql')).toString(), - version: fs.readFileSync(path.join(__dirname, '/config/version.sql')).toString(), - }, - constraints: { - list: fs.readFileSync(path.join(__dirname, '/constraints/list.sql')).toString(), - }, - joins: { - list: fs.readFileSync(path.join(__dirname, '/joins/list.sql')).toString(), - }, - extensions: { - list: fs.readFileSync(path.join(__dirname, '/extensions/list.sql')).toString(), - }, - policies: { - list: fs.readFileSync(path.join(__dirname, '/policies/list.sql')).toString(), - }, - stats: { - tableSize: fs.readFileSync(path.join(__dirname, '/stats/table_size.sql')).toString(), - }, - sequences: { - list: fs.readFileSync(path.join(__dirname, '/sequences/list.sql')).toString(), - }, - schemas: { - list: fs.readFileSync(path.join(__dirname, '/schemas/list.sql')).toString(), - }, - types: { - list: fs.readFileSync(path.join(__dirname, '/types/list.sql')).toString(), - }, - tables: { - list: fs.readFileSync(path.join(__dirname, '/tables/list.sql')).toString(), - }, - roles: { - list: fs.readFileSync(path.join(__dirname, '/roles/list.sql')).toString(), - }, - views: { - list: fs.readFileSync(path.join(__dirname, '/views/list.sql')).toString(), - }, -} diff --git a/dist/lib/sql/joins/list.sql b/dist/lib/sql/joins/list.sql deleted file mode 100644 index 4dadd50c..00000000 --- a/dist/lib/sql/joins/list.sql +++ /dev/null @@ -1,12 +0,0 @@ -SELECT - tc.table_schema, - tc.constraint_name, - tc.table_name, - kcu.column_name, - ccu.table_schema AS foreign_table_schema, - ccu.table_name AS foreign_table_name, - ccu.column_name AS foreign_column_name -FROM information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) - JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) -where tc.table_schema = ? and tc.constraint_type = 'FOREIGN KEY'; \ No newline at end of file diff --git a/dist/lib/sql/policies/list.sql b/dist/lib/sql/policies/list.sql deleted file mode 100644 index 4f5c89f7..00000000 --- a/dist/lib/sql/policies/list.sql +++ /dev/null @@ -1,27 +0,0 @@ -SELECT n.nspname AS schemaname, - c.relname AS tablename, - pol.polname AS policyname, - CASE - WHEN pol.polpermissive THEN 'PERMISSIVE'::text - ELSE 'RESTRICTIVE'::text - END AS permissive, - CASE - WHEN pol.polroles = '{0}'::oid[] THEN string_to_array('public'::text, ''::text)::name[] - ELSE ARRAY( SELECT pg_authid.rolname - FROM pg_authid - WHERE pg_authid.oid = ANY (pol.polroles) - ORDER BY pg_authid.rolname) - END AS roles, - CASE pol.polcmd - WHEN 'r'::"char" THEN 'SELECT'::text - WHEN 'a'::"char" THEN 'INSERT'::text - WHEN 'w'::"char" THEN 'UPDATE'::text - WHEN 'd'::"char" THEN 'DELETE'::text - WHEN '*'::"char" THEN 'ALL'::text - ELSE NULL::text - END AS cmd, - pg_get_expr(pol.polqual, pol.polrelid) AS qual, - pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check - FROM pg_policy pol - JOIN pg_class c ON c.oid = pol.polrelid - LEFT JOIN pg_namespace n ON n.oid = c.relnamespace; \ No newline at end of file diff --git a/dist/lib/sql/replication/temp.sql b/dist/lib/sql/replication/temp.sql deleted file mode 100644 index e7ec6fe1..00000000 --- a/dist/lib/sql/replication/temp.sql +++ /dev/null @@ -1,3 +0,0 @@ -select * from pg_stat_replication ; -select * from pg_stat_wal_receiver; -select * from pg_publication; \ No newline at end of file diff --git a/dist/lib/sql/roles/list.sql b/dist/lib/sql/roles/list.sql deleted file mode 100644 index 6612cda9..00000000 --- a/dist/lib/sql/roles/list.sql +++ /dev/null @@ -1,61 +0,0 @@ -with -roles as ( - select - usename as "name", - usesysid as "id", - usecreatedb as "has_create_db_privileges", - usesuper as "is_super_user", - userepl as "has_replication_privileges", - usebypassrls as "can_bypass_rls", - valuntil as "valid_until", -- Password expiry time (only used for password authentication) - useconfig as "user_config", -- Session defaults for run-time configuration variables - active_connections.connections, - pg_roles.rolconnlimit as max_user_connections, - max_db_connections.max_connections::int2 as max_db_connections - from - pg_user as users - inner join pg_roles on users.usename = pg_roles.rolname - INNER JOIN LATERAL - ( - SELECT count(*) as connections - FROM pg_stat_activity as active_connections - WHERE state = 'active' and users.usename = active_connections.usename - ) as active_connections on 1=1 - INNER JOIN LATERAL ( - SELECT setting as max_connections from pg_settings where name = 'max_connections' - ) as max_db_connections on 1=1 -), -grants as ( - SELECT - (table_schema || '.' || table_name) as table_id, - grantor, - grantee, - table_catalog as catalog, - table_schema as schema, - table_name, - privilege_type, - is_grantable::boolean, - with_hierarchy::boolean - FROM - information_schema.role_table_grants -) -SELECT - *, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(grants))) - FROM - ( - SELECT - * - FROM - grants - WHERE - grants.grantee = roles.name - ) grants - ), - '[]' - ) AS grants -FROM - roles \ No newline at end of file diff --git a/dist/lib/sql/schemas/list.sql b/dist/lib/sql/schemas/list.sql deleted file mode 100644 index f8491f9a..00000000 --- a/dist/lib/sql/schemas/list.sql +++ /dev/null @@ -1,10 +0,0 @@ -SELECT - catalog_name, - schema_name as name, - schema_owner as owner, - default_character_set_catalog, - default_character_set_schema, - default_character_set_name, - sql_path -FROM - information_schema.schemata \ No newline at end of file diff --git a/dist/lib/sql/sequences/list.sql b/dist/lib/sql/sequences/list.sql deleted file mode 100644 index 91949a29..00000000 --- a/dist/lib/sql/sequences/list.sql +++ /dev/null @@ -1,16 +0,0 @@ -select - table_schema, - table_name, - column_name, - sequence_name, - start_value, - minimum_value, - increment - -from information_schema.columns -inner join information_schema.sequences on ( - table_schema = sequence_schema and - pg_get_serial_sequence(table_schema || '."' || table_name || '"', column_name) = sequence_schema || '.' || sequence_name -) -where sequence_schema = ? -order by table_schema, table_name, ordinal_position diff --git a/dist/lib/sql/stats/table_size.sql b/dist/lib/sql/stats/table_size.sql deleted file mode 100644 index 744ecc36..00000000 --- a/dist/lib/sql/stats/table_size.sql +++ /dev/null @@ -1,11 +0,0 @@ --- error - returns the keys/indexes too - -SELECT - nspname AS "schema", - relname AS "table", - nspname || '.' || relname AS "relation", - pg_relation_size(C.oid) AS "size" -FROM pg_class C -LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) -WHERE nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema') -ORDER BY pg_relation_size(C.oid) DESC \ No newline at end of file diff --git a/dist/lib/sql/tables/list.sql b/dist/lib/sql/tables/list.sql deleted file mode 100644 index 490601f9..00000000 --- a/dist/lib/sql/tables/list.sql +++ /dev/null @@ -1,182 +0,0 @@ -WITH -tables as ( - select - (table_schema || '.' || table_name) as table_id, - table_catalog as catalog, - table_schema as schema, - table_name as name, - is_insertable_into, - is_typed, - pg_total_relation_size(table_schema || '.' || table_name)::bigint as bytes, - pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) as size, - seq_scan::bigint, - seq_tup_read::bigint, - idx_scan::bigint, - idx_tup_fetch::bigint, - n_tup_ins::bigint, - n_tup_upd::bigint, - n_tup_del::bigint, - n_tup_hot_upd::bigint, - n_live_tup::bigint, - n_dead_tup::bigint, - n_mod_since_analyze::bigint, - last_vacuum, - last_autovacuum, - last_analyze, - last_autoanalyze, - vacuum_count::bigint, - autovacuum_count::bigint, - analyze_count::bigint, - autoanalyze_count::bigint - from - information_schema.tables left join - pg_stat_user_tables on pg_stat_user_tables.schemaname = tables.table_schema and pg_stat_user_tables.relname = tables.table_name - where - table_type = 'BASE TABLE' -), -columns AS ( - select - table_schema as schema, - column_name as name, - column_default as default_value, - is_nullable::boolean, - is_nullable::boolean, - data_type, - is_identity::boolean, - identity_generation, - is_updatable::boolean, - udt_name as format, - table_name, - col_description( - (table_schema || '."' || table_name || '"') :: regclass, - ordinal_position - ) as description, - (table_schema || '.' || table_name) as table_id, - array_to_json(array( - select enumlabel - FROM pg_catalog.pg_enum enums - WHERE udt_name = pg_catalog.Format_type(enums.enumtypid::regclass, NULL) - ORDER BY enums.enumsortorder - )) AS enums - from - information_schema.columns -), -grants as ( - SELECT - (table_schema || '.' || table_name) as table_id, - grantor, - grantee, - table_catalog as catalog, - table_schema as schema, - table_name, - privilege_type, - is_grantable::boolean, - with_hierarchy::boolean - FROM - information_schema.role_table_grants -), -pk_list as ( - SELECT - pg_namespace.nspname as schema, - pg_class.oid :: regclass as table_name, - pg_attribute.attname as name, - ( - pg_namespace.nspname || '.' || (pg_class.oid :: regclass) - ) as table_id -FROM - pg_index, - pg_class, - pg_attribute, - pg_namespace -WHERE - indrelid = pg_class.oid - AND pg_class.relnamespace = pg_namespace.oid - AND pg_attribute.attrelid = pg_class.oid - AND pg_attribute.attnum = any(pg_index.indkey) -), -relationships as ( - select - (tc.table_schema || '.' || (tc.table_name)) as source_table_id, - tc.table_schema as source_schema, - tc.table_name as source_table_name, - kcu.column_name as source_column_name, - (ccu.table_schema || '.' || (ccu.table_name)) as target_table_id, - ccu.table_schema AS target_table_schema, - ccu.table_name AS target_table_name, - ccu.column_name AS target_column_name, - tc.constraint_name - FROM - information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) - JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) - where - tc.constraint_type = 'FOREIGN KEY' -) -SELECT - *, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(columns))) - FROM - ( - SELECT - * - FROM - columns - WHERE - columns.table_id = tables.table_id - ) columns - ), - '[]' - ) AS columns, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(grants))) - FROM - ( - SELECT - * - FROM - grants - WHERE - grants.table_id = tables.table_id - ) grants - ), - '[]' - ) AS grants, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(primary_keys))) - FROM - ( - SELECT - * - FROM - pk_list - WHERE - pk_list.table_id = tables.table_id - ) primary_keys - ), - '[]' - ) AS primary_keys, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(relationships))) - FROM - ( - SELECT - * - FROM - relationships - WHERE - relationships.source_table_id = tables.table_id - OR relationships.target_table_id = tables.table_id - ) relationships - ), - '[]' - ) AS relationships -FROM tables \ No newline at end of file diff --git a/dist/lib/sql/types/list.sql b/dist/lib/sql/types/list.sql deleted file mode 100644 index ee28c8c8..00000000 --- a/dist/lib/sql/types/list.sql +++ /dev/null @@ -1,23 +0,0 @@ -SELECT -(n.nspname || '.'|| t.typname) as type_id, -t.typname AS name, -n.nspname as schema, -pg_catalog.Format_type ( t.oid, NULL ) AS format, -pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description, -array_to_json(array ( - select e.enumlabel - FROM pg_catalog.pg_enum e - WHERE e.enumtypid = t.oid - ORDER BY e.oid -)) AS enums -FROM pg_catalog.pg_type t LEFT JOIN pg_catalog.pg_namespace n -ON n.oid = t.typnamespace -WHERE ( - t.typrelid = 0 - OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid ) -) -and NOT EXISTS ( - SELECT 1 - FROM pg_catalog.pg_type el - WHERE el.oid = t.typelem AND el.typarray = t.oid -); \ No newline at end of file diff --git a/dist/lib/sql/views/list.sql b/dist/lib/sql/views/list.sql deleted file mode 100644 index c9e6db47..00000000 --- a/dist/lib/sql/views/list.sql +++ /dev/null @@ -1,12 +0,0 @@ -select - table_schema, - table_name, - check_option, - is_updatable, - is_insertable_into, - is_trigger_updatable, - is_trigger_deletable, - is_trigger_insertable_into - -from information_schema.views -where table_schema = ? and table_schema not in ('information_schema', 'pg_catalog') diff --git a/dist/server.js b/dist/server.js deleted file mode 100644 index 18837eb4..00000000 --- a/dist/server.js +++ /dev/null @@ -1,29 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var express = require("express"); -var api = require('./api'); -var project = require('../package.json'); -var app = express(); -app.use(express.json()); -app.use(api); -app.get('/', function (_req, res) { - return res.status(200).json({ - status: 200, - name: project.name, - version: project.version, - documentation: 'https://supabase.github.io/pg-api/', - }); -}); -app.get('/health', function (_req, res) { return res.status(200).json({ date: new Date() }); }); -var Server = { - start: function (port) { - this.server = app.listen(port, function () { - console.log("App started on port " + port); - }); - return app; - }, - stop: function () { - this.server.close(); - }, -}; -exports.default = Server; diff --git a/dist/start.js b/dist/start.js deleted file mode 100644 index 2584e787..00000000 --- a/dist/start.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var server_1 = require("./server"); -var constants_1 = require("./lib/constants"); -server_1.default.start(constants_1.PG_API_PORT); diff --git a/src/api/columns.ts b/src/api/columns.ts index 9468f715..68150a2a 100644 --- a/src/api/columns.ts +++ b/src/api/columns.ts @@ -7,7 +7,7 @@ const { columns } = sql const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, columns.list) + const { data } = await RunQuery(req.headers.pg, columns) return res.status(200).json(data) } catch (error) { console.log('throwing error') diff --git a/src/api/config.ts b/src/api/config.ts index aec5acdd..5ebdbbae 100644 --- a/src/api/config.ts +++ b/src/api/config.ts @@ -2,12 +2,12 @@ import { Router } from 'express' import { RunQuery } from '../lib/connectionPool' import sql = require('../lib/sql') -const { config } = sql +const { config, version } = sql const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, config.list) + const { data } = await RunQuery(req.headers.pg, config) return res.status(200).json(data) } catch (error) { console.log('throwing error') @@ -16,7 +16,7 @@ router.get('/', async (req, res) => { }) router.get('/version', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, config.version) + const { data } = await RunQuery(req.headers.pg, version) return res.status(200).json(data[0]) // only one row } catch (error) { console.log('throwing error') diff --git a/src/api/extensions.ts b/src/api/extensions.ts index d7ef5d4f..a6113562 100644 --- a/src/api/extensions.ts +++ b/src/api/extensions.ts @@ -7,7 +7,7 @@ const { extensions } = sql const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, extensions.list) + const { data } = await RunQuery(req.headers.pg, extensions) return res.status(200).json(data) } catch (error) { console.log('throwing error') diff --git a/src/api/roles.ts b/src/api/roles.ts index 32a3877b..f75acda0 100644 --- a/src/api/roles.ts +++ b/src/api/roles.ts @@ -1,7 +1,8 @@ import { Router } from 'express' import sql = require('../lib/sql') -const { roles } = sql +const { grants, roles } = sql +import { coalesceRowsToArray } from '../lib/helpers' import { RunQuery } from '../lib/connectionPool' import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants/schemas' import { Roles } from '../lib/interfaces/roles' @@ -16,7 +17,15 @@ interface GetRolesQueryParams { const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, roles.list) + const sql = ` +WITH roles AS ( ${roles} ), +grants AS ( ${grants} ) +SELECT + *, + ${coalesceRowsToArray('grants', 'SELECT * FROM grants WHERE grants.grantee = roles.name')} +FROM + roles` + const { data } = await RunQuery(req.headers.pg, sql) const query: GetRolesQueryParams = req.query let payload: Roles.Role[] = data if (!query?.includeSystemSchemas) payload = removeSystemSchemas(data) diff --git a/src/api/schemas.ts b/src/api/schemas.ts index 8114978f..fbfa7684 100644 --- a/src/api/schemas.ts +++ b/src/api/schemas.ts @@ -16,7 +16,7 @@ interface GetSchemasQueryParams { const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, schemas.list) + const { data } = await RunQuery(req.headers.pg, schemas) const query: GetSchemasQueryParams = req.query let payload: Schemas.Schema[] = data if (!query?.includeSystemSchemas) payload = removeSystemSchemas(data) diff --git a/src/api/tables.ts b/src/api/tables.ts index ec05d7d0..9fb6b81a 100644 --- a/src/api/tables.ts +++ b/src/api/tables.ts @@ -1,7 +1,8 @@ import { Router } from 'express' import sql = require('../lib/sql') -const { tables } = sql +const { columns, grants, primary_keys, relationships, tables } = sql +import { coalesceRowsToArray } from '../lib/helpers' import { RunQuery } from '../lib/connectionPool' import { DEFAULT_SYSTEM_SCHEMAS } from '../lib/constants/schemas' import { Tables } from '../lib/interfaces/tables' @@ -9,7 +10,36 @@ import { Tables } from '../lib/interfaces/tables' const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, tables.list) + const sql = ` +WITH tables AS ( ${tables} ), +columns AS ( ${columns} ), +grants AS ( ${grants} ), +primary_keys AS ( ${primary_keys} ), +relationships AS ( ${relationships} ) +SELECT + *, + ${coalesceRowsToArray( + 'columns', + 'SELECT * FROM columns WHERE columns.table_id = tables.table_id' + )}, + ${coalesceRowsToArray('grants', 'SELECT * FROM grants WHERE grants.table_id = tables.table_id')}, + ${coalesceRowsToArray( + 'primary_keys', + 'SELECT * FROM primary_keys WHERE primary_keys.table_id = tables.table_id' + )}, + ${coalesceRowsToArray( + 'relationships', + `SELECT + * + FROM + relationships + WHERE + relationships.source_table_id = tables.table_id + OR relationships.target_table_id = tables.table_id` + )} +FROM + tables` + const { data } = await RunQuery(req.headers.pg, sql) const query: Fetch.QueryParams = req.query let payload: Tables.Table[] = data if (!query?.includeSystemSchemas) payload = removeSystemSchemas(data) diff --git a/src/api/types.ts b/src/api/types.ts index c7261f0b..6a24d442 100644 --- a/src/api/types.ts +++ b/src/api/types.ts @@ -9,7 +9,7 @@ import { Types } from '../lib/interfaces/types' const router = Router() router.get('/', async (req, res) => { try { - const { data } = await RunQuery(req.headers.pg, types.list) + const { data } = await RunQuery(req.headers.pg, types) const query: Fetch.QueryParams = req.query let payload: Types.Type[] = data if (!query?.includeSystemSchemas) payload = removeSystemSchemas(data) diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts new file mode 100644 index 00000000..5470d3da --- /dev/null +++ b/src/lib/helpers.ts @@ -0,0 +1,12 @@ +export const coalesceRowsToArray = (source: string, joinQuery: string) => { + return ` +COALESCE( + ( + SELECT + array_to_json(array_agg(row_to_json(${source}))) + FROM + ( ${joinQuery} ) ${source} + ), + '[]' +) AS ${source}` +} diff --git a/src/lib/sql/columns.sql b/src/lib/sql/columns.sql new file mode 100644 index 00000000..4c342d77 --- /dev/null +++ b/src/lib/sql/columns.sql @@ -0,0 +1,30 @@ +SELECT + table_schema AS schema, + table_name AS table, + column_name AS name, + column_default AS default_value, + is_identity :: boolean, + is_nullable :: boolean, + is_updatable :: boolean, + data_type, + udt_name AS format, + identity_generation, + (table_schema || '.' || table_name) AS table_id, + col_description( + (table_schema || '."' || table_name || '"') :: regclass, + ordinal_position + ) AS description, + array_to_json( + array( + SELECT + enumlabel + FROM + pg_catalog.pg_enum enums + WHERE + udt_name = pg_catalog.Format_type(enums.enumtypid :: regclass, NULL) + ORDER BY + enums.enumsortorder + ) + ) AS enums +FROM + information_schema.columns diff --git a/src/lib/sql/columns/list.sql b/src/lib/sql/columns/list.sql deleted file mode 100644 index 99acda5e..00000000 --- a/src/lib/sql/columns/list.sql +++ /dev/null @@ -1,11 +0,0 @@ -select - table_schema, - table_name, - column_name, - column_default, - is_nullable::boolean, - data_type, - udt_name as format, - col_description((table_schema || '."' || table_name || '"')::regclass, ordinal_position) -from information_schema.columns -order by table_schema, table_name, ordinal_position diff --git a/src/lib/sql/config.sql b/src/lib/sql/config.sql new file mode 100644 index 00000000..553e4426 --- /dev/null +++ b/src/lib/sql/config.sql @@ -0,0 +1,25 @@ +SELECT + name, + setting, + category, + TRIM(split_part(category, '/', 1)) AS group, + TRIM(split_part(category, '/', 2)) AS subgroup, + unit, + short_desc, + extra_desc, + context, + vartype, + source, + min_val, + max_val, + enumvals, + boot_val, + reset_val, + sourcefile, + sourceline, + pending_restart +FROM + pg_settings +ORDER BY + category, + name diff --git a/src/lib/sql/config/list.sql b/src/lib/sql/config/list.sql deleted file mode 100644 index 06da8369..00000000 --- a/src/lib/sql/config/list.sql +++ /dev/null @@ -1,25 +0,0 @@ -select - "name", - setting, - category, - TRIM(split_part(category, '/', 1)) as "group", - TRIM(split_part(category, '/', 2)) as "subgroup", - unit, - short_desc, - extra_desc, - context, - vartype, - "source", - min_val, - max_val, - enumvals, - boot_val, - reset_val, - sourcefile, - sourceline, - pending_restart -FROM - pg_settings -ORDER BY - category, - name \ No newline at end of file diff --git a/src/lib/sql/config/version.sql b/src/lib/sql/config/version.sql deleted file mode 100644 index c221d21a..00000000 --- a/src/lib/sql/config/version.sql +++ /dev/null @@ -1,5 +0,0 @@ -select * from -(SELECT version()) "version", -(SELECT current_setting('server_version_num') as version_number) version_number, -(SELECT count(pid) as active_connections FROM pg_stat_activity WHERE state = 'active') active_connections, -(SELECT setting as max_connections from pg_settings where name = 'max_connections') max_connections; \ No newline at end of file diff --git a/src/lib/sql/constraints.sql b/src/lib/sql/constraints.sql new file mode 100644 index 00000000..8c68287c --- /dev/null +++ b/src/lib/sql/constraints.sql @@ -0,0 +1,30 @@ +SELECT + COALESCE(table_schema, referenced_schema) AS table_schema, + COALESCE(table_name, referenced_table) AS table_name, + COALESCE(column_name, referenced_column) AS column_name, + constraint_schema, + constraint_name, + constraint_type, + check_clause, + referenced_schema, + referenced_table, + referenced_column +FROM + information_schema.table_constraints NATURAL FULL + JOIN information_schema.key_column_usage NATURAL FULL + JOIN information_schema.check_constraints + INNER JOIN ( + SELECT + table_schema AS referenced_schema, + table_name AS referenced_table, + column_name AS referenced_column, + constraint_name + FROM + information_schema.constraint_column_usage + ) AS referenced_columns USING (constraint_name) +WHERE + constraint_schema = ? +ORDER BY + table_schema, + table_name, + ordinal_position diff --git a/src/lib/sql/constraints/list.sql b/src/lib/sql/constraints/list.sql deleted file mode 100644 index ac1c3ce5..00000000 --- a/src/lib/sql/constraints/list.sql +++ /dev/null @@ -1,26 +0,0 @@ -select - coalesce(table_schema, referenced_schema) as table_schema, - coalesce(table_name, referenced_table) as table_name, - coalesce(column_name, referenced_column) as column_name, - constraint_schema, - constraint_name, - constraint_type, - check_clause, - referenced_schema, - referenced_table, - referenced_column - -from information_schema.table_constraints -natural full join information_schema.key_column_usage -natural full join information_schema.check_constraints -inner join ( - select - table_schema as referenced_schema, - table_name as referenced_table, - column_name as referenced_column, - constraint_name - from information_schema.constraint_column_usage -) as referenced_columns using (constraint_name) - -where constraint_schema = ? -order by table_schema, table_name, ordinal_position diff --git a/dist/lib/sql/extensions/list.sql b/src/lib/sql/extensions.sql similarity index 50% rename from dist/lib/sql/extensions/list.sql rename to src/lib/sql/extensions.sql index cfeb72c2..ba6b3e24 100644 --- a/dist/lib/sql/extensions/list.sql +++ b/src/lib/sql/extensions.sql @@ -1,5 +1,8 @@ SELECT - name, comment, default_version, installed_version + name, + comment, + default_version, + installed_version FROM pg_available_extensions ORDER BY diff --git a/src/lib/sql/extensions/enabled.sql b/src/lib/sql/extensions/enabled.sql deleted file mode 100644 index 8d9c7a05..00000000 --- a/src/lib/sql/extensions/enabled.sql +++ /dev/null @@ -1,3 +0,0 @@ -SELECT e.extname AS "name", e.extversion AS "version", n.nspname AS "schema", c.description AS "description" -FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass -ORDER BY 1; \ No newline at end of file diff --git a/src/lib/sql/extensions/list.sql b/src/lib/sql/extensions/list.sql deleted file mode 100644 index cfeb72c2..00000000 --- a/src/lib/sql/extensions/list.sql +++ /dev/null @@ -1,6 +0,0 @@ -SELECT - name, comment, default_version, installed_version -FROM - pg_available_extensions -ORDER BY - name ASC diff --git a/src/lib/sql/extensions_enabled.sql b/src/lib/sql/extensions_enabled.sql new file mode 100644 index 00000000..b3238696 --- /dev/null +++ b/src/lib/sql/extensions_enabled.sql @@ -0,0 +1,12 @@ +SELECT + e.extname AS name, + e.extversion AS version, + n.nspname AS schema, + c.description AS description +FROM + pg_catalog.pg_extension e + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace + LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid + AND c.classoid = 'pg_catalog.pg_extension' :: pg_catalog.regclass +ORDER BY + 1 diff --git a/src/lib/sql/grants.sql b/src/lib/sql/grants.sql new file mode 100644 index 00000000..66b8711b --- /dev/null +++ b/src/lib/sql/grants.sql @@ -0,0 +1,12 @@ +SELECT + (table_schema || '.' || table_name) AS table_id, + grantor, + grantee, + table_catalog AS catalog, + table_schema AS schema, + table_name, + privilege_type, + is_grantable :: boolean, + with_hierarchy :: boolean +FROM + information_schema.role_table_grants diff --git a/src/lib/sql/index.ts b/src/lib/sql/index.ts index 0e98b167..e847da63 100644 --- a/src/lib/sql/index.ts +++ b/src/lib/sql/index.ts @@ -2,44 +2,21 @@ import * as fs from 'fs' import * as path from 'path' export = { - columns: { - list: fs.readFileSync(path.join(__dirname, '/columns/list.sql')).toString(), - }, - config: { - list: fs.readFileSync(path.join(__dirname, '/config/list.sql')).toString(), - version: fs.readFileSync(path.join(__dirname, '/config/version.sql')).toString(), - }, - constraints: { - list: fs.readFileSync(path.join(__dirname, '/constraints/list.sql')).toString(), - }, - joins: { - list: fs.readFileSync(path.join(__dirname, '/joins/list.sql')).toString(), - }, - extensions: { - list: fs.readFileSync(path.join(__dirname, '/extensions/list.sql')).toString(), - }, - policies: { - list: fs.readFileSync(path.join(__dirname, '/policies/list.sql')).toString(), - }, - stats: { - tableSize: fs.readFileSync(path.join(__dirname, '/stats/table_size.sql')).toString(), - }, - sequences: { - list: fs.readFileSync(path.join(__dirname, '/sequences/list.sql')).toString(), - }, - schemas: { - list: fs.readFileSync(path.join(__dirname, '/schemas/list.sql')).toString(), - }, - types: { - list: fs.readFileSync(path.join(__dirname, '/types/list.sql')).toString(), - }, - tables: { - list: fs.readFileSync(path.join(__dirname, '/tables/list.sql')).toString(), - }, - roles: { - list: fs.readFileSync(path.join(__dirname, '/roles/list.sql')).toString(), - }, - views: { - list: fs.readFileSync(path.join(__dirname, '/views/list.sql')).toString(), - }, + columns: fs.readFileSync(path.join(__dirname, '/columns.sql')).toString(), + config: fs.readFileSync(path.join(__dirname, '/config.sql')).toString(), + constraints: fs.readFileSync(path.join(__dirname, '/constraints.sql')).toString(), + extensions: fs.readFileSync(path.join(__dirname, '/extensions.sql')).toString(), + grants: fs.readFileSync(path.join(__dirname, '/grants.sql')).toString(), + joins: fs.readFileSync(path.join(__dirname, '/joins.sql')).toString(), + primary_keys: fs.readFileSync(path.join(__dirname, '/primary_keys.sql')).toString(), + policies: fs.readFileSync(path.join(__dirname, '/policies.sql')).toString(), + relationships: fs.readFileSync(path.join(__dirname, '/relationships.sql')).toString(), + roles: fs.readFileSync(path.join(__dirname, '/roles.sql')).toString(), + schemas: fs.readFileSync(path.join(__dirname, '/schemas.sql')).toString(), + sequences: fs.readFileSync(path.join(__dirname, '/sequences.sql')).toString(), + tableSize: fs.readFileSync(path.join(__dirname, '/table_size.sql')).toString(), + tables: fs.readFileSync(path.join(__dirname, '/tables.sql')).toString(), + types: fs.readFileSync(path.join(__dirname, '/types.sql')).toString(), + version: fs.readFileSync(path.join(__dirname, '/version.sql')).toString(), + views: fs.readFileSync(path.join(__dirname, '/views.sql')).toString(), } diff --git a/src/lib/sql/joins.sql b/src/lib/sql/joins.sql new file mode 100644 index 00000000..c3d00177 --- /dev/null +++ b/src/lib/sql/joins.sql @@ -0,0 +1,15 @@ +SELECT + tc.table_schema, + tc.constraint_name, + tc.table_name, + kcu.column_name, + ccu.table_schema AS foreign_table_schema, + ccu.table_name AS foreign_table_name, + ccu.column_name AS foreign_column_name +FROM + information_schema.table_constraints AS tc + JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) + JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) +WHERE + tc.table_schema = ? + AND tc.constraint_type = 'FOREIGN KEY' diff --git a/src/lib/sql/joins/list.sql b/src/lib/sql/joins/list.sql deleted file mode 100644 index 4dadd50c..00000000 --- a/src/lib/sql/joins/list.sql +++ /dev/null @@ -1,12 +0,0 @@ -SELECT - tc.table_schema, - tc.constraint_name, - tc.table_name, - kcu.column_name, - ccu.table_schema AS foreign_table_schema, - ccu.table_name AS foreign_table_name, - ccu.column_name AS foreign_column_name -FROM information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) - JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) -where tc.table_schema = ? and tc.constraint_type = 'FOREIGN KEY'; \ No newline at end of file diff --git a/src/lib/sql/policies.sql b/src/lib/sql/policies.sql new file mode 100644 index 00000000..c216c565 --- /dev/null +++ b/src/lib/sql/policies.sql @@ -0,0 +1,36 @@ +SELECT + n.nspname AS schemaname, + c.relname AS tablename, + pol.polname AS policyname, + CASE + WHEN pol.polpermissive THEN 'PERMISSIVE' :: text + ELSE 'RESTRICTIVE' :: text + END AS permissive, + CASE + WHEN pol.polroles = '{0}' :: oid [] THEN string_to_array('public' :: text, '' :: text) :: name [] + ELSE ARRAY( + SELECT + pg_authid.rolname + FROM + pg_authid + WHERE + pg_authid.oid = ANY (pol.polroles) + ORDER BY + pg_authid.rolname + ) + END AS roles, + CASE + pol.polcmd + WHEN 'r' :: "char" THEN 'SELECT' :: text + WHEN 'a' :: "char" THEN 'INSERT' :: text + WHEN 'w' :: "char" THEN 'UPDATE' :: text + WHEN 'd' :: "char" THEN 'DELETE' :: text + WHEN '*' :: "char" THEN 'ALL' :: text + ELSE NULL :: text + END AS cmd, + pg_get_expr(pol.polqual, pol.polrelid) AS qual, + pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check +FROM + pg_policy pol + JOIN pg_class c ON c.oid = pol.polrelid + LEFT JOIN pg_namespace n ON n.oid = c.relnamespace diff --git a/src/lib/sql/policies/list.sql b/src/lib/sql/policies/list.sql deleted file mode 100644 index 4f5c89f7..00000000 --- a/src/lib/sql/policies/list.sql +++ /dev/null @@ -1,27 +0,0 @@ -SELECT n.nspname AS schemaname, - c.relname AS tablename, - pol.polname AS policyname, - CASE - WHEN pol.polpermissive THEN 'PERMISSIVE'::text - ELSE 'RESTRICTIVE'::text - END AS permissive, - CASE - WHEN pol.polroles = '{0}'::oid[] THEN string_to_array('public'::text, ''::text)::name[] - ELSE ARRAY( SELECT pg_authid.rolname - FROM pg_authid - WHERE pg_authid.oid = ANY (pol.polroles) - ORDER BY pg_authid.rolname) - END AS roles, - CASE pol.polcmd - WHEN 'r'::"char" THEN 'SELECT'::text - WHEN 'a'::"char" THEN 'INSERT'::text - WHEN 'w'::"char" THEN 'UPDATE'::text - WHEN 'd'::"char" THEN 'DELETE'::text - WHEN '*'::"char" THEN 'ALL'::text - ELSE NULL::text - END AS cmd, - pg_get_expr(pol.polqual, pol.polrelid) AS qual, - pg_get_expr(pol.polwithcheck, pol.polrelid) AS with_check - FROM pg_policy pol - JOIN pg_class c ON c.oid = pol.polrelid - LEFT JOIN pg_namespace n ON n.oid = c.relnamespace; \ No newline at end of file diff --git a/src/lib/sql/primary_keys.sql b/src/lib/sql/primary_keys.sql new file mode 100644 index 00000000..f4bd7d9a --- /dev/null +++ b/src/lib/sql/primary_keys.sql @@ -0,0 +1,17 @@ +SELECT + pg_namespace.nspname AS schema, + pg_class.oid :: regclass AS table_name, + pg_attribute.attname AS name, + ( + pg_namespace.nspname || '.' || (pg_class.oid :: regclass) + ) AS table_id +FROM + pg_index, + pg_class, + pg_attribute, + pg_namespace +WHERE + indrelid = pg_class.oid + AND pg_class.relnamespace = pg_namespace.oid + AND pg_attribute.attrelid = pg_class.oid + AND pg_attribute.attnum = ANY (pg_index.indkey) diff --git a/src/lib/sql/relationships.sql b/src/lib/sql/relationships.sql new file mode 100644 index 00000000..c18caf06 --- /dev/null +++ b/src/lib/sql/relationships.sql @@ -0,0 +1,16 @@ +SELECT + (tc.table_schema || '.' || (tc.table_name)) AS source_table_id, + tc.table_schema AS source_schema, + tc.table_name AS source_table_name, + kcu.column_name AS source_column_name, + (ccu.table_schema || '.' || (ccu.table_name)) AS target_table_id, + ccu.table_schema AS target_table_schema, + ccu.table_name AS target_table_name, + ccu.column_name AS target_column_name, + tc.constraint_name +FROM + information_schema.table_constraints AS tc + JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) + JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) +WHERE + tc.constraint_type = 'FOREIGN KEY' diff --git a/src/lib/sql/replication/temp.sql b/src/lib/sql/replication/temp.sql deleted file mode 100644 index e7ec6fe1..00000000 --- a/src/lib/sql/replication/temp.sql +++ /dev/null @@ -1,3 +0,0 @@ -select * from pg_stat_replication ; -select * from pg_stat_wal_receiver; -select * from pg_publication; \ No newline at end of file diff --git a/src/lib/sql/replication_temp.sql b/src/lib/sql/replication_temp.sql new file mode 100644 index 00000000..3d2c6743 --- /dev/null +++ b/src/lib/sql/replication_temp.sql @@ -0,0 +1,12 @@ +SELECT + * +FROM + pg_stat_replication; +SELECT + * +FROM + pg_stat_wal_receiver; +SELECT + * +FROM + pg_publication; diff --git a/src/lib/sql/roles.sql b/src/lib/sql/roles.sql new file mode 100644 index 00000000..943c3854 --- /dev/null +++ b/src/lib/sql/roles.sql @@ -0,0 +1,34 @@ +SELECT + usename AS name, + usesysid AS id, + usecreatedb AS has_create_db_privileges, + usesuper AS is_super_user, + userepl AS has_replication_privileges, + usebypassrls AS can_bypass_rls, + valuntil AS valid_until, + -- Password expiry time (only used for password authentication) + useconfig AS user_config, + -- Session defaults for run-time configuration variables + active_connections.connections, + pg_roles.rolconnlimit AS max_user_connections, + max_db_connections.max_connections :: int2 AS max_db_connections +FROM + pg_user AS users + INNER JOIN pg_roles ON users.usename = pg_roles.rolname + INNER JOIN LATERAL ( + SELECT + count(*) AS connections + FROM + pg_stat_activity AS active_connections + WHERE + state = 'active' + AND users.usename = active_connections.usename + ) AS active_connections ON 1 = 1 + INNER JOIN LATERAL ( + SELECT + setting AS max_connections + FROM + pg_settings + WHERE + name = 'max_connections' + ) AS max_db_connections ON 1 = 1 diff --git a/src/lib/sql/roles/list.sql b/src/lib/sql/roles/list.sql deleted file mode 100644 index 6612cda9..00000000 --- a/src/lib/sql/roles/list.sql +++ /dev/null @@ -1,61 +0,0 @@ -with -roles as ( - select - usename as "name", - usesysid as "id", - usecreatedb as "has_create_db_privileges", - usesuper as "is_super_user", - userepl as "has_replication_privileges", - usebypassrls as "can_bypass_rls", - valuntil as "valid_until", -- Password expiry time (only used for password authentication) - useconfig as "user_config", -- Session defaults for run-time configuration variables - active_connections.connections, - pg_roles.rolconnlimit as max_user_connections, - max_db_connections.max_connections::int2 as max_db_connections - from - pg_user as users - inner join pg_roles on users.usename = pg_roles.rolname - INNER JOIN LATERAL - ( - SELECT count(*) as connections - FROM pg_stat_activity as active_connections - WHERE state = 'active' and users.usename = active_connections.usename - ) as active_connections on 1=1 - INNER JOIN LATERAL ( - SELECT setting as max_connections from pg_settings where name = 'max_connections' - ) as max_db_connections on 1=1 -), -grants as ( - SELECT - (table_schema || '.' || table_name) as table_id, - grantor, - grantee, - table_catalog as catalog, - table_schema as schema, - table_name, - privilege_type, - is_grantable::boolean, - with_hierarchy::boolean - FROM - information_schema.role_table_grants -) -SELECT - *, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(grants))) - FROM - ( - SELECT - * - FROM - grants - WHERE - grants.grantee = roles.name - ) grants - ), - '[]' - ) AS grants -FROM - roles \ No newline at end of file diff --git a/src/lib/sql/schemas.sql b/src/lib/sql/schemas.sql new file mode 100644 index 00000000..c6994663 --- /dev/null +++ b/src/lib/sql/schemas.sql @@ -0,0 +1,10 @@ +SELECT + catalog_name, + schema_name AS name, + schema_owner AS owner, + default_character_set_catalog, + default_character_set_schema, + default_character_set_name, + sql_path +FROM + information_schema.schemata diff --git a/src/lib/sql/schemas/list.sql b/src/lib/sql/schemas/list.sql deleted file mode 100644 index f8491f9a..00000000 --- a/src/lib/sql/schemas/list.sql +++ /dev/null @@ -1,10 +0,0 @@ -SELECT - catalog_name, - schema_name as name, - schema_owner as owner, - default_character_set_catalog, - default_character_set_schema, - default_character_set_name, - sql_path -FROM - information_schema.schemata \ No newline at end of file diff --git a/src/lib/sql/sequences.sql b/src/lib/sql/sequences.sql new file mode 100644 index 00000000..30ba3592 --- /dev/null +++ b/src/lib/sql/sequences.sql @@ -0,0 +1,23 @@ +SELECT + table_schema, + table_name, + column_name, + sequence_name, + start_value, + minimum_value, + increment +FROM + information_schema.columns + INNER JOIN information_schema.sequences ON ( + table_schema = sequence_schema + AND pg_get_serial_sequence( + table_schema || '."' || table_name || '"', + column_name + ) = sequence_schema || '.' || sequence_name + ) +WHERE + sequence_schema = ? +ORDER BY + table_schema, + table_name, + ordinal_position diff --git a/src/lib/sql/sequences/list.sql b/src/lib/sql/sequences/list.sql deleted file mode 100644 index 91949a29..00000000 --- a/src/lib/sql/sequences/list.sql +++ /dev/null @@ -1,16 +0,0 @@ -select - table_schema, - table_name, - column_name, - sequence_name, - start_value, - minimum_value, - increment - -from information_schema.columns -inner join information_schema.sequences on ( - table_schema = sequence_schema and - pg_get_serial_sequence(table_schema || '."' || table_name || '"', column_name) = sequence_schema || '.' || sequence_name -) -where sequence_schema = ? -order by table_schema, table_name, ordinal_position diff --git a/src/lib/sql/stats/table_size.sql b/src/lib/sql/stats/table_size.sql deleted file mode 100644 index 744ecc36..00000000 --- a/src/lib/sql/stats/table_size.sql +++ /dev/null @@ -1,11 +0,0 @@ --- error - returns the keys/indexes too - -SELECT - nspname AS "schema", - relname AS "table", - nspname || '.' || relname AS "relation", - pg_relation_size(C.oid) AS "size" -FROM pg_class C -LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) -WHERE nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema') -ORDER BY pg_relation_size(C.oid) DESC \ No newline at end of file diff --git a/src/lib/sql/table_size.sql b/src/lib/sql/table_size.sql new file mode 100644 index 00000000..9520a634 --- /dev/null +++ b/src/lib/sql/table_size.sql @@ -0,0 +1,13 @@ +-- error - returns the keys/indexes too +SELECT + nspname AS schema, + relname AS table, + nspname || '.' || relname AS relation, + pg_relation_size(C.oid) AS size +FROM + pg_class C + LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) +WHERE + nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema') +ORDER BY + pg_relation_size(C.oid) DESC diff --git a/src/lib/sql/tables.sql b/src/lib/sql/tables.sql new file mode 100644 index 00000000..6494df56 --- /dev/null +++ b/src/lib/sql/tables.sql @@ -0,0 +1,36 @@ +SELECT + (table_schema || '.' || table_name) AS table_id, + table_catalog AS catalog, + table_schema AS schema, + table_name AS name, + is_insertable_into, + is_typed, + pg_total_relation_size(table_schema || '.' || table_name) :: bigint AS bytes, + pg_size_pretty( + pg_total_relation_size(table_schema || '.' || table_name) + ) AS size, + seq_scan :: bigint AS seq_scan_count, + seq_tup_read :: bigint AS seq_row_read_count, + idx_scan :: bigint AS idx_scan_count, + idx_tup_fetch :: bigint AS idx_row_read_count, + n_tup_ins :: bigint AS row_ins_count, + n_tup_upd :: bigint AS row_upd_count, + n_tup_del :: bigint AS row_del_count, + n_tup_hot_upd :: bigint AS row_hot_upd_count, + n_live_tup :: bigint AS live_row_count, + n_dead_tup :: bigint AS dead_row_count, + n_mod_since_analyze :: bigint AS rows_mod_since_analyze, + last_vacuum, + last_autovacuum, + last_analyze, + last_autoanalyze, + vacuum_count :: bigint, + autovacuum_count :: bigint, + analyze_count :: bigint, + autoanalyze_count :: bigint +FROM + information_schema.tables + LEFT JOIN pg_stat_user_tables ON pg_stat_user_tables.schemaname = tables.table_schema + AND pg_stat_user_tables.relname = tables.table_name +WHERE + table_type = 'BASE TABLE' diff --git a/src/lib/sql/tables/list.sql b/src/lib/sql/tables/list.sql deleted file mode 100644 index 490601f9..00000000 --- a/src/lib/sql/tables/list.sql +++ /dev/null @@ -1,182 +0,0 @@ -WITH -tables as ( - select - (table_schema || '.' || table_name) as table_id, - table_catalog as catalog, - table_schema as schema, - table_name as name, - is_insertable_into, - is_typed, - pg_total_relation_size(table_schema || '.' || table_name)::bigint as bytes, - pg_size_pretty(pg_total_relation_size(table_schema || '.' || table_name)) as size, - seq_scan::bigint, - seq_tup_read::bigint, - idx_scan::bigint, - idx_tup_fetch::bigint, - n_tup_ins::bigint, - n_tup_upd::bigint, - n_tup_del::bigint, - n_tup_hot_upd::bigint, - n_live_tup::bigint, - n_dead_tup::bigint, - n_mod_since_analyze::bigint, - last_vacuum, - last_autovacuum, - last_analyze, - last_autoanalyze, - vacuum_count::bigint, - autovacuum_count::bigint, - analyze_count::bigint, - autoanalyze_count::bigint - from - information_schema.tables left join - pg_stat_user_tables on pg_stat_user_tables.schemaname = tables.table_schema and pg_stat_user_tables.relname = tables.table_name - where - table_type = 'BASE TABLE' -), -columns AS ( - select - table_schema as schema, - column_name as name, - column_default as default_value, - is_nullable::boolean, - is_nullable::boolean, - data_type, - is_identity::boolean, - identity_generation, - is_updatable::boolean, - udt_name as format, - table_name, - col_description( - (table_schema || '."' || table_name || '"') :: regclass, - ordinal_position - ) as description, - (table_schema || '.' || table_name) as table_id, - array_to_json(array( - select enumlabel - FROM pg_catalog.pg_enum enums - WHERE udt_name = pg_catalog.Format_type(enums.enumtypid::regclass, NULL) - ORDER BY enums.enumsortorder - )) AS enums - from - information_schema.columns -), -grants as ( - SELECT - (table_schema || '.' || table_name) as table_id, - grantor, - grantee, - table_catalog as catalog, - table_schema as schema, - table_name, - privilege_type, - is_grantable::boolean, - with_hierarchy::boolean - FROM - information_schema.role_table_grants -), -pk_list as ( - SELECT - pg_namespace.nspname as schema, - pg_class.oid :: regclass as table_name, - pg_attribute.attname as name, - ( - pg_namespace.nspname || '.' || (pg_class.oid :: regclass) - ) as table_id -FROM - pg_index, - pg_class, - pg_attribute, - pg_namespace -WHERE - indrelid = pg_class.oid - AND pg_class.relnamespace = pg_namespace.oid - AND pg_attribute.attrelid = pg_class.oid - AND pg_attribute.attnum = any(pg_index.indkey) -), -relationships as ( - select - (tc.table_schema || '.' || (tc.table_name)) as source_table_id, - tc.table_schema as source_schema, - tc.table_name as source_table_name, - kcu.column_name as source_column_name, - (ccu.table_schema || '.' || (ccu.table_name)) as target_table_id, - ccu.table_schema AS target_table_schema, - ccu.table_name AS target_table_name, - ccu.column_name AS target_column_name, - tc.constraint_name - FROM - information_schema.table_constraints AS tc - JOIN information_schema.key_column_usage AS kcu USING (constraint_schema, constraint_name) - JOIN information_schema.constraint_column_usage AS ccu USING (constraint_schema, constraint_name) - where - tc.constraint_type = 'FOREIGN KEY' -) -SELECT - *, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(columns))) - FROM - ( - SELECT - * - FROM - columns - WHERE - columns.table_id = tables.table_id - ) columns - ), - '[]' - ) AS columns, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(grants))) - FROM - ( - SELECT - * - FROM - grants - WHERE - grants.table_id = tables.table_id - ) grants - ), - '[]' - ) AS grants, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(primary_keys))) - FROM - ( - SELECT - * - FROM - pk_list - WHERE - pk_list.table_id = tables.table_id - ) primary_keys - ), - '[]' - ) AS primary_keys, - COALESCE( - ( - SELECT - array_to_json(array_agg(row_to_json(relationships))) - FROM - ( - SELECT - * - FROM - relationships - WHERE - relationships.source_table_id = tables.table_id - OR relationships.target_table_id = tables.table_id - ) relationships - ), - '[]' - ) AS relationships -FROM tables \ No newline at end of file diff --git a/src/lib/sql/types.sql b/src/lib/sql/types.sql new file mode 100644 index 00000000..8255cc2d --- /dev/null +++ b/src/lib/sql/types.sql @@ -0,0 +1,42 @@ +SELECT + (n.nspname || '.' || t.typname) AS type_id, + t.typname AS name, + n.nspname AS schema, + pg_catalog.Format_type (t.oid, NULL) AS format, + pg_catalog.obj_description (t.oid, 'pg_type') AS description, + array_to_json( + array( + SELECT + e.enumlabel + FROM + pg_catalog.pg_enum e + WHERE + e.enumtypid = t.oid + ORDER BY + e.oid + ) + ) AS enums +FROM + pg_catalog.pg_type t + LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace +WHERE + ( + t.typrelid = 0 + OR ( + SELECT + c.relkind = 'c' + FROM + pg_catalog.pg_class c + WHERE + c.oid = t.typrelid + ) + ) + AND NOT EXISTS ( + SELECT + 1 + FROM + pg_catalog.pg_type el + WHERE + el.oid = t.typelem + AND el.typarray = t.oid + ) diff --git a/src/lib/sql/types/list.sql b/src/lib/sql/types/list.sql deleted file mode 100644 index ee28c8c8..00000000 --- a/src/lib/sql/types/list.sql +++ /dev/null @@ -1,23 +0,0 @@ -SELECT -(n.nspname || '.'|| t.typname) as type_id, -t.typname AS name, -n.nspname as schema, -pg_catalog.Format_type ( t.oid, NULL ) AS format, -pg_catalog.obj_description ( t.oid, 'pg_type' ) AS description, -array_to_json(array ( - select e.enumlabel - FROM pg_catalog.pg_enum e - WHERE e.enumtypid = t.oid - ORDER BY e.oid -)) AS enums -FROM pg_catalog.pg_type t LEFT JOIN pg_catalog.pg_namespace n -ON n.oid = t.typnamespace -WHERE ( - t.typrelid = 0 - OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid ) -) -and NOT EXISTS ( - SELECT 1 - FROM pg_catalog.pg_type el - WHERE el.oid = t.typelem AND el.typarray = t.oid -); \ No newline at end of file diff --git a/src/lib/sql/version.sql b/src/lib/sql/version.sql new file mode 100644 index 00000000..f5c29507 --- /dev/null +++ b/src/lib/sql/version.sql @@ -0,0 +1,27 @@ +SELECT + * +FROM + ( + SELECT + version() + ) version, + ( + SELECT + current_setting('server_version_num') AS version_number + ) version_number, + ( + SELECT + count(pid) AS active_connections + FROM + pg_stat_activity + WHERE + state = 'active' + ) active_connections, + ( + SELECT + setting AS max_connections + FROM + pg_settings + WHERE + name = 'max_connections' + ) max_connections diff --git a/src/lib/sql/views/list.sql b/src/lib/sql/views.sql similarity index 50% rename from src/lib/sql/views/list.sql rename to src/lib/sql/views.sql index c9e6db47..b9fe830c 100644 --- a/src/lib/sql/views/list.sql +++ b/src/lib/sql/views.sql @@ -1,5 +1,5 @@ -select - table_schema, +SELECT + table_schema, table_name, check_option, is_updatable, @@ -7,6 +7,8 @@ select is_trigger_updatable, is_trigger_deletable, is_trigger_insertable_into - -from information_schema.views -where table_schema = ? and table_schema not in ('information_schema', 'pg_catalog') +FROM + information_schema.views +WHERE + table_schema = ? + AND table_schema NOT IN ('information_schema', 'pg_catalog')