From 2b96a0f41b5fdfee6c4101b1b7f2a4da644014bc Mon Sep 17 00:00:00 2001 From: Niko Halink Date: Sun, 11 Oct 2020 23:14:09 +0200 Subject: [PATCH 1/4] Added SQL UPDATE feature --- README.md | 1 + index.html | 1 + magic.js | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c51db67..26819c0 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ Allows you to seamlessly switch between CSV, TSV, HTML, SQL, markdown and a litt | Preserves alignment | Between all views | | Markdown formatting | Adds spaces, makes things more legible | | Form view | Create tables with buttons! | +| INSERT | Generate an INSERT query to add data to a table | I've made this as a little learning exercise to play with Primer, Atom, GitHub Desktop and GitHub itself. diff --git a/index.html b/index.html index 59def16..343d29e 100644 --- a/index.html +++ b/index.html @@ -24,6 +24,7 @@ CSV/TSV Markdown SQL + INSERT HTML Form Preview diff --git a/magic.js b/magic.js index 9ff3fb3..73c14f3 100644 --- a/magic.js +++ b/magic.js @@ -143,6 +143,7 @@ function changeTab(newTab) { if (tab==="csv") { array = csv2array(input); } if (tab==="html") { array = html2array(input); } if (tab==="sql") { array = sql2array(input); } + if (tab==="insert") { array = insert2array(input); } if (tab==="form") { array = form2array(); } if (tab==="preview") { array = array_storge; } @@ -169,6 +170,11 @@ function changeTab(newTab) { new_layout=true; } + if (newTab==="insert") { + output = array2insert(array); + new_layout=true; + } + if (newTab==="form") { output = array2form(array); new_layout=false; @@ -194,13 +200,13 @@ function changeTab(newTab) { $('.tabnav-tab').removeClass('selected'); $('#tab-'+newTab).addClass('selected'); - if ((tab==='md')||tab==='sql') { + if ((tab==='md')||tab==='sql'||tab==='insert') { $('textarea').removeClass('md'); if (tab==='md') $('#md-options').hide(); if (tab==='sql') $('#sql-info').hide(); } - if ((newTab==='md')||newTab==='sql') { + if ((newTab==='md')||newTab==='sql'||newTab==='insert') { $('textarea').addClass('md'); if (newTab==='md') $('#md-options').show(); if (newTab==='sql') $('#sql-info').show(); @@ -755,6 +761,110 @@ function array2sqlDashes(cell_sizes, rowlength) { } +function insert2array(insert) { + + var array = [];array[0] = []; + + // Strip all newlines & double spaces + insert = insert.replace(/\n/g, ''); + insert = insert.replace(/ /g, ' '); + + // Split into header & body + var parts = insert.split(') VALUES '); + var n = parts[0].indexOf('(')+1; + var header = parts[0].substring(n, parts[0].length); + + // Split header into columns + var columns = header.split(', '); + + for (var c = 0; c < columns.length; c++) { + + var column = columns[c]; + + // Remove escaping slashes for single and double quotes + column = column.replace(/\"/g, '"'); + column = column.replace(/\'/g, "'"); + + array[0][c] = column; + + } + + // Strip opening & closing brackets + ending semi-colon + var body = parts[1].substring(1, parts[1].length-2); + + // Split body into rows + var rows = body.split('), ('); + + for (var r = 0; r < rows.length; r++) { + + var cells = rows[r].split(', '); + + array[r+1] = []; + + for (var c = 0; c < cells.length; c++) { + + var cell = cells[c]; + + // Strip opening and closing single qoutes + cell = cell.substring(1, cell.length-1); + + // Remove escaping slashes for single and double quotes + cell = cell.replace("\\'", "'"); + cell = cell.replace('\\"', '"'); + + array[r+1][c] = cell; + + } + + } + + return array; +} + +function array2insert(array) { + + var insert = ''; + + for (var r = 0; r < array.length; r++) { + + var row = array[r]; + + insert += ' ('; + + for (var c = 0; c < row.length; c++) { + + var item = row[c]; + + // Escape quotes + item = item.replace(/"/g, '\\"'); + item = item.replace(/'/g, "\\'"); + + if (c>0) { insert += ', '; } + insert += "'"+ item +"'"; + + } + + // Last row should end with a semi-colon instead of a comma + insert += (r===(array.length-1)) ? ');\n' : '),\n'; + + // First row are the columns + if (r===0) { + insert = insert.replace(' (', '('); + insert = insert.replace('(\'', '('); + insert = insert.replace('\')', ')'); + insert = insert.replace(/', '/g, ', '); + insert = insert.replace('),\n', ')'); + + var columns = insert; + insert = ''; + } + + } + + return 'INSERT INTO [TABLENAME] '+ columns +' VALUES\n'+ insert; + +} + function form2array() { var array = []; From bbdff7e0c05b86e6c025c2e9f95410da228deabb Mon Sep 17 00:00:00 2001 From: Niko Halink Date: Mon, 12 Oct 2020 08:48:09 +0200 Subject: [PATCH 2/4] Add update tab --- index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/index.html b/index.html index 343d29e..6aa29ce 100644 --- a/index.html +++ b/index.html @@ -25,6 +25,7 @@ Markdown SQL INSERT + UPDATE HTML Form Preview From 69457b13e7373bccce100d541acab36e5eaa6161 Mon Sep 17 00:00:00 2001 From: Niko Halink Date: Mon, 12 Oct 2020 08:53:28 +0200 Subject: [PATCH 3/4] Add SQL UPDATE feature --- magic.js | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 2 deletions(-) diff --git a/magic.js b/magic.js index 73c14f3..65a5e48 100644 --- a/magic.js +++ b/magic.js @@ -144,6 +144,7 @@ function changeTab(newTab) { if (tab==="html") { array = html2array(input); } if (tab==="sql") { array = sql2array(input); } if (tab==="insert") { array = insert2array(input); } + if (tab==="update") { array = update2array(input); } if (tab==="form") { array = form2array(); } if (tab==="preview") { array = array_storge; } @@ -175,6 +176,11 @@ function changeTab(newTab) { new_layout=true; } + if (newTab==="update") { + output = array2update(array); + new_layout=true; + } + if (newTab==="form") { output = array2form(array); new_layout=false; @@ -200,13 +206,13 @@ function changeTab(newTab) { $('.tabnav-tab').removeClass('selected'); $('#tab-'+newTab).addClass('selected'); - if ((tab==='md')||tab==='sql'||tab==='insert') { + if ((tab==='md')||tab==='sql'||tab==='insert'||tab==='update') { $('textarea').removeClass('md'); if (tab==='md') $('#md-options').hide(); if (tab==='sql') $('#sql-info').hide(); } - if ((newTab==='md')||newTab==='sql'||newTab==='insert') { + if ((newTab==='md')||newTab==='sql'||newTab==='insert'||newTab==='update') { $('textarea').addClass('md'); if (newTab==='md') $('#md-options').show(); if (newTab==='sql') $('#sql-info').show(); @@ -865,6 +871,81 @@ function array2insert(array) { } +function update2array(update) { + var array = [];array[0] = []; + + // Remove last newline + update = update.substring(0, update.length-2) + + // Split the update string + var rows = update.split(/\n/g); + + for (var r = 0; r < rows.length; r++) { + array[r+1] = []; + + var splits = rows[r].split('WHERE'); + var ident = splits[1].replace(';', '').trim(); + + var start = splits[0].indexOf('SET'); + var info = splits[0].substring(start + 4, splits[0].length).trim(); + + var data = (ident +', '+ info).replace(/', /g, "'#$#").split('#$#'); + + for (var c = 0; c < data.length; c++) { + var item = data[c]; + + // Remove escaping slashes for single and double quotes + item = item.replace(/\\'/g, "'"); + item = item.replace(/\\"/g, '"'); + + item = item.split(' = '); + + if (r === 0) { + array[0][c] = item[0]; + } + array[r+1][c] = item[1].substring(1, item[1].length-1); + } + } + + return array; +} + +function array2update(array) { + var update = ''; + var updates = ''; + + // first row is columns + var columns = array[0]; + + for (var r = 1; r < array.length; r++) { + + var row = array[r]; + updates = ''; + + for (var c = 0; c < row.length; c++) { + + var item = row[c]; + + // Escape quotes + item = item.replace(/"/g, '\\"'); + item = item.replace(/'/g, "\\'"); + + if (c == 0) { + var where = item; + } else { + updates += columns[c] + ' = \'' + item + '\''; + if (c < row.length - 1) { updates += ', '; } + } + + } + + update += 'UPDATE [TABLENAME] SET '+ updates +' WHERE '+ columns[0] +' = \''+ where +'\';\n'; + + } + + return update; +} + function form2array() { var array = []; From 87483c8b6e882360988a55373f0c24c2225c1f4f Mon Sep 17 00:00:00 2001 From: Niko Halink Date: Mon, 12 Oct 2020 08:53:49 +0200 Subject: [PATCH 4/4] Update readme for SQL UPDATE feature --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 26819c0..ec8eae5 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Allows you to seamlessly switch between CSV, TSV, HTML, SQL, markdown and a litt | Markdown formatting | Adds spaces, makes things more legible | | Form view | Create tables with buttons! | | INSERT | Generate an INSERT query to add data to a table | +| UPDATE | Generate UPDATE queries to add data to a table | I've made this as a little learning exercise to play with Primer, Atom, GitHub Desktop and GitHub itself.