Re: SQL Editor 1.0.1
Posted: Mon Feb 28, 2022 2:10 pm
I have 7000 records to update. If I can automate this...it'll take seconds....otherwise, it's a months worth of effort.
The Music Manager for Serious Collectors
http://www.mediamonkey.com/forum/
Code: Select all
async function UpdateAuthor(psql, pauthor){
var trcklist;
trcklist = app.db.getTracklist(psql, -1);
await trcklist.whenLoaded();
console.log(`Setting author = ${pauthor} to ${trcklist.count} tracks`);
listForEach(trcklist, (track) => {
track.author = pauthor;
});
try {
await trcklist.commitAsync();
console.log('done');
}
catch (err) {
console.error(err);
}
}
Code: Select all
async function execute() {
await UpdateAuthor(<path>, <name>);
await UpdateAuthor(<path 2>, <name 2>);
await UpdateAuthor(<path 3>, <name 3>);
etc.
}
execute();
Code: Select all
<html class="dialog">
<head>
<title>SQL Editor</title>
<script src="file:///mminit.js"></script>
<script src="dlgSQLEditor.js"></script>
</head>
<body data-posSaveName="dlgSQLEditor" data-defaultSize="1000,800">
<div class="padding fill flex column">
<div data-id="toppanel" class="fill flex column hSeparatorTiny">
<label data-add-colon class="paddingRow">Query</label>
<div data-id="panel" class="stretchWidth flex column hSeparatorTiny" style="height: 150px">
<div data-id="sqlpanel" class="fill" data-control-class="SQLEditor">
</div>
</div>
<label data-add-colon class="paddingRow">Result</label>
<div data-id="resultLV" class="fill scrollable">
</div>
</div>
<div data-control-class="Buttons">
<div data-id="btnExecute" data-position="opposite">Execute</div>
<div data-id="btnExport">Export</div>
<div data-id="btnCancel">Close</div>
</div>
<label data-id="progress" class="statusbar"></label>
</div>
</body>
</html>Code: Select all
var UI;
function OnSQLExec(sql, resultLV) {
resultLV.innerHTML = '';
var tm = Date.now();
UI.btnExecute.controlClass.disabled = true;
UI.progress.innerHTML = 'Running query ...';
app.db.getQueryResultAsync(sql).then(function (res) {
var tmload = Date.now();
var table = '<table class="sqltable"><tr>';
var names = res.names;
var cols = names.count;
var rows = 0;
UI.progress.innerHTML = 'Rendering data ...';
names.locked(function () {
for (var i = 0; i < cols; i++) {
table += '<th>' + names.getValue(i) + '</th>';
}
});
table += '</tr>';
var loop = 0;
var token = {
canceled: false
};
asyncLoop(function () {
loop = 0;
while (loop < 10 && !res.eof) {
table += '<tr>';
for (var i = 0; i < cols; i++) {
table += '<td>' + res.fields.getValue(i) + '</td>';
}
table += '</tr>';
res.next();
rows++;
loop++;
if (rows > 1000) break;
}
return (rows > 1000) || res.eof;
}, 0, token, function () {
resultLV.innerHTML = table;
UI.btnExecute.controlClass.disabled = false;
UI.btnExport.controlClass.disabled = false;
UI.progress.innerHTML = 'Query for ' + rows + ' rows took ' + (tmload - tm) + 'ms (rendering took ' + (Date.now() - tmload) + 'ms)';
});
}, function (err) {
UI.progress.innerHTML = 'Query error "' + err + '"';
UI.btnExecute.controlClass.disabled = false;
UI.btnExport.controlClass.disabled = true;
});
}
function exportToTSV(resultLV) {
var tsv_data = [];
var rows = document.getElementsByTagName('tr');
for (var i = 0; i < rows.length; i++) {
var cols = rows[i].querySelectorAll('td,th');
var tsvrow = [];
for (var j = 0; j < cols.length; j++) {
tsvrow.push(cols[j].innerHTML);
}
tsv_data.push(tsvrow.join("\t"));
}
tsv_data = tsv_data.join('\n');
app.utils.dialogSaveFile('%USERPROFILE%\desktop', 'tsv', 'TSV (*.tsv)|*.tsv|All files (*.*)|*.*', _('Exporting') + '...', 'mm5_output.tsv').then(function (resfilename) {
if (resfilename != '') {
app.filesystem.saveTextToFileAsync(resfilename, tsv_data);
}
})
}
function init(params) {
var wnd = this;
wnd.title = _('SQL editor');
UI = getAllUIElements();
UI.btnExport.controlClass.disabled = true;
localListen(UI.btnExecute, 'click', () => {
OnSQLExec(UI.sqlarea.value, UI.resultLV);
});
localListen(UI.btnExport, 'click', () => {
exportToTSV(UI.resultLV);
});
}I would be one of those, thanks.