$( document ).ready(function() {
getDBList();
$("#query").keypress(function(e){
if(e.which == 13) {
queryFunction();
}
});
//update currently selected database
$( document ).on( "click", "#db-list .list-group-item", function() {
$("#db-list .list-group-item").each(function() {
$(this).removeClass('selected');
});
$(this).addClass('selected');
});
//update currently table database
$( document ).on( "click", "#table-list .list-group-item", function() {
$("#table-list .list-group-item").each(function() {
$(this).removeClass('selected');
});
$(this).addClass('selected');
});
});
var isDatabaseSelected = true;
function getData(tableName) {
$.ajax({url: "getAllDataFromTheTable?tableName="+tableName, success: function(result){
result = JSON.parse(result);
inflateData(result);
}});
}
function queryFunction() {
var query = $('#query').val();
$.ajax({url: "query?query="+escape(query), success: function(result){
result = JSON.parse(result);
inflateData(result);
}});
}
function downloadDb() {
if (isDatabaseSelected) {
$.ajax({url: "downloadDb", success: function(){
window.location = 'downloadDb';
}});
}
}
function deleteDb() {
if (isDatabaseSelected) {
$.ajax({url: "deleteDb", success: function(result){
result = JSON.parse(result);
if(result.isSuccessful){
console.log("Database deleted successfully");
showSuccessInfo("Database Deleted Successfully");
getDBList();
} else {
console.log("Database delete failed");
showErrorInfo("Database Delete Failed");
}
}});
}
}
function getDBList() {
$.ajax({url: "getDbList", success: function(result){
result = JSON.parse(result);
var dbList = result.rows;
$('#db-list').empty();
var isSelectionDone = false;
for(var count = 0; count < dbList.length; count++){
var dbName = dbList[count][0];
var isEncrypted = dbList[count][1];
var isDownloadable = dbList[count][2];
var dbAttribute = isEncrypted == "true" ? ' ' : "";
if(dbName.indexOf("journal") == -1 && dbName.indexOf("-wal") == -1 && dbName.indexOf("-shm") == -1){
$("#db-list").append("" + dbName + dbAttribute + "");
if(!isSelectionDone){
isSelectionDone = true;
$('#db-list').find('a').trigger('click');
}
}
}
}});
}
var lastTableName = getHashValue('table');
function openDatabaseAndGetTableList(db, isDownloadable) {
if("APP_SHARED_PREFERENCES" == db) {
$('#run-query').removeClass('active');
$('#run-query').addClass('disabled');
$('#selected-db-download').removeClass('active');
$('#selected-db-delete').removeClass('active');
$('#selected-db-download').addClass('disabled');
$('#selected-db-delete').addClass('disabled');
isDatabaseSelected = false;
$("#selected-db-info").text("SharedPreferences");
} else {
$('#run-query').removeClass('disabled');
$('#run-query').addClass('active');
$("#selected-db-info").text("Selected Database : "+db);
if("true" == isDownloadable) {
$('#selected-db-download').addClass('active');
$('#selected-db-delete').addClass('active');
$('#selected-db-download').removeClass('disabled');
$('#selected-db-delete').removeClass('disabled');
} else {
$('#selected-db-download').removeClass('active');
$('#selected-db-delete').removeClass('active');
$('#selected-db-download').addClass('disabled');
$('#selected-db-delete').addClass('disabled');
}
isDatabaseSelected = true;
}
$.ajax({url: "getTableList?database="+db, success: function(result){
result = JSON.parse(result);
var tableList = result.rows;
var dbVersion = result.dbVersion;
if("APP_SHARED_PREFERENCES" != db) {
$("#selected-db-info").text("Selected Database : "+db +" Version : "+dbVersion);
}
$('#table-list').empty()
for(var count = 0; count < tableList.length; count++){
var tableName = tableList[count];
$("#table-list").append("" + tableName + "");
}
if (lastTableName !== null) {
$('a[data-table-name=' + lastTableName + ']').trigger('click');
}
}});
}
function inflateData(result){
if(result.isSuccessful){
if(!result.isSelectQuery){
showSuccessInfo("Query Executed Successfully");
return;
}
var columnHeader = result.tableInfos;
// set function to return cell data for different usages like set, display, filter, search etc..
for(var i = 0; i < columnHeader.length; i++) {
columnHeader[i]['targets'] = i;
columnHeader[i]['data'] = function(row, type, val, meta) {
var dataType = row[meta.col].dataType;
if (type == "sort" && dataType == "boolean") {
return row[meta.col].value ? 1 : 0;
}
return row[meta.col].value;
}
}
var columnData = result.rows;
var tableId = "#db-data";
if ($.fn.DataTable.isDataTable(tableId) ) {
$(tableId).DataTable().destroy();
}
$("#db-data-div").remove();
$("#parent-data-div").append('
');
var availableButtons;
if (result.isEditable) {
availableButtons = [
{
text : 'Add',
name : 'add' // don not change name
},
{
extend: 'selected', // Bind to Selected row
text: 'Edit',
name: 'edit' // do not change name
},
{
extend: 'selected',
text: 'Delete',
name: 'delete'
}
];
} else {
availableButtons = [];
}
$(tableId).dataTable({
"data": columnData,
"columnDefs": columnHeader,
'bPaginate': true,
'searching': true,
'bFilter': true,
'bInfo': true,
"bSort" : true,
"scrollX": true,
"iDisplayLength": 10,
"dom": "Bfrtip",
select: 'single',
altEditor: true, // Enable altEditor
buttons: availableButtons
})
//attach row-updated listener
$(tableId).on('update-row.dt', function (e, updatedRowData, callback) {
var updatedRowDataArray = JSON.parse(updatedRowData);
//add value for each column
var data = columnHeader;
for(var i = 0; i < data.length; i++) {
data[i].value = updatedRowDataArray[i].value;
data[i].dataType = updatedRowDataArray[i].dataType;
}
//send update table data request to server
updateTableData(data, callback);
});
//attach delete-updated listener
$(tableId).on('delete-row.dt', function (e, updatedRowData, callback) {
var deleteRowDataArray = JSON.parse(updatedRowData);
console.log(deleteRowDataArray);
//add value for each column
var data = columnHeader;
for(var i = 0; i < data.length; i++) {
data[i].value = deleteRowDataArray[i].value;
data[i].dataType = deleteRowDataArray[i].dataType;
}
//send delete table data request to server
deleteTableData(data, callback);
});
$(tableId).on('add-row.dt', function (e, updatedRowData, callback) {
var deleteRowDataArray = JSON.parse(updatedRowData);
console.log(deleteRowDataArray);
//add value for each column
var data = columnHeader;
for(var i = 0; i < data.length; i++) {
data[i].value = deleteRowDataArray[i].value;
data[i].dataType = deleteRowDataArray[i].dataType;
}
//send delete table data request to server
addTableData(data, callback);
});
// hack to fix alignment issue when scrollX is enabled
$(".dataTables_scrollHeadInner").css({"width":"100%"});
$(".table ").css({"width":"100%"});
}else{
if(!result.isSelectQuery){
showErrorInfo("Query Execution Failed");
}else {
showErrorInfo("Some Error Occurred");
}
}
}
//send update database request to server
function updateTableData(updatedData, callback) {
//get currently selected element
var selectedTableElement = $("#table-list .list-group-item.selected");
var filteredUpdatedData = updatedData.map(function(columnData){
return {
title: columnData.title,
isPrimary: columnData.isPrimary,
value: columnData.value,
dataType: columnData.dataType
}
});
//build request parameters
var requestParameters = {};
requestParameters.dbName = selectedTableElement.attr('data-db-name');
requestParameters.tableName = selectedTableElement.attr('data-table-name');;
requestParameters.updatedData = encodeURIComponent(JSON.stringify(filteredUpdatedData));
//execute request
$.ajax({
url: "updateTableData",
type: 'GET',
data: requestParameters,
success: function(response) {
response = JSON.parse(response);
if(response.isSuccessful){
console.log("Data updated successfully");
callback(true);
showSuccessInfo("Data Updated Successfully");
} else {
console.log("Data updated failed");
callback(false);
}
}
})
}
function deleteTableData(deleteData, callback) {
var selectedTableElement = $("#table-list .list-group-item.selected");
var filteredUpdatedData = deleteData.map(function(columnData){
return {
title: columnData.title,
isPrimary: columnData.isPrimary,
value: columnData.value,
dataType: columnData.dataType
}
});
//build request parameters
var requestParameters = {};
requestParameters.dbName = selectedTableElement.attr('data-db-name');
requestParameters.tableName = selectedTableElement.attr('data-table-name');;
requestParameters.deleteData = encodeURIComponent(JSON.stringify(filteredUpdatedData));
//execute request
$.ajax({
url: "deleteTableData",
type: 'GET',
data: requestParameters,
success: function(response) {
response = JSON.parse(response);
if(response.isSuccessful){
console.log("Data deleted successfully");
callback(true);
showSuccessInfo("Data Deleted Successfully");
} else {
console.log("Data delete failed");
callback(false);
}
}
})
}
function addTableData(deleteData, callback) {
var selectedTableElement = $("#table-list .list-group-item.selected");
var filteredUpdatedData = deleteData.map(function(columnData){
return {
title: columnData.title,
isPrimary: columnData.isPrimary,
value: columnData.value,
dataType: columnData.dataType
}
});
console.log(filteredUpdatedData);
//build request parameters
var requestParameters = {};
requestParameters.dbName = selectedTableElement.attr('data-db-name');
requestParameters.tableName = selectedTableElement.attr('data-table-name');;
requestParameters.addData = encodeURIComponent(JSON.stringify(filteredUpdatedData));
console.log(requestParameters);
//execute request
$.ajax({
url: "addTableData",
type: 'GET',
data: requestParameters,
success: function(response) {
response = JSON.parse(response);
if(response.isSuccessful){
console.log("Data Added successfully");
callback(true);
getData(requestParameters.tableName);
showSuccessInfo("Data Added Successfully");
} else {
console.log("Data Adding failed");
callback(false);
}
}
});
}
function showSuccessInfo(message){
var snackbarId = "snackbar";
var snackbarElement = $("#"+snackbarId);
snackbarElement.addClass("show");
snackbarElement.css({"backgroundColor": "#5cb85c"});
snackbarElement.html(message)
setTimeout(function(){
snackbarElement.removeClass("show");
}, 3000);
}
function showErrorInfo(message){
var snackbarId = "snackbar";
var snackbarElement = $("#"+snackbarId);
snackbarElement.addClass("show");
snackbarElement.css({"backgroundColor": "#d9534f"});
snackbarElement.html(message)
setTimeout(function(){
snackbarElement.removeClass("show");
}, 3000);
}
function getHashValue(key) {
var matches = location.hash.match(new RegExp(key + '=([^&]*)'));
return matches ? matches[1] : null;
}