alasql
Version:
AlaSQL.js - JavaScript SQL database library for relational and graph data manipulation with support of localStorage, IndexedDB, and Excel
185 lines (167 loc) • 5.4 kB
JavaScript
/*
//
// UPDATE for Alasql.js
// Date: 03.11.2014
// Modified: 16.11.2014
// (c) 2014, Andrey Gershun
//
*/
// CREATE DATABASE databaseid
yy.CreateDatabase = function (params) { return yy.extend(this, params); };
yy.CreateDatabase.prototype.toString = function() {
var s = K('CREATE');
if(this.engineid) s+=' '+L(this.engineid);
s += ' '+K('DATABASE');
if(this.ifnotexists) s += ' '+K('IF')+' '+K('NOT')+' '+K('EXISTS');
s += ' '+L(this.databaseid);
if(this.args && this.args.length > 0) {
s += '('+this.args.map(function(arg){ return arg.toString()}).join(', ')+')';
}
if(this.as) s += ' '+K('AS')+' '+L(this.as);
return s;
}
//yy.CreateDatabase.prototype.compile = returnUndefined;
yy.CreateDatabase.prototype.execute = function (databaseid, params, cb) {
// console.log(alasql.useid, databaseid, this.databaseid);
// console.trace();
var args;
if(this.args && this.args.length > 0) {
args = this.args.map(function(arg){
return new Function('params','return '+arg.toJavaScript())(params);
});
};
if(this.engineid) {
var res = alasql.engines[this.engineid].createDatabase(this.databaseid, this.args, this.ifnotexists, this.as, cb);
return res;
} else {
var dbid = this.databaseid;
if(alasql.databases[dbid]) {
throw new Error("Database '"+dbid+"' already exists")
};
var a = new alasql.Database(dbid);
var res = 1;
if(cb) return cb(res);
return res;
}
};
// CREATE DATABASE databaseid
yy.AttachDatabase = function (params) { return yy.extend(this, params); };
yy.AttachDatabase.prototype.toString = function() {
var s = K('ATTACH');
if(this.engineid) s += ' '+L(this.engineid);
s += ' '+K('DATABASE')+' '+L(this.databaseid);
// TODO add params
if(args) {
s += '(';
if(args.length>0) {
s += args.map(function(arg){ return arg.toString(); }).join(', ');
}
s += ')';
}
if(this.as) s+= ' '+K('AS')+' '+L(this.as);
return s;
}
//yy.CreateDatabase.prototype.compile = returnUndefined;
yy.AttachDatabase.prototype.execute = function (databaseid, params, cb) {
// console.log(alasql.useid, databaseid, this.databaseid);
// console.trace();
if(!alasql.engines[this.engineid]) {
throw new Error('Engine "'+this.engineid+'" is not defined.');
};
var res = alasql.engines[this.engineid].attachDatabase(this.databaseid, this.as, this.args, params, cb);
return res;
};
// CREATE DATABASE databaseid
yy.DetachDatabase = function (params) { return yy.extend(this, params); };
yy.DetachDatabase.prototype.toString = function() {
var s = K('DETACH');
s += ' '+K('DATABASE')+' '+L(this.databaseid);
return s;
}
//yy.CreateDatabase.prototype.compile = returnUndefined;
yy.DetachDatabase.prototype.execute = function (databaseid, params, cb) {
// console.log(alasql.useid, databaseid, this.databaseid);
// console.trace();
if(!alasql.databases[this.databaseid].engineid) {
throw new Error('Cannot detach database "'+this.engineid+'", because it was not attached.');
};
var res;
var dbid = this.databaseid;
if(dbid == alasql.DEFAULTDATABASEID) {
throw new Error("Drop of default database is prohibited");
}
// console.log(dbid);
if(!alasql.databases[dbid]) {
if(!this.ifexists) {
throw new Error("Database '"+dbid+"' does not exist");
} else {
res = 0;
}
} else {
delete alasql.databases[dbid];
if(dbid == alasql.useid) {
alasql.use();
}
res = 1;
}
if(cb) cb(res);
return res;
// var res = alasql.engines[this.engineid].attachDatabase(this.databaseid, this.as, cb);
// return res;
};
// USE DATABSE databaseid
// USE databaseid
yy.UseDatabase = function (params) { return yy.extend(this, params); };
yy.UseDatabase.prototype.toString = function() {
return K('USE') +' '+K('DATABASE')+' '+L(this.databaseid);
}
//yy.UseDatabase.prototype.compile = returnUndefined;
yy.UseDatabase.prototype.execute = function (databaseid, params, cb) {
var dbid = this.databaseid;
if(!alasql.databases[dbid]) {
throw new Error("Database '"+dbid+"' does not exist")
};
alasql.use(dbid);
var res = 1;
if(cb) cb(res);
return res;
};
// DROP DATABASE databaseid
yy.DropDatabase = function (params) { return yy.extend(this, params); }
yy.DropDatabase.prototype.toString = function() {
var s = K('DROP');
if(this.ifexists) s += ' '+K('IF')+' '+K('EXISTS');
s += ' '+K('DATABASE')+' '+L(this.databaseid);
return s;
}
//yy.DropDatabase.prototype.compile = returnUndefined;
yy.DropDatabase.prototype.execute = function (databaseid, params, cb) {
if(this.engineid) {
// console.log(this,this.databaseid, this.ifexists);
return alasql.engines[this.engineid].dropDatabase(this.databaseid, this.ifexists, cb);
}
var res;
var dbid = this.databaseid;
if(dbid == alasql.DEFAULTDATABASEID) {
throw new Error("Drop of default database is prohibited");
}
// console.log(dbid);
if(!alasql.databases[dbid]) {
if(!this.ifexists) {
throw new Error("Database '"+dbid+"' does not exist");
} else {
res = 0;
}
} else {
if(alasql.databases[dbid].engineid) {
throw new Error("Cannot drop database '"+dbid+"', because it is attached. Detach it.");
}
delete alasql.databases[dbid];
if(dbid == alasql.useid) {
alasql.use();
}
res = 1;
}
if(cb) cb(res);
return res;
};