tools/awps-tunnel/server/dataRepo.ts (134 lines of code) (raw):
import * as sqlite3 from "sqlite3";
import { printer } from "./output";
// Define your data model classes here (similar to the C# classes)
interface HttpRequestDetail {
TracingId?: number;
MethodName: string;
Url: string;
RequestRaw: string;
RequestAt: number;
}
interface HttpResponseDetail {
Error?: string;
Code?: number;
ResponseRaw?: string;
RespondAt?: number;
}
interface HttpDataModel {
Id?: number;
Request: HttpRequestDetail;
Response?: HttpResponseDetail;
}
export class DataRepo {
private db: sqlite3.Database;
constructor(private databaseFile: string) {
const db = (this.db = new sqlite3.Database(databaseFile));
// Create a table if it doesn't exist
db.serialize(() => {
db.run(`
CREATE TABLE IF NOT EXISTS HttpItems (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Request TEXT,
Response TEXT
)
`);
});
}
public updateDataAsync(id: number, response: string): Promise<void> {
return new Promise<void>((resolve, reject) => {
const stmt = this.db.prepare("UPDATE HttpItems SET Response = ? WHERE Id = ?");
// Bind the values to the placeholders
stmt.run(response, id, function (err: { message: string }) {
if (err) {
reject(err);
return;
}
// Finalize the statement
stmt.finalize(function (finalizeErr) {
if (finalizeErr) {
reject(finalizeErr);
} else {
resolve();
}
});
});
});
}
public clearDataAsync(): Promise<void> {
return new Promise<void>((resolve, reject) => {
const stmt = this.db.prepare("DELETE FROM HttpItems");
// Bind the values to the placeholders
stmt.run(function (err: { message: string }) {
if (err) {
reject(err);
return;
}
// Finalize the statement
stmt.finalize(function (finalizeErr) {
if (finalizeErr) {
reject(finalizeErr);
} else {
resolve();
}
});
});
});
}
public insertDataAsync(data: HttpDataModel): Promise<number> {
return new Promise<number>((resolve, reject) => {
const stmt = this.db.prepare("INSERT INTO HttpItems (Request, Response) VALUES (?, ?)");
// Bind the values to the placeholders
stmt.run(JSON.stringify(data.Request), JSON.stringify(data.Response), function (err: { message: string }) {
if (err) {
reject(err);
return;
}
const id = (stmt as sqlite3.RunResult).lastID;
// Finalize the statement
stmt.finalize(function (finalizeErr) {
if (finalizeErr) {
reject(finalizeErr);
} else {
resolve(id);
}
});
});
});
}
// Function to retrieve data from the database
public getDataAsync(id: number): Promise<HttpDataModel | undefined> {
return new Promise((resolve, reject) => {
this.db.get("SELECT * FROM HttpItems WHERE Id = ?", [id], (err, row: { Id: number; Request: string; Response: string }) => {
if (err) {
reject(err);
return;
}
if (row) {
const data: HttpDataModel = {
Id: row.Id,
Request: JSON.parse(row.Request),
Response: row.Response ? JSON.parse(row.Response) : null,
};
resolve(data);
} else {
resolve(undefined);
}
});
});
}
// Function to retrieve data from the database
public getAsync(count: number): Promise<HttpDataModel[]> {
return new Promise((resolve, reject) => {
this.db.all("SELECT * FROM HttpItems ORDER BY ID DESC LIMIT ?", [count], (err, rows: { Id: number; Request: string; Response: string }[]) => {
if (err) {
reject(err);
return;
}
if (rows) {
resolve(rows.map((row) => ({ Id: row.Id, Request: JSON.parse(row.Request), Response: row.Response ? JSON.parse(row.Response) : null })));
} else {
resolve([]);
}
});
});
}
public dispose() {
this.db.close((err) => {
if (err) {
printer.error(`Error closing the database ${this.databaseFile}: ${err.message}`);
} else {
printer.log(`Database ${this.databaseFile} closed.`);
}
});
}
}