Port Backup Global, Backup Server, and Backup object dialog in React. Fixes #6984

This commit is contained in:
Nikhil Mohite
2021-11-22 11:20:44 +05:30
committed by Akshay Joshi
parent a701e8c766
commit 3afeb8ca46
30 changed files with 1157 additions and 2271 deletions

View File

@@ -6,18 +6,20 @@
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import {getUtilityView, removeNodeView} from '../../../../browser/static/js/utility_view';
import { getNodeListByName, getNodeAjaxOptions } from '../../../../browser/static/js/node_ajax';
import BackupSchema, {getSectionSchema, getTypeObjSchema, getSaveOptSchema, getQueryOptionSchema, getDisabledOptionSchema, getMiscellaneousSchema} from './backup.ui';
import BackupGlobalSchema, {getMiscellaneousSchema as getMiscellaneousGlobalSchema} from './backupGlobal.ui';
// Backup dialog
define([
'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'sources/pgadmin',
'pgadmin.alertifyjs', 'backbone', 'pgadmin.backgrid',
'pgadmin.backform', 'pgadmin.browser', 'sources/utils',
'tools/backup/static/js/menu_utils',
'tools/backup/static/js/backup_dialog',
'sources/nodes/supported_database_node',
], function(
gettext, url_for, $, _, alertify, Backbone, Backgrid, Backform, pgBrowser,
commonUtils, menuUtils, globalBackupDialog, supportedNodes
gettext, url_for, $, _, pgAdmin, alertify, Backbone, Backgrid, Backform, pgBrowser,
commonUtils, menuUtils, supportedNodes
) {
// if module is already initialized, refer to that.
@@ -43,524 +45,6 @@ define([
with schema.
*/
//Backup Model (Server Node)
var BackupModel = Backbone.Model.extend({
idAttribute: 'id',
defaults: {
file: undefined,
role: undefined,
dqoute: false,
verbose: true,
type: undefined,
/* global */
},
schema: [{
id: 'file',
label: gettext('Filename'),
type: 'text',
disabled: false,
control: Backform.FileControl,
dialog_type: 'create_file',
supp_types: ['*', 'sql', 'backup'],
}, {
id: 'role',
label: gettext('Role name'),
control: 'node-list-by-name',
node: 'role',
select2: {
allowClear: false,
},
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Miscellaneous'),
contentClass: 'row',
schema: [{
id: 'verbose',
label: gettext('Verbose messages'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous'),
}, {
id: 'dqoute',
label: gettext('Force double quote on identifiers'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous'),
controlLabelClassName: 'control-label pg-el-sm-6 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-6 pg-el-12',
}],
}, {
id: 'globals_note',
label: gettext('Note'),
text: gettext('Only objects global to the entire database will be backed up, in PLAIN format'),
type: 'note',
}, {}],
validate: function() {
// TODO: HOW TO VALIDATE ???
return null;
},
});
//Backup Model (Objects like Database/Schema/Table)
var BackupObjectModel = Backbone.Model.extend({
idAttribute: 'id',
defaults: {
file: undefined,
role: undefined,
format: 'custom',
verbose: true,
blobs: true,
encoding: undefined,
schemas: [],
tables: [],
database: undefined,
},
schema: [{
id: 'file',
label: gettext('Filename'),
type: 'text',
disabled: false,
control: Backform.FileControl.extend({
render: function() {
var attributes = this.model.toJSON();
if (attributes.format == 'directory') {
this.field.attributes.dialog_type = 'select_folder';
}
else {
this.field.attributes.dialog_type = 'create_file';
}
Backform.InputControl.prototype.render.apply(this, arguments);
return this;
},
}),
dialog_type: 'create_file',
supp_types: ['*', 'sql', 'backup'],
deps: ['format'],
}, {
id: 'format',
label: gettext('Format'),
type: 'text',
disabled: false,
control: 'select2',
select2: {
allowClear: false,
width: '100%',
},
options: [{
label: gettext('Custom'),
value: 'custom',
},
{
label: gettext('Tar'),
value: 'tar',
},
{
label: gettext('Plain'),
value: 'plain',
},
{
label: gettext('Directory'),
value: 'directory',
},
],
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server') {
setTimeout(function() { m.set('format', 'plain'); }, 10);
return false;
}
return true;
},
}, {
id: 'ratio',
label: gettext('Compression ratio'),
type: 'int',
min: 0,
max: 9,
deps: ['format'],
disabled: function(m) {
return (m.get('format') === 'tar');
},
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server')
return false;
return true;
},
}, {
id: 'encoding',
label: gettext('Encoding'),
type: 'text',
disabled: false,
node: 'database',
control: 'node-ajax-options',
url: 'get_encodings',
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server') {
var t = pgBrowser.tree,
i = t.selected(),
d = i ? t.itemData(i) : undefined;
return _.isUndefined(d) ? false : d.version >= 110000;
}
return true;
},
}, {
id: 'no_of_jobs',
label: gettext('Number of jobs'),
type: 'int',
deps: ['format'],
disabled: function(m) {
return (m.get('format') !== 'directory');
},
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server')
return false;
return true;
},
}, {
id: 'role',
label: gettext('Role name'),
control: 'node-list-by-name',
node: 'role',
select2: {
allowClear: false,
},
}, {
id: 'server_note',
label: gettext('Note'),
text: gettext('The backup format will be PLAIN'),
type: 'note',
visible: function(m) {
return m.get('type') === 'server';
},
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Sections'),
group: gettext('Dump options'),
contentClass: 'row',
schema: [{
id: 'pre_data',
label: gettext('Pre-data'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Sections'),
deps: ['only_data', 'only_schema'],
disabled: function(m) {
return m.get('only_data') ||
m.get('only_schema');
},
}, {
id: 'data',
label: gettext('Data'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Sections'),
deps: ['only_data', 'only_schema'],
disabled: function(m) {
return m.get('only_data') ||
m.get('only_schema');
},
}, {
id: 'post_data',
label: gettext('Post-data'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Sections'),
deps: ['only_data', 'only_schema'],
disabled: function(m) {
return m.get('only_data') ||
m.get('only_schema');
},
}],
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server')
return false;
return true;
},
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Type of objects'),
group: gettext('Dump options'),
contentClass: 'row',
schema: [{
id: 'only_data',
label: gettext('Only data'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Type of objects'),
deps: ['pre_data', 'data', 'post_data', 'only_schema'],
disabled: function(m) {
return m.get('pre_data') ||
m.get('data') ||
m.get('post_data') ||
m.get('only_schema');
},
}, {
id: 'only_schema',
label: gettext('Only schema'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Type of objects'),
deps: ['pre_data', 'data', 'post_data', 'only_data'],
disabled: function(m) {
return m.get('pre_data') ||
m.get('data') ||
m.get('post_data') ||
m.get('only_data');
},
}, {
id: 'blobs',
label: gettext('Blobs'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Type of objects'),
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server') {
setTimeout(function() { m.set('blobs', false); }, 10);
return false;
}
return true;
},
}],
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Do not save'),
group: gettext('Dump options'),
contentClass: 'row',
schema: [{
id: 'dns_owner',
label: gettext('Owner'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'dns_privilege',
label: gettext('Privilege'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'dns_tablespace',
label: gettext('Tablespace'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'dns_unlogged_tbl_data',
label: gettext('Unlogged table data'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'no_comments',
label: gettext('Comments'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Do not save'),
visible: function() {
var t = pgBrowser.tree,
i = t.selected(),
s = _.isUndefined(i) ? undefined : t.getTreeNodeHierarchy(i)['server'];
return _.isUndefined(s) ? false : s.version >= 110000;
},
}],
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Queries'),
group: gettext('Dump options'),
contentClass: 'row',
schema: [{
id: 'use_column_inserts',
label: gettext('Use Column Inserts'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Queries'),
}, {
id: 'use_insert_commands',
label: gettext('Use Insert Commands'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Queries'),
}, {
id: 'include_create_database',
label: gettext('Include CREATE DATABASE statement'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Queries'),
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server')
return false;
return true;
},
}, {
id: 'include_drop_database',
label: gettext('Include DROP DATABASE statement'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Queries'),
deps: ['only_data'],
disabled: function(m) {
if (m.get('only_data')) {
setTimeout(function() { m.set('include_drop_database', false); }, 10);
return true;
}
return false;
},
}, {
id: 'load_via_partition_root',
label: gettext('Load Via Partition Root'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Queries'),
visible: function(m) {
if (!_.isUndefined(m.get('type')) && m.get('type') === 'server')
return false;
var t = pgBrowser.tree,
i = t.selected(),
s = _.isUndefined(i) ? undefined : t.getTreeNodeHierarchy(i)['server'];
return _.isUndefined(s) ? false : s.version >= 110000;
},
}],
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Disable'),
group: gettext('Dump options'),
contentClass: 'row',
schema: [{
id: 'disable_trigger',
label: gettext('Trigger'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
group: gettext('Disable'),
deps: ['only_data'],
disabled: function(m) {
return !(m.get('only_data'));
},
}, {
id: 'disable_quoting',
label: gettext('$ quoting'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Disable'),
}],
}, {
type: 'nested',
control: 'fieldset',
label: gettext('Miscellaneous'),
group: gettext('Dump options'),
contentClass: 'row',
schema: [{
id: 'with_oids',
label: gettext('With OID(s)'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
deps: ['use_column_inserts', 'use_insert_commands'],
group: gettext('Miscellaneous'),
disabled: function(m) {
var t = pgBrowser.tree,
i = t.selected(),
s = _.isUndefined(i) ? undefined : t.getTreeNodeHierarchy(i)['server'];
if (!_.isUndefined(s) && s.version >= 120000)
return true;
if (m.get('use_column_inserts') || m.get('use_insert_commands')) {
setTimeout(function() { m.set('with_oids', false); }, 10);
return true;
}
return false;
},
}, {
id: 'verbose',
label: gettext('Verbose messages'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Miscellaneous'),
}, {
id: 'dqoute',
label: gettext('Force double quote on identifiers'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Miscellaneous'),
}, {
id: 'use_set_session_auth',
label: gettext('Use SET SESSION AUTHORIZATION'),
type: 'switch',
extraToggleClasses: 'pg-el-sm-6',
controlLabelClassName: 'control-label pg-el-sm-5 pg-el-12',
controlsClassName: 'pgadmin-controls pg-el-sm-7 pg-el-12',
disabled: false,
group: gettext('Miscellaneous'),
}],
}],
validate: function() {
return null;
},
});
// Create an Object Backup of pgBrowser class
pgBrowser.Backup = {
init: function() {
@@ -574,7 +58,7 @@ define([
name: 'backup_global',
module: this,
applies: ['tools'],
callback: 'start_backup_global',
callback: 'startBackupGlobal',
priority: 12,
label: gettext('Backup Globals...'),
icon: 'fa fa-save',
@@ -586,7 +70,7 @@ define([
name: 'backup_server',
module: this,
applies: ['tools'],
callback: 'start_backup_server',
callback: 'startBackupServer',
priority: 12,
label: gettext('Backup Server...'),
icon: 'fa fa-save',
@@ -599,7 +83,7 @@ define([
module: this,
node: 'server',
applies: ['context'],
callback: 'start_backup_global',
callback: 'startBackupGlobal',
priority: 12,
label: gettext('Backup Globals...'),
icon: 'fa fa-save',
@@ -612,7 +96,7 @@ define([
module: this,
node: 'server',
applies: ['context'],
callback: 'start_backup_server',
callback: 'startBackupServer',
priority: 12,
label: gettext('Backup Server...'),
icon: 'fa fa-save',
@@ -624,7 +108,7 @@ define([
name: 'backup_object',
module: this,
applies: ['tools'],
callback: 'backup_objects',
callback: 'backupObjects',
priority: 11,
label: gettext('Backup...'),
icon: 'fa fa-save',
@@ -642,7 +126,7 @@ define([
node: menuUtils.backupSupportedNodes[idx],
module: this,
applies: ['context'],
callback: 'backup_objects',
callback: 'backupObjects',
priority: 11,
label: gettext('Backup...'),
icon: 'fa fa-save',
@@ -655,34 +139,161 @@ define([
pgBrowser.add_menus(menus);
return this;
},
start_backup_global: function(action, item) {
let dialog = new globalBackupDialog.BackupDialog(
pgBrowser,
$,
alertify,
BackupModel
);
dialog.draw(action, item, {'globals': true}, pgBrowser.stdW.calc(pgBrowser.stdW.md), pgBrowser.stdH.calc(pgBrowser.stdH.md));
startBackupGlobal: function(action, treeItem) {
pgBrowser.Node.registerUtilityPanel();
var panel = pgBrowser.Node.addUtilityPanel();
var tree = pgBrowser.tree,
i = treeItem || tree.selected(),
data = i ? tree.itemData(i) : undefined,
j = panel.$container.find('.obj_properties').first();
var schema = this.getGlobalUISchema(treeItem);
panel.title('Backup Globals');
panel.focus();
var typeOfDialog = 'globals';
var serverIdentifier = this.retrieveServerIdentifier();
var extraData = this.setExtraParameters(typeOfDialog);
this.showBackupDialog(schema, treeItem, j, data, panel, typeOfDialog, serverIdentifier, extraData);
},
start_backup_server: function(action, item) {
let dialog = new globalBackupDialog.BackupDialog(
pgBrowser,
$,
alertify,
BackupObjectModel
);
dialog.draw(action, item, {'server': true}, pgBrowser.stdW.calc(pgBrowser.stdW.md), pgBrowser.stdH.calc(pgBrowser.stdH.md));
startBackupServer: function(action, treeItem) {
pgBrowser.Node.registerUtilityPanel();
var panel = pgBrowser.Node.addUtilityPanel();
var tree = pgBrowser.tree,
i = treeItem || tree.selected(),
data = i ? tree.itemData(i) : undefined,
j = panel.$container.find('.obj_properties').first();
var schema = this.getUISchema(treeItem, 'server');
panel.title(gettext('Backup Server'));
panel.focus();
var typeOfDialog = 'server';
var serverIdentifier = this.retrieveServerIdentifier();
var extraData = this.setExtraParameters(typeOfDialog);
this.showBackupDialog(schema, treeItem, j, data, panel, typeOfDialog, serverIdentifier, extraData);
},
saveCallBack: function(data, dialog) {
pgBrowser.Events.trigger('pgadmin-bgprocess:created', dialog);
},
showBackupDialog: function(schema, item, j, data, panel, typeOfDialog, serverIdentifier, extraData) {
if(schema) {
let treeNodeInfo = pgBrowser.tree.getTreeNodeHierarchy(item);
removeNodeView(j[0]);
let urlShortcut = 'backup.create_server_job';
if (typeOfDialog === 'backup_objects') {
urlShortcut = 'backup.create_object_job';
}
const baseUrl = url_for(urlShortcut, {
'sid': serverIdentifier,
});
var sqlHelpUrl = 'backup.html';
var helpUrl = url_for('help.static', {
'filename': this.getHelpFile(typeOfDialog),
});
getUtilityView(
schema, treeNodeInfo, 'create', 'dialog', j[0], panel, this.saveCallBack, extraData, 'Backup', baseUrl, sqlHelpUrl, helpUrl);
}
},
// Callback to draw Backup Dialog for objects
backup_objects: function(action, treeItem) {
let dialog = new globalBackupDialog.BackupDialog(
pgBrowser,
$,
alertify,
BackupObjectModel
);
dialog.draw(action, treeItem, null, pgBrowser.stdW.calc(pgBrowser.stdW.md), pgBrowser.stdH.calc(pgBrowser.stdH.md));
backupObjects: function(action, treeItem) {
pgBrowser.Node.registerUtilityPanel();
var panel = pgBrowser.Node.addUtilityPanel();
var tree = pgBrowser.tree,
i = treeItem || tree.selected(),
data = i ? tree.itemData(i) : undefined,
j = panel.$container.find('.obj_properties').first();
var schema = this.getUISchema(treeItem, 'backup_objects');
panel.title(`Backup (${pgBrowser.Nodes[data._type].label}: ${data.label})`);
panel.focus();
var typeOfDialog = 'backup_objects';
var serverIdentifier = this.retrieveServerIdentifier();
var extraData = this.setExtraParameters(typeOfDialog);
this.showBackupDialog(schema, treeItem, j, data, panel, typeOfDialog, serverIdentifier, extraData);
},
getUISchema: function(treeItem, backupType) {
let treeNodeInfo = pgBrowser.tree.getTreeNodeHierarchy(treeItem);
const selectedNode = pgBrowser.tree.selected();
let itemNodeData = pgBrowser.tree.findNodeByDomElement(selectedNode).getData();
return new BackupSchema(
()=> getSectionSchema(),
()=> getTypeObjSchema({backupType: backupType}),
()=> getSaveOptSchema({nodeInfo: treeNodeInfo}),
()=> getQueryOptionSchema({nodeInfo: treeNodeInfo, backupType: backupType}),
()=> getDisabledOptionSchema({nodeInfo: treeNodeInfo}),
()=> getMiscellaneousSchema({nodeInfo: treeNodeInfo}),
{
role: ()=>getNodeListByName('role', treeNodeInfo, itemNodeData),
encoding: ()=>getNodeAjaxOptions('get_encodings', pgBrowser.Nodes['database'], treeNodeInfo, itemNodeData, {
cacheNode: 'database',
cacheLevel: 'server',
}),
},
treeNodeInfo,
pgBrowser,
backupType
);
},
getGlobalUISchema: function(treeItem) {
let treeNodeInfo = pgBrowser.tree.getTreeNodeHierarchy(treeItem);
const selectedNode = pgBrowser.tree.selected();
let itemNodeData = pgBrowser.tree.findNodeByDomElement(selectedNode).getData();
return new BackupGlobalSchema(
()=> getMiscellaneousGlobalSchema(),
{
role: ()=>getNodeListByName('role', treeNodeInfo, itemNodeData),
}
);
},
retrieveServerIdentifier() {
const selectedNode = pgBrowser.tree.selected();
var node = pgBrowser.tree.findNodeByDomElement(selectedNode);
const treeInfo = pgBrowser.tree.getTreeNodeHierarchy(node);
return treeInfo.server._id;
},
setExtraParameters(typeOfDialog) {
var extraData = {};
const selectedNode = pgBrowser.tree.selected();
var selectedTreeNode = pgBrowser.tree.findNodeByDomElement(selectedNode);
const treeInfo = pgBrowser.tree.getTreeNodeHierarchy(selectedTreeNode);
if (typeOfDialog === 'backup_objects') {
extraData['database'] = treeInfo.database._label;
const nodeData = selectedTreeNode.getData();
if (nodeData._type === 'schema') {
extraData['schemas'] = [nodeData._label];
}
if (nodeData._type === 'table' || nodeData._type === 'partition') {
extraData['tables'] = [[treeInfo.schema._label, nodeData._label]];
}
/*(if (_.isEmpty(this.view.model.get('ratio'))) {
this.view.model.unset('ratio');
}*/
} else if(typeOfDialog === 'server') {
extraData['type'] = 'server';
} else if(typeOfDialog === 'globals') {
extraData['type'] = 'globals';
}
return extraData;
},
getHelpFile: function (dialog_type) {
if (dialog_type == 'globals') {
return 'backup_globals_dialog.html';
} else if (dialog_type == 'server') {
return 'backup_server_dialog.html';
}
return 'backup_dialog.html';
}
};
return pgBrowser.Backup;
});

View File

@@ -0,0 +1,560 @@
import gettext from 'sources/gettext';
import BaseUISchema from 'sources/SchemaView/base_schema.ui';
import { isEmptyString } from 'sources/validators';
export class SectionSchema extends BaseUISchema {
constructor(fieldOptions={}, initValues) {
super({
...initValues,
});
this.fieldOptions = {
...fieldOptions,
};
}
get idAttribute() {
return 'id';
}
get baseFields() {
return [
{
id: 'pre_data',
label: gettext('Pre-data'),
type: 'switch',
group: gettext('Sections'),
deps: ['only_data', 'only_schema'],
disabled: function(state) {
return state.only_data ||
state.only_schema;
},
}, {
id: 'data',
label: gettext('Data'),
type: 'switch',
group: gettext('Sections'),
deps: ['only_data', 'only_schema'],
disabled: function(state) {
return state.only_data ||
state.only_schema;
},
}, {
id: 'post_data',
label: gettext('Post-data'),
type: 'switch',
group: gettext('Sections'),
deps: ['only_data', 'only_schema'],
disabled: function(state) {
return state.only_data ||
state.only_schema;
},
}
];
}
}
export function getSectionSchema() {
return new SectionSchema();
}
export class TypeObjSchema extends BaseUISchema {
constructor(fieldOptions={}) {
super();
this.fieldOptions = {
backupType: null,
...fieldOptions,
};
this.backupType = this.fieldOptions.backupType;
}
get idAttribute() {
return 'id';
}
get baseFields() {
let obj = this;
return [{
id: 'only_data',
label: gettext('Only data'),
type: 'switch',
group: gettext('Type of objects'),
deps: ['pre_data', 'data', 'post_data', 'only_schema'],
disabled: function(state) {
return state.pre_data ||
state.data ||
state.post_data ||
state.only_schema;
},
}, {
id: 'only_schema',
label: gettext('Only schema'),
type: 'switch',
group: gettext('Type of objects'),
deps: ['pre_data', 'data', 'post_data', 'only_data'],
disabled: function(state) {
return state.pre_data ||
state.data ||
state.post_data ||
state.only_data;
},
}, {
id: 'blobs',
label: gettext('Blobs'),
type: 'switch',
group: gettext('Type of objects'),
visible: function(state) {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server') {
state.blobs = false;
return false;
}
return true;
},
}];
}
}
export function getTypeObjSchema(fieldOptions) {
return new TypeObjSchema(fieldOptions);
}
export class SaveOptSchema extends BaseUISchema {
constructor(fieldOptions={}, initValues) {
super({
id: null,
...initValues,
});
this.fieldOptions = {
nodeInfo: null,
...fieldOptions,
};
}
get idAttribute() {
return 'id';
}
get baseFields() {
let obj = this;
return [{
id: 'dns_owner',
label: gettext('Owner'),
type: 'switch',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'dns_privilege',
label: gettext('Privilege'),
type: 'switch',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'dns_tablespace',
label: gettext('Tablespace'),
type: 'switch',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'dns_unlogged_tbl_data',
label: gettext('Unlogged table data'),
type: 'switch',
disabled: false,
group: gettext('Do not save'),
}, {
id: 'no_comments',
label: gettext('Comments'),
type: 'switch',
disabled: false,
group: gettext('Do not save'),
visible: function() {
var serverInfo = _.isUndefined(obj.fieldOptions.nodeInfo) ? undefined : obj.fieldOptions.nodeInfo.server;
return _.isUndefined(serverInfo) ? false : serverInfo.version >= 110000;
},
}];
}
}
export function getSaveOptSchema(fieldOptions) {
return new SaveOptSchema(fieldOptions);
}
export class QueryOptionSchema extends BaseUISchema {
constructor(fieldOptions={}, initValues) {
super({
id: null,
...initValues,
});
this.fieldOptions = {
nodeInfo: null,
backupType: null,
...fieldOptions,
};
this.backupType = fieldOptions.backupType;
}
get idAttribute() {
return 'id';
}
get baseFields() {
let obj = this;
return [{
id: 'use_column_inserts',
label: gettext('Use Column Inserts'),
type: 'switch',
disabled: false,
group: gettext('Queries'),
}, {
id: 'use_insert_commands',
label: gettext('Use Insert Commands'),
type: 'switch',
disabled: false,
group: gettext('Queries'),
}, {
id: 'include_create_database',
label: gettext('Include CREATE DATABASE statement'),
type: 'switch',
disabled: false,
group: gettext('Queries'),
visible: function() {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server')
return false;
return true;
},
}, {
id: 'include_drop_database',
label: gettext('Include DROP DATABASE statement'),
type: 'switch',
group: gettext('Queries'),
deps: ['only_data'],
disabled: function(state) {
if (state.only_data) {
state.include_drop_database = false;
return true;
}
return false;
},
}, {
id: 'load_via_partition_root',
label: gettext('Load Via Partition Root'),
type: 'switch',
disabled: false,
group: gettext('Queries'),
visible: function() {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server')
return false;
var serverInfo = _.isUndefined(obj.fieldOptions.nodeInfo) ? undefined : obj.fieldOptions.nodeInfo.server;
return _.isUndefined(serverInfo) ? false : serverInfo.version >= 110000;
},
}];
}
}
export function getQueryOptionSchema(fieldOptions) {
return new QueryOptionSchema(fieldOptions);
}
export class DisabledOptionSchema extends BaseUISchema {
constructor(fieldOptions={}, initValues) {
super({
id: null,
...initValues,
});
this.fieldOptions = {
nodeInfo: null,
...fieldOptions,
};
}
get idAttribute() {
return 'id';
}
get baseFields() {
return [{
id: 'disable_trigger',
label: gettext('Trigger'),
type: 'switch',
group: gettext('Disable'),
deps: ['only_data'],
disabled: function(state) {
return !(state.only_data);
},
}, {
id: 'disable_quoting',
label: gettext('$ quoting'),
type: 'switch',
disabled: false,
group: gettext('Disable'),
}];
}
}
export function getDisabledOptionSchema(fieldOptions) {
return new DisabledOptionSchema(fieldOptions);
}
export class MiscellaneousSchema extends BaseUISchema {
constructor(fieldOptions={}, initValues) {
super({
id: null,
verbose: true,
...initValues,
});
this.fieldOptions = {
nodeInfo: null,
...fieldOptions,
};
}
get idAttribute() {
return 'id';
}
get baseFields() {
let obj = this;
return [{
id: 'with_oids',
label: gettext('With OID(s)'),
type: 'switch',
deps: ['use_column_inserts', 'use_insert_commands'],
group: gettext('Miscellaneous'),
disabled: function(state) {
var serverInfo = _.isUndefined(obj.fieldOptions.nodeInfo) ? undefined : obj.fieldOptions.nodeInfo.server;
if (!_.isUndefined(serverInfo) && serverInfo.version >= 120000)
return true;
if (state.use_column_inserts || state.use_insert_commands) {
state.with_oids = false;
return true;
}
return false;
},
}, {
id: 'verbose',
label: gettext('Verbose messages'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous'),
}, {
id: 'dqoute',
label: gettext('Force double quote on identifiers'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous'),
}, {
id: 'use_set_session_auth',
label: gettext('Use SET SESSION AUTHORIZATION'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous'),
}];
}
}
export function getMiscellaneousSchema(fieldOptions) {
return new MiscellaneousSchema(fieldOptions);
}
export default class BackupSchema extends BaseUISchema {
constructor(getSectionSchema, getTypeObjSchema, getSaveOptSchema, getQueryOptionSchema, getDisabledOptionSchema, getMiscellaneousSchema, fieldOptions = {}, treeNodeInfo, pgBrowser, backupType) {
super({
file: undefined,
format: 'custom',
id: null,
blobs: true,
verbose: true,
});
this.fieldOptions = {
encoding: null,
role: null,
...fieldOptions,
};
this.treeNodeInfo = treeNodeInfo;
this.pgBrowser = pgBrowser;
this.backupType = backupType;
this.getSectionSchema = getSectionSchema;
this.getTypeObjSchema = getTypeObjSchema;
this.getSaveOptSchema = getSaveOptSchema;
this.getQueryOptionSchema = getQueryOptionSchema;
this.getDisabledOptionSchema = getDisabledOptionSchema;
this.getMiscellaneousSchema = getMiscellaneousSchema;
}
get idAttribute() {
return 'id';
}
get baseFields() {
var obj = this;
return [{
id: 'file',
label: gettext('Filename'),
type: 'file',
disabled: false,
controlProps: {
dialogType: 'create_file',
supportedTypes: ['*', 'sql', 'backup'],
dialogTitle: 'Select file',
},
deps: ['format'],
}, {
id: 'format',
label: gettext('Format'),
type: 'select',
disabled: false,
controlProps: { allowClear: false, width: '100%' },
options: [
{
label: gettext('Custom'),
value: 'custom',
},
{
label: gettext('Tar'),
value: 'tar',
},
{
label: gettext('Plain'),
value: 'plain',
},
{
label: gettext('Directory'),
value: 'directory',
},
],
visible: function(state) {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server') {
state.format = 'plain';
return false;
}
return true;
},
}, {
id: 'ratio',
label: gettext('Compression ratio'),
type: 'int',
min: 0,
max: 9,
deps: ['format'],
disabled: function(state) {
return (state.format === 'tar');
},
visible: function() {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server')
return false;
return true;
},
}, {
id: 'encoding',
label: gettext('Encoding'),
type: 'select',
disabled: false,
options: obj.fieldOptions.encoding,
visible: function() {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server') {
var dbNode = obj.pgBrowser.serverInfo[obj.treeNodeInfo.server._id];
return _.isUndefined(dbNode) ? false : dbNode.version >= 110000;
}
return true;
},
}, {
id: 'no_of_jobs',
label: gettext('Number of jobs'),
type: 'int',
deps: ['format'],
disabled: function(state) {
return (state.format !== 'directory');
},
visible: function() {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server')
return false;
return true;
},
}, {
id: 'role',
label: gettext('Role name'),
type: 'select',
options: obj.fieldOptions.role,
controlProps: {
allowClear: false,
},
}, {
id: 'server_note',
label: gettext('Note'),
text: gettext('The backup format will be PLAIN'),
type: 'note',
visible: function() {
return obj.backupType === 'server';
},
}, {
type: 'nested-fieldset',
label: gettext('Sections'),
group: gettext('Dump options'),
schema:new getSectionSchema(),
visible: function() {
if (!_.isUndefined(obj.backupType) && obj.backupType === 'server')
return false;
return true;
},
}, {
type: 'nested-fieldset',
label: gettext('Type of objects'),
group: gettext('Dump options'),
schema: obj.getTypeObjSchema()
}, {
type: 'nested-fieldset',
label: gettext('Do not save'),
group: gettext('Dump options'),
schema: obj.getSaveOptSchema(),
}, {
type: 'nested-fieldset',
label: gettext('Queries'),
group: gettext('Dump options'),
schema: obj.getQueryOptionSchema(),
}, {
type: 'nested-fieldset',
label: gettext('Disable'),
group: gettext('Dump options'),
schema: obj.getDisabledOptionSchema(),
}, {
type: 'nested-fieldset',
label: gettext('Miscellaneous'),
group: gettext('Dump options'),
schema: obj.getMiscellaneousSchema(),
}];
}
validate(state, setError) {
if (isEmptyString(state.service)) {
let errmsg = null;
/* events validation*/
if (!state.file) {
errmsg = gettext('Please provide a filename.');
setError('file', errmsg);
return true;
} else {
errmsg = null;
setError('file', errmsg);
}
}
}
}

View File

@@ -0,0 +1,108 @@
import gettext from 'sources/gettext';
import BaseUISchema from 'sources/SchemaView/base_schema.ui';
import { isEmptyString } from 'sources/validators';
export class MiscellaneousSchema extends BaseUISchema {
constructor(fieldOptions={}) {
super();
this.fieldOptions = {
...fieldOptions,
};
}
get idAttribute() {
return 'id';
}
get baseFields() {
return [{
id: 'verbose',
label: gettext('Verbose messages'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous'),
}, {
id: 'dqoute',
label: gettext('Force double quote on identifiers'),
type: 'switch',
disabled: false,
group: gettext('Miscellaneous')
}];
}
}
export function getMiscellaneousSchema() {
return new MiscellaneousSchema();
}
export default class BackupGlobalSchema extends BaseUISchema {
constructor(getMiscellaneousSchema, fieldOptions = {}) {
super({
id: null,
verbose: true,
});
this.fieldOptions = {
role: null,
...fieldOptions,
};
this.getMiscellaneousSchema = getMiscellaneousSchema;
}
get idAttribute() {
return 'id';
}
get baseFields() {
var obj = this;
return [{
id: 'file',
label: gettext('Filename'),
type: 'file',
disabled: false,
controlProps: {
dialogType: 'create_file',
supportedTypes: ['*', 'sql', 'backup'],
dialogTitle: 'Select file',
},
dialog_title: 'Select file',
}, {
id: 'role',
label: gettext('Role name'),
type: 'select',
options: obj.fieldOptions.role,
controlProps: {
allowClear: false,
},
}, {
type: 'nested-fieldset',
label: gettext('Miscellaneous'),
contentClass: 'row',
schema: obj.getMiscellaneousSchema(),
}, {
id: 'globals_note',
label: gettext('Note'),
text: gettext('Only objects global to the entire database will be backed up, in PLAIN format'),
type: 'note',
}];
}
validate(state, setError) {
if (isEmptyString(state.service)) {
let errmsg = null;
/* validation */
if (!state.file) {
errmsg = gettext('Please provide a filename.');
setError('file', errmsg);
return true;
} else {
errmsg = null;
setError('file', errmsg);
}
}
}
}

View File

@@ -1,103 +0,0 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import gettext from '../../../../static/js/gettext';
import Backform from '../../../../static/js/backform.pgadmin';
import {Dialog} from '../../../../static/js/alertify/dialog';
import url_for from 'sources/url_for';
import axios from 'axios/index';
import {retrieveAncestorOfTypeServer} from 'sources/tree/tree_utils';
import {hasBinariesConfiguration} from 'sources/utils';
export class BackupDialog extends Dialog {
constructor(pgBrowser, $, alertify, BackupModel, backform = Backform) {
super(gettext('Backup Error'),
'<div class=\'backup_dialog\'></div>',
pgBrowser, $, alertify, BackupModel, backform
);
}
url_for_utility_exists(id, params){
return url_for('backup.utility_exists', {
'sid': id,
'backup_obj_type': params == null ? 'objects' : 'servers',
});
}
draw(action, aciTreeItem, params, width=0, height=0) {
const serverInformation = retrieveAncestorOfTypeServer(this.pgBrowser, aciTreeItem, gettext('Backup Error'), this.alertify);
if (!serverInformation) {
return;
}
if (!hasBinariesConfiguration(this.pgBrowser, serverInformation, this.alertify)) {
return;
}
var sid = serverInformation._type == 'database' ? serverInformation._pid : serverInformation._id;
const baseUrl = this.url_for_utility_exists(sid, params);
// Check pg_dump or pg_dumpall utility exists or not.
let that = this;
axios.get(
baseUrl
).then(function(res) {
if (!res.data.success) {
that.alertify.alert(
gettext('Utility not found'),
res.data.errormsg
);
return;
}
const typeOfDialog = BackupDialog.typeOfDialog(params);
if (!that.canExecuteOnCurrentDatabase(aciTreeItem)) {
return;
}
const dialog = that.createOrGetDialog(
BackupDialog.dialogTitle(typeOfDialog),
typeOfDialog
);
dialog(true).resizeTo(width, height);
}).catch(function() {
that.alertify.alert(
gettext('Utility not found'),
gettext('Failed to fetch Utility information')
);
return;
});
}
static typeOfDialog(params) {
if (params === null) {
return 'backup_objects';
}
let typeOfDialog = 'server';
if (!_.isUndefined(params['globals']) && params['globals']) {
typeOfDialog = 'globals';
}
return typeOfDialog;
}
static dialogTitle(typeOfDialog) {
if (typeOfDialog === 'backup_objects') {
return null;
}
return ((typeOfDialog === 'globals') ?
gettext('Backup Globals...') :
gettext('Backup Server...'));
}
dialogName(typeOfDialog) {
if (typeOfDialog === 'backup_objects') {
return typeOfDialog;
}
return 'BackupDialog_' + typeOfDialog;
}
}

View File

@@ -1,317 +0,0 @@
/////////////////////////////////////////////////////////////
//
// pgAdmin 4 - PostgreSQL Tools
//
// Copyright (C) 2013 - 2021, The pgAdmin Development Team
// This software is released under the PostgreSQL Licence
//
//////////////////////////////////////////////////////////////
import axios from 'axios/index';
import gettext from '../../../../static/js/gettext';
import url_for from '../../../../static/js/url_for';
import _ from 'underscore';
import {DialogWrapper} from '../../../../static/js/alertify/dialog_wrapper';
import {fetch_ticket_lifetime} from '../../../../authenticate/static/js/kerberos';
import userInfo from 'pgadmin.user_management.current_user';
import pgConst from 'pgadmin.browser.constants';
export class BackupDialogWrapper extends DialogWrapper {
constructor(dialogContainerSelector, dialogTitle, typeOfDialog,
jquery, pgBrowser, alertify, dialogModel, backform) {
super(dialogContainerSelector, dialogTitle, jquery,
pgBrowser, alertify, dialogModel, backform);
this.typeOfDialog = typeOfDialog;
}
main(title) {
this.set('title', title);
}
setup() {
let get_help_file = function (dialog_type) {
if (dialog_type == 'globals') {
return 'backup_globals_dialog.html';
} else if (dialog_type == 'server') {
return 'backup_server_dialog.html';
}
return 'backup_dialog.html';
};
return {
buttons: [{
text: '',
className: 'btn btn-primary-icon pull-left fa fa-info pg-alertify-icon-button',
attrs: {
name: 'object_help',
type: 'button',
url: 'backup.html',
label: gettext('Backup'),
'aria-label': gettext('Backup'),
},
}, {
text: '',
key: 112,
className: 'btn btn-primary-icon pull-left fa fa-question pg-alertify-icon-button',
attrs: {
name: 'dialog_help',
type: 'button',
label: gettext('Help'),
'aria-label': gettext('Help'),
url: url_for('help.static', {
'filename': get_help_file(this.typeOfDialog),
}),
},
}, {
text: gettext('Cancel'),
key: 27,
className: 'btn btn-secondary fa fa-lg fa-times pg-alertify-button',
'data-btn-name': 'cancel',
}, {
text: gettext('Backup'),
key: 13,
className: 'btn btn-primary fa fa-lg fa-save pg-alertify-button',
'data-btn-name': 'backup',
}],
// Set options for dialog
options: {
title: this.dialogTitle,
//disable both padding and overflow control.
padding: !1,
overflow: !1,
model: 0,
resizable: true,
maximizable: true,
pinnable: false,
closableByDimmer: false,
modal: false,
},
};
}
prepare() {
this.disableBackupButton();
const $container = this.jquery(this.dialogContainerSelector);
const selectedTreeNode = this.getSelectedNode();
const selectedTreeNodeData = this.getSelectedNodeData(selectedTreeNode);
if (!selectedTreeNodeData) {
return;
}
const node = this.pgBrowser.Nodes[selectedTreeNodeData._type];
if (this.dialogTitle === null) {
let title = gettext('Backup (%s: %s)', node.label, selectedTreeNodeData.label);
this.main(title);
}
const treeInfo = this.pgBrowser.tree.getTreeNodeHierarchy(selectedTreeNode);
const dialog = this.createDialog(node, treeInfo, this.typeOfDialog, $container);
this.addAlertifyClassToBackupNodeChildNodes();
dialog.render();
const statusBar = this.jquery(
'<div class=\'pg-prop-status-bar pg-prop-status-bar-absolute pg-el-xs-12 d-none\'>' +
' <div class="error-in-footer"> ' +
' <div class="d-flex px-2 py-1"> ' +
' <div class="pr-2"> ' +
' <i class="fa fa-exclamation-triangle text-danger" aria-hidden="true"></i> ' +
' </div> ' +
' <div class="alert-text" role="alert"></div> ' +
' <div class="ml-auto close-error-bar"> ' +
' <a aria-label="' + gettext('Close error bar') + '" class="close-error fa fa-times text-danger"></a> ' +
' </div> ' +
' </div> ' +
' </div> ' +
'</div>').appendTo($container);
this.elements.content.appendChild($container.get(0));
this.focusOnDialog(this);
this.setListenersForFilenameChanges(statusBar);
}
callback(event) {
const selectedTreeNode = this.getSelectedNode();
const selectedTreeNodeData = this.getSelectedNodeData(selectedTreeNode);
const node = selectedTreeNodeData && this.pgBrowser.Nodes[selectedTreeNodeData._type];
if (this.wasHelpButtonPressed(event)) {
event.cancel = true;
this.pgBrowser.showHelp(
event.button.element.name,
event.button.element.getAttribute('url'),
node,
selectedTreeNode.getHtmlIdentifier()
);
return;
}
if (this.wasBackupButtonPressed(event)) {
if (!selectedTreeNodeData)
return;
const serverIdentifier = this.retrieveServerIdentifier(node, selectedTreeNode);
const dialog = this;
let urlShortcut = 'backup.create_server_job';
if (this.typeOfDialog === 'backup_objects') {
urlShortcut = 'backup.create_object_job';
}
const baseUrl = url_for(urlShortcut, {
'sid': serverIdentifier,
});
const treeInfo = this.pgBrowser.tree.getTreeNodeHierarchy(selectedTreeNode);
this.setExtraParameters(selectedTreeNode, treeInfo);
let backupDate = this.view.model.toJSON();
if(userInfo['current_auth_source'] == pgConst['KERBEROS'] && treeInfo.server.gss_authenticated && (backupDate.type == 'globals' || backupDate.type == 'server')) {
let newPromise = fetch_ticket_lifetime();
newPromise.then(
function(lifetime) {
if (lifetime < 1800 && lifetime > 0) {
dialog.alertify.warning(
'You have '+ (Math.round(parseInt(lifetime)/60)).toString() +' minutes left on your ticket - if the dump takes longer than that, it may fail."'
);
}
},
function() {
dialog.alertify.warning(
gettext('Please renew your kerberos ticket, it has been expired.')
);
}
);
}
axios.post(
baseUrl,
backupDate
).then(function (res) {
if (res.data.success) {
dialog.alertify.success(gettext('Backup job created.'), 5);
dialog.pgBrowser.Events.trigger('pgadmin-bgprocess:created', dialog);
} else {
dialog.alertify.alert(
gettext('Backup job creation failed.'),
res.data.errormsg
);
}
}).catch(function (error) {
try {
const err = error.response.data;
dialog.alertify.alert(
gettext('Backup job failed.'),
err.errormsg
);
} catch (e) {
console.warn(e.stack || e);
}
});
}
}
addAlertifyClassToBackupNodeChildNodes() {
this.jquery(this.elements.body.childNodes[0]).addClass(
'alertify_tools_dialog_properties obj_properties'
);
}
getSelectedNode() {
const tree = this.pgBrowser.tree;
const selectedNode = tree.selected();
if (selectedNode) {
return tree.findNodeByDomElement(selectedNode);
} else {
return undefined;
}
}
disableBackupButton() {
this.__internal.buttons[3].element.disabled = true;
}
enableBackupButton() {
this.__internal.buttons[3].element.disabled = false;
}
createDialog(node, treeInfo, typeOfDialog, $container) {
let attributes = {};
if (typeOfDialog !== 'backup_objects') {
attributes['type'] = typeOfDialog;
}
// Instance of backbone model
const newModel = new this.dialogModel(attributes, {
node_info: treeInfo,
});
const fields = this.backform.generateViewSchema(
treeInfo, newModel, 'create', node, treeInfo.server, true
);
return this.view = new this.backform.Dialog({
el: $container,
model: newModel,
schema: fields,
});
}
retrieveServerIdentifier(node, selectedTreeNode) {
const treeInfo = this.pgBrowser.tree.getTreeNodeHierarchy(selectedTreeNode);
return treeInfo.server._id;
}
setListenersForFilenameChanges(statusBar) {
const self = this;
this.view.model.on('change', function () {
const ctx = this;
var errmsg;
const showError = function(errorField, errormsg) {
ctx.errorModel.set(errorField, errormsg);
statusBar.removeClass('d-none');
statusBar.find('.alert-text').html(errormsg);
self.elements.dialog.querySelector('.close-error').addEventListener('click', ()=>{
statusBar.addClass('d-none');
ctx.errorModel.set(errorField, errormsg);
});
};
if (!_.isUndefined(this.get('file')) && this.get('file') !== '') {
this.errorModel.clear();
statusBar.addClass('d-none');
self.enableBackupButton();
} else {
self.disableBackupButton();
errmsg = gettext('Please provide a filename');
showError('file', errmsg);
}
});
}
setExtraParameters(selectedTreeNode, treeInfo) {
if (this.typeOfDialog === 'backup_objects') {
this.view.model.set('database', treeInfo.database._label);
const nodeData = selectedTreeNode.getData();
if (nodeData._type === 'schema') {
this.view.model.set('schemas', [nodeData._label]);
}
if (nodeData._type === 'table' || nodeData._type === 'partition') {
this.view.model.set('tables', [
[treeInfo.schema._label, nodeData._label],
]);
}
if (_.isEmpty(this.view.model.get('ratio'))) {
this.view.model.unset('ratio');
}
}
}
wasBackupButtonPressed(event) {
return event.button['data-btn-name'] === 'backup';
}
}