From e5152b2bc5240ae09cbe537209c896d96fb890fe Mon Sep 17 00:00:00 2001 From: Anton Nesterov Date: Fri, 16 Aug 2024 06:18:45 +0200 Subject: [PATCH] [doc] initial docs Signed-off-by: Anton Nesterov --- README.md | 3 + dal/Builder.ts | 37 ++++++++-- dal/Protocol.ts | 21 +++++- doc/dal-internals.jpg | Bin 0 -> 91264 bytes doc/dal-internals.md | 160 ++++++++++++++++++++++++++++++++++++++++++ doc/dal-internals.pdf | Bin 0 -> 37765 bytes 6 files changed, 211 insertions(+), 10 deletions(-) create mode 100644 doc/dal-internals.jpg create mode 100644 doc/dal-internals.md create mode 100644 doc/dal-internals.pdf diff --git a/README.md b/README.md index bf07984..b28a729 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ Data Accees Layer for SQL databases written in Go. + +## NodeJs Client + Mongodb inspired query interface: ```typescript diff --git a/dal/Builder.ts b/dal/Builder.ts index 0b30543..1916a03 100644 --- a/dal/Builder.ts +++ b/dal/Builder.ts @@ -1,5 +1,5 @@ -import type { Request } from "./Protocol"; -import { METHODS, encodeRequest, decodeRowsIterator } from "./Protocol"; +import type { Request, ExecResult } from "./Protocol"; +import { METHODS, encodeRequest, decodeResponse, decodeRowsIterator } from "./Protocol"; type Primitive = string | number | boolean | null; @@ -18,11 +18,13 @@ interface Filter extends Record { $between?: [Primitive, Primitive]; $nbetween?: [Primitive, Primitive]; } + interface FindFilter { [key: string]: Primitive | Filter | Filter[] | undefined; } type JoinCondition = "inner" | "left" | "cross" | "full outer"; + type JoinFilter = { $for: string; $do: FindFilter; @@ -34,6 +36,7 @@ type SortOptions = Record; type Options = { database: string; url: string; + headers?: Record; }; export default class Builder any> { @@ -42,6 +45,7 @@ export default class Builder any> { private dtoTemplate: new (...args: any) => any = Object; private methodCalls: Map = new Map(); // one call per method private headerRow: unknown[] | null = null; + private httpHeaders: Record = {}; constructor(opts: Options) { this.request = { id: 0, @@ -49,6 +53,9 @@ export default class Builder any> { commands: [], }; this.url = opts.url; + if (opts.headers) { + this.httpHeaders = opts.headers; + } } private formatRequest(): void { this.request.commands = []; @@ -143,6 +150,10 @@ export default class Builder any> { this.methodCalls.set("Tx", []); return this; } + As any>(template: T): Builder { + this.dtoTemplate = template; + return this; + } async *Rows>(): AsyncGenerator { this.formatRequest(); const response = await fetch(this.url, { @@ -150,12 +161,12 @@ export default class Builder any> { body: new Blob([encodeRequest(this.request)]), headers: { "Content-Type": "application/x-msgpack", + ...this.httpHeaders, }, }); if (response.status !== 200) { throw new Error(await response.text()); } - const iterator = decodeRowsIterator(response.body!); for await (const row of iterator) { if (this.headerRow === null) { @@ -166,10 +177,6 @@ export default class Builder any> { yield this.formatRow(row.r); } } - As any>(template: T): Builder { - this.dtoTemplate = template; - return this; - } async Query>(): Promise { const rows = this.Rows(); const result = []; @@ -178,4 +185,20 @@ export default class Builder any> { } return result; } + async Exec(): Promise { + this.formatRequest(); + const response = await fetch(this.url, { + method: "POST", + body: new Blob([encodeRequest(this.request)]), + headers: { + "Content-Type": "application/x-msgpack", + ...this.httpHeaders, + }, + }); + if (response.status !== 200) { + throw new Error(await response.text()); + } + const buf = await response.arrayBuffer(); + return decodeResponse(new Uint8Array(buf)); + } } diff --git a/dal/Protocol.ts b/dal/Protocol.ts index 069aef5..4623504 100644 --- a/dal/Protocol.ts +++ b/dal/Protocol.ts @@ -11,17 +11,32 @@ export interface Request { commands: Method[]; } +export interface ExecResult { + Id: number; + RowsAffected: number; + LastInsertId: number; +} + +interface Row { + r: unknown[]; +} + export const METHODS = "In|Find|Select|Fields|Join|Group|Sort|Limit|Offset|Delete|Insert|Set|Update|OnConflict|DoUpdate|DoNothing|Tx".split( "|", - ); +); export function encodeRequest(request: Request): Uint8Array { return encode(request); } -export interface Row { - r: unknown[]; +export function decodeResponse(input: Uint8Array): ExecResult { + const res = decode(input) as {i: number; ra: number; li: number}; + return { + Id: res.i, + RowsAffected: res.ra, + LastInsertId: res.li, + }; } const ROW_TAG = [0x81, 0xa1, 0x72]; diff --git a/doc/dal-internals.jpg b/doc/dal-internals.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aaabbc1a819cb657e0432f440b13136a4832100a GIT binary patch literal 91264 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 literal 0 HcmV?d00001 diff --git a/doc/dal-internals.md b/doc/dal-internals.md new file mode 100644 index 0000000..8c3f1b4 --- /dev/null +++ b/doc/dal-internals.md @@ -0,0 +1,160 @@ +# DAL Internal Architecture + +- The Client is written in TypeScript. +- The DAL server written in Golang. + +## Components + +(Top to bottom) + +- NodeJS Client +- Protocol +- Builder +- DB Adapter + +## NodeJs Client + +Client consists of a query builder and protocol decoder/encoder. + +- Query Builder is a light builder which constructs the query object for the server. +- Protocol is a decoder/encoder that utilizes messagepack. + +```bash +------------------ +|- dal + |- Builder.ts + |- Protocol.ts + |_ index.ts +|... +``` + +## Protocol + + +Protocol utilizes messagepack for encoding and decoding the messages. + +There following types of encoded data: +- Row stream +- Query (request) +- Response (exec result) + +Locations: + +```bash +------------------ +|- dal + |- Protocol.ts +|_... +|- pkg + |- proto + |... +|... +``` + +### Row Stream + +- The server sends streaming (chunked) data to the client, every chunk is a row. +- Every row starts with a 3-byte header `{0x81, 0xa1, 0x72}` +- The first row is the header row, which contains the column names. + +Parsing the row stream (pseudo code): + +```python +header = [0x81, 0xa1, 0x72] +input: byte[] = ... +buffer: byte[] = [] +output: byte[][] = [] +while i < input.length: + if input[i] != 0x81: + buffer << input[i] + i += 1 + else if input[i:3] == header: + output << header + buffer + buffer = [] + i += 3 +output << header + buffer +``` + +MessagePack schema for the row stream: +```go +type Row struct { + Data []interface{} `msg:"r"` +} +// { r: [] } +``` + +### Query + +- The client utilizes a "light builder" which prepares a list of callbacks for the SQL query builder. +- The Query consits of the following fields: + - Id: uint32 (optional) + - Db: string (required, database name) + - Commands: []BuilderMethod (required, list of Builder arguments) + + + +```go +type BuilderMethod struct { + Method string `msg:"method"` + Args []interface{} `msg:"args"` +} + +type Request struct { + Id uint32 `msg:"id"` + Db string `msg:"db"` + Commands []BuilderMethod `msg:"commands"` +} +``` + +### Response +The response is inteneded for operation results that don't return rows. + +```go +type Response struct { + Id uint32 `msg:"i"` + RowsAffected int64 `msg:"ra"` + LastInsertId int64 `msg:"li"` +} +``` + +## Builder + +The builder is a set of methods that are used to construct the SQL query. + +- The sql query is constructed by the server. +- The client utilizes a "light builder" which prepares a list of callbacks for the server builer. + +Locations: + +```bash +------------------ +|- dal + |- Builder.ts +|_... +|- pkg + |- builder + |... + |- filters + |... +|... +``` + +### Builder Methods +In|Find|Select|Fields|Join|Group|Sort|Limit|Offset|Delete|Insert|Set|Update|OnConflict|DoUpdate|DoNothing +[TS Docs]() +[Golang Docs]() + +## DB Adapter + +- Adapter provides the interface for the database driver. +- Adapter package also provides utilitities for specific SQL Dialects. + +Locations: + +```bash +------------------ +|- pkg + |- Adapter + |... +|... +``` \ No newline at end of file diff --git a/doc/dal-internals.pdf b/doc/dal-internals.pdf new file mode 100644 index 0000000000000000000000000000000000000000..182f2862fc40b76536378dcc17fc9295b69fbe0d GIT binary patch literal 37765 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%0AY%*;Wnl{T;kZhdO+fa}zzATl@-MZU;G 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