alasql
Version:
AlaSQL.js - JavaScript SQL database library for relational and graph data manipulation with support of localStorage, IndexedDB, and Excel
155 lines (131 loc) • 4.39 kB
JavaScript
/*
//
// ALTER TABLE for Alasql.js
// Date: 03.11.2014
// (c) 2014, Andrey Gershun
//
*/
// ALTER TABLE table1 RENAME TO table2
yy.AlterTable = function (params) { return yy.extend(this, params); }
yy.AlterTable.prototype.toString = function() {
var s = 'ALTER TABLE '+this.table.toString();
if(this.renameto) s += ' RENAME TO '+this.renameto;
return s;
}
yy.AlterTable.prototype.execute = function (databaseid, params, cb) {
var db = alasql.databases[databaseid];
db.dbversion = Date.now();
if(this.renameto) {
var oldtableid = this.table.tableid;
var newtableid = this.renameto;
var res = 1;
if(db.tables[newtableid]) {
throw new Error("Can not rename a table '"+oldtableid+"' to '"
+newtableid+"', because the table with this name already exists");
} else if(newtableid == oldtableid) {
throw new Error("Can not rename a table '"+oldtableid+"' to itself");
} else {
db.tables[newtableid] = db.tables[oldtableid];
delete db.tables[oldtableid];
res = 1;
};
if(cb) cb(res)
return res;
} else if(this.addcolumn) {
var db = alasql.databases[this.table.databaseid || databaseid];
db.dbversion++;
var tableid = this.table.tableid;
var table = db.tables[tableid];
var columnid = this.addcolumn.columnid;
if(table.xcolumns[columnid]) {
throw new Error('Cannot add column "'+columnid+'", because it already exists in the table "'+tableid+'"');
}
var col = {
columnid:columnid,
dbtypeid:this.dbtypeid,
dbsize:this.dbsize,
dbprecision:this.dbprecision,
dbenum:this.dbenum,
defaultfns: null // TODO defaultfns!!!
};
var defaultfn = function(){};
table.columns.push(col);
table.xcolumns[columnid] = col;
for(var i=0, ilen=table.data.length; i<ilen; i++) {
// console.log(table.data[i][columnid]);
table.data[i][columnid] = defaultfn();
}
// TODO
return 1;
} else if(this.modifycolumn) {
var db = alasql.databases[this.table.databaseid || databaseid];
db.dbversion++;
var tableid = this.table.tableid;
var table = db.tables[tableid];
var columnid = this.modifycolumn.columnid;
if(!table.xcolumns[columnid]) {
throw new Error('Cannot modify column "'+columnid+'", because it was not found in the table "'+tableid+'"');
}
var col = table.xcolumns[columnid];
col.dbtypeid = this.dbtypeid;
col.dbsize = this.dbsize;
col.dbprecision = this.dbprecision;
col.dbenum = this.dbenum;
// TODO
return 1;
} else if(this.renamecolumn) {
var db = alasql.databases[this.table.databaseid || databaseid];
db.dbversion++;
var tableid = this.table.tableid;
var table = db.tables[tableid];
var columnid = this.renamecolumn;
var tocolumnid = this.to;
var col;
if(!table.xcolumns[columnid]) {
throw new Error('Column "'+columnid+'" is not found in the table "'+tableid+'"');
}
if(table.xcolumns[tocolumnid]) {
throw new Error('Column "'+tocolumnid+'" already exists in the table "'+tableid+'"');
}
if(columnid != tocolumnid) {
for(var j=0; j<table.columns.length; j++) {
if(table.columns[j].columnid == columnid) {
table.columns[j].columnid = tocolumnid;
}
};
table.xcolumns[tocolumnid]=table.xcolumns[columnid];
delete table.xcolumns[columnid];
for(var i=0, ilen=table.data.length; i<ilen; i++) {
// console.log(table.data[i][columnid]);
table.data[i][tocolumnid] = table.data[i][columnid];
delete table.data[i][columnid];
}
return table.data.length;
}
else return 0;
} else if(this.dropcolumn) {
var db = alasql.databases[this.table.databaseid || databaseid];
db.dbversion++;
var tableid = this.table.tableid;
var table = db.tables[tableid];
var columnid = this.dropcolumn;
var found = false;
for(var j=0; j<table.columns.length; j++) {
if(table.columns[j].columnid == columnid) {
found = true;
table.columns.splice(j,1);
break;
}
};
if(!found) {
throw new Error('Cannot drop column "'+columnid+'", because it was not found in the table "'+tableid+'"');
}
delete table.xcolumns[columnid];
for(var i=0, ilen=table.data.length; i<ilen; i++) {
delete table.data[i][columnid];
}
return table.data.length;
} else {
throw Error('Unknown ALTER TABLE method');
}
};