var execBtn = document.getElementById("execute"); var outputElm = document.getElementById('output'); var errorElm = document.getElementById('error'); var commandsElm = document.getElementById('commands'); var dbFileElm = document.getElementById('dbfile'); var savedbElm = document.getElementById('savedb'); // Start the worker in which sql.js will run var worker = new Worker("../../dist/worker.sql-wasm.js"); worker.onerror = error; // Open a database worker.postMessage({ action: 'open' }); // Connect to the HTML element we 'print' to function print(text) { outputElm.innerHTML = text.replace(/\n/g, '
'); } function error(e) { console.log(e); errorElm.style.height = '2em'; errorElm.textContent = e.message; } function noerror() { errorElm.style.height = '0'; } // Run a command in the database function execute(commands) { tic(); worker.onmessage = function (event) { var results = event.data.results; toc("Executing SQL"); if (!results) { error({message: event.data.error}); return; } tic(); outputElm.innerHTML = ""; for (var i = 0; i < results.length; i++) { outputElm.appendChild(tableCreate(results[i].columns, results[i].values)); } toc("Displaying results"); } worker.postMessage({ action: 'exec', sql: commands }); outputElm.textContent = "Fetching results..."; } // Create an HTML table var tableCreate = function () { function valconcat(vals, tagName) { if (vals.length === 0) return ''; var open = '<' + tagName + '>', close = ''; return open + vals.join(close + open) + close; } return function (columns, values) { var tbl = document.createElement('table'); var html = '' + valconcat(columns, 'th') + ''; var rows = values.map(function (v) { return valconcat(v, 'td'); }); html += '' + valconcat(rows, 'tr') + ''; tbl.innerHTML = html; return tbl; } }(); // Execute the commands when the button is clicked function execEditorContents() { noerror() execute(editor.getValue() + ';'); } execBtn.addEventListener("click", execEditorContents, true); // Performance measurement functions var tictime; if (!window.performance || !performance.now) { window.performance = { now: Date.now } } function tic() { tictime = performance.now() } function toc(msg) { var dt = performance.now() - tictime; console.log((msg || 'toc') + ": " + dt + "ms"); } // Add syntax highlihjting to the textarea var editor = CodeMirror.fromTextArea(commandsElm, { mode: 'text/x-mysql', viewportMargin: Infinity, indentWithTabs: true, smartIndent: true, lineNumbers: true, matchBrackets: true, autofocus: true, extraKeys: { "Ctrl-Enter": execEditorContents, "Ctrl-S": savedb, } }); // Load a db from a file dbFileElm.onchange = function () { var f = dbFileElm.files[0]; var r = new FileReader(); r.onload = function () { worker.onmessage = function () { toc("Loading database from file"); // Show the schema of the loaded database editor.setValue("SELECT `name`, `sql`\n FROM `sqlite_master`\n WHERE type='table';"); execEditorContents(); }; tic(); try { worker.postMessage({ action: 'open', buffer: r.result }, [r.result]); } catch (exception) { worker.postMessage({ action: 'open', buffer: r.result }); } } r.readAsArrayBuffer(f); } // Save the db to a file function savedb() { worker.onmessage = function (event) { toc("Exporting the database"); var arraybuff = event.data.buffer; var blob = new Blob([arraybuff]); var a = document.createElement("a"); document.body.appendChild(a); a.href = window.URL.createObjectURL(blob); a.download = "sql.db"; a.onclick = function () { setTimeout(function () { window.URL.revokeObjectURL(a.href); }, 1500); }; a.click(); }; tic(); worker.postMessage({ action: 'export' }); } savedbElm.addEventListener("click", savedb, true);