First Working Version #1

Merged
jusax23 merged 14 commits from dev into main 2023-02-14 23:33:55 +01:00
6 changed files with 133 additions and 19 deletions
Showing only changes of commit 6f97f42d49 - Show all commits

1
.gitignore vendored
View file

@ -1,3 +1,4 @@
dist dist
node_modules node_modules
ltests ltests
sqlsave

View file

@ -1,7 +1,8 @@
import mariadb from 'mariadb'; import mariadb from 'mariadb';
import { Datatype } from './dbStructure';
import { Handler } from './defaultHandler'; import { Handler } from './defaultHandler';
import { Query } from './query'; import { Query } from './query';
import { onAction, primaryData } from './types'; import { attributeSettings, onAction, primaryData } from './types';
export class DB { export class DB {
@ -23,8 +24,15 @@ export class DB {
export class Attribute { export class Attribute {
name: string; name: string;
constructor(name: string) { ops: attributeSettings;
type: Datatype;
constructor(name: string, type: Datatype, ops: attributeSettings) {
this.name = name; this.name = name;
this.ops = ops;
this.type = type;
}
serializeDatatype(){
return this.type.serialize();
} }
serialize() { serialize() {
return this.toString(); return this.toString();
@ -48,19 +56,8 @@ export class Table {
toString() { toString() {
return this.dbLangTableName; return this.dbLangTableName;
} }
addAttribute(name: string, ops: { addAttribute(name: string, type: Datatype, ops: attributeSettings, noErrorOnNameConflict = false) {
unique?: boolean, let attr = new Attribute(name,type,ops);
A_I?: boolean,
default?: primaryData,
notNull?: boolean
primaryKey?: boolean,
foreginKey?: {
link: Attribute,
onDelete?: onAction,
onUpdate?: onAction
}
}, noErrorOnNameConflict = false) {
let attr = new Attribute(name);
this.dbLangTableAttributes[name] = attr; this.dbLangTableAttributes[name] = attr;
if (["serialize", "toString", "addAttribute", "dbLangTableName", "dbLangTableAttributes"].includes(name)) { if (["serialize", "toString", "addAttribute", "dbLangTableName", "dbLangTableAttributes"].includes(name)) {
if (!noErrorOnNameConflict) throw new Error("You cannot name Attribute like Methode of this Table!"); if (!noErrorOnNameConflict) throw new Error("You cannot name Attribute like Methode of this Table!");

View file

@ -2,7 +2,17 @@ import { Attribute } from "./db";
import { Handler } from "./defaultHandler"; import { Handler } from "./defaultHandler";
import { allModifierInput, primaryData, serializeReturn } from "./types"; import { allModifierInput, primaryData, serializeReturn } from "./types";
export class Datatype{
type: string;
args: primaryData[];
constructor(type:string, args: primaryData[]){
this.type = type;
this.args = args;
}
serialize(handler = Handler): serializeReturn{
return handler.datatypes[this.type as keyof typeof handler.datatypes](this.args);
}
}
export abstract class Modifier { export abstract class Modifier {
t: string; t: string;

View file

@ -58,9 +58,65 @@ export class Handler {
return ["not (?)", [e]]; return ["not (?)", [e]];
} }
} }
static datatypes = {
char: dataTypeSingleNum("char"),
varchar: dataTypeSingleNum("varchar"),
binary: dataTypeSingleNum("binary"),
varbinary: dataTypeSingleNum("varbinary"),
tinyblob: dataTypeNoArg("tinyblob"),
blob: dataTypeNoArg("blob"),
mediumblob: dataTypeNoArg("mediumblob"),
longblob: dataTypeNoArg("longblob"),
tinytext: dataTypeNoArg("tinytext"),
text: dataTypeNoArg("text"),
mediumtext: dataTypeNoArg("mediumtext"),
longtext: dataTypeNoArg("longtext"),
enum: (a: primaryData[]): serializeReturn =>{
return ["enum("+a.map(()=>"?").join(", ")+")",a];
},
set: (a: primaryData[]): serializeReturn =>{
return ["set("+a.map(()=>"?").join(", ")+")",a];
},
bool: dataTypeNoArg("bool"),
bit: dataTypeNoArg("bit"),
tinyint: dataTypeNoArg("tinyint"),
smallint: dataTypeNoArg("smallint"),
mediumint: dataTypeNoArg("mediumint"),
int: dataTypeNoArg("int"),
bigint: dataTypeNoArg("bigint"),
float: dataTypeDblNum("float"),
double: dataTypeDblNum("double"),
decimal: dataTypeDblNum("decimal"),
data: dataTypeNoArg("data"),
datatime: dataTypeNoArg("datatime"),
timestamp: dataTypeNoArg("timestamp"),
time: dataTypeNoArg("time"),
year: dataTypeNoArg("year"),
}
}; };
function dataTypeNoArg(type:string){
return (a : primaryData[]): serializeReturn =>{
return [type,[]];
}
}
function dataTypeSingleNum(type:string){
return (a : primaryData[]): serializeReturn =>{
return [type+"(?)",[a[0]]];
}
}
function dataTypeDblNum(type:string){
return (a : primaryData[]): serializeReturn =>{
return [type+"(?,?)",[a[0],a[1]]];
}
}
function joinArg(type: string, s: any) { function joinArg(type: string, s: any) {
return (a: (allModifierInput)[]): serializeReturn => { return (a: (allModifierInput)[]): serializeReturn => {
let args: primaryData[] = []; let args: primaryData[] = [];

View file

@ -1,7 +1,7 @@
import { Attribute } from "./db"; import { Attribute } from "./db";
import { Aggregation, BooleanModifier, NumberModifier } from "./dbStructure"; import { Aggregation, BooleanModifier, Datatype, NumberModifier } from "./dbStructure";
import { selectQuery } from "./query"; import { selectQuery } from "./query";
import { allModifierInput, selectElements, selectFromElements } from "./types"; import { allModifierInput, primaryData, selectElements, selectFromElements } from "./types";
//modifiers //modifiers
export const and = (...args: (BooleanModifier)[]) => new BooleanModifier("and", args); export const and = (...args: (BooleanModifier)[]) => new BooleanModifier("and", args);
@ -20,3 +20,41 @@ export const max = (a: Attribute) => new Aggregation("max", a);
//query //query
export const select = (args: selectElements[], from: selectFromElements) => new selectQuery(args, from); export const select = (args: selectElements[], from: selectFromElements) => new selectQuery(args, from);
//datatypes
export const CHAR = (size:number) => new Datatype("char",[size]);
export const VARCHAR = (size:number) => new Datatype("varchar",[size]);
export const BINARY = (size:number) => new Datatype("binary",[size]);
export const VARBINARY = (size:number) => new Datatype("varbinary",[size]);
export const TINYBLOB = new Datatype("tinyblob",[]);
export const BLOB = new Datatype("blob",[]);
export const MEDIUMBLOB = new Datatype("mediumblob",[]);
export const LONGBLOB = new Datatype("longblob",[]);
export const TINYTEXT = new Datatype("tinytext",[]);
export const TEXT = new Datatype("text",[]);
export const MEDIUMTEXT = new Datatype("mediumtext",[]);
export const LONGTEXT = new Datatype("longtext",[]);
export const ENUM = (values:string[]) => new Datatype("enum",values);
export const SET = (values:string[]) => new Datatype("set",values);
export const BOOL = new Datatype("bool",[]);
export const BIT = new Datatype("bit",[]);
export const TINYINT = new Datatype("tinyint",[]);
export const SMALLINT = new Datatype("smallint",[]);
export const MEDIUMINT = new Datatype("mediumint",[]);
export const INT = new Datatype("int",[]);
export const BIGINT = new Datatype("bigint",[]);
export const FLOAT = (size:number,d:number) => new Datatype("float",[size,d]);
export const DOUBLE = (size:number,d:number) => new Datatype("double",[size,d]);
export const DECIMAL = (size:number,d:number) => new Datatype("decimal",[size,d]);
export const DATA = new Datatype("data",[]);
export const DATATIME = new Datatype("datatime",[]);
export const TIMESTAMP = new Datatype("timestamp",[]);
export const TIME = new Datatype("time",[]);
export const YEAR = new Datatype("year",[]);

View file

@ -10,6 +10,18 @@ export type selectFromElements = Table | Joins | null;
export type serializeReturn = [string, primaryData[]]; export type serializeReturn = [string, primaryData[]];
export type attributeSettings = {
unique?: boolean,
A_I?: boolean,
default?: primaryData,
notNull?: boolean
primaryKey?: boolean,
foreginKey?: {
link: Attribute,
onDelete?: onAction,
onUpdate?: onAction
}
};
export enum onAction { export enum onAction {
cascade, cascade,