class SeafowlDatabase {
constructor({
host = "https://demo.seafowl.io",
}) {
this.host = host;
}
async sql(strings, ...args) {
console.log(strings);
console.log(args);
const result = [strings[0]];
args.forEach((val, i) => {
result.push(quote(val), strings[i + 1]);
});
const interpolatedQuery = result.join("");
console.log(interpolatedQuery);
return await querySeafowl(interpolatedQuery, this.host);
}
async describeTables(schema, database) {
let clauses = [];
let args = [];
let queryFragments = ["SELECT table_catalog AS database, table_schema AS schema, table_name AS name FROM information_schema.tables"];
if (schema) {
args.push(schema);
clauses.push("table_schema = ");
}
if (database) {
args.push(database);
clauses.push("table_catalog = ");
}
if (clauses.length) {
queryFragments[0] += " WHERE " + clauses[0];
clauses.slice(1).forEach((clause) => {
queryFragments.push(" AND " + clause);
});
}
console.log(queryFragments);
return await this.sql(queryFragments, ...args);
}
async describeColumns({
table,
schema = "public",
database = "default"
}) {
console.log(table);
let args = [table, schema, database];
let results = await this.sql`SELECT column_name AS name, data_type AS \"databaseType\", is_nullable AS nullable FROM information_schema.columns WHERE table_name = ${table} AND table_schema = ${schema} AND table_catalog = ${database} ORDER BY ordinal_position ASC`;
results.forEach(col => col.type = getObservableType(col.databaseType));
return results;
}
}