Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthijs Kamstra committed Oct 10, 2023
1 parent 5423838 commit 0ec1248
Show file tree
Hide file tree
Showing 7 changed files with 242 additions and 49 deletions.
Binary file modified docs/28build_orm/bin/neko/index.n
Binary file not shown.
Binary file modified docs/28build_orm/bin/neko/main.sqlite
Binary file not shown.
119 changes: 91 additions & 28 deletions docs/28build_orm/src/Main.hx
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,100 @@ package;

import orm.DBSqlite;
import orm.DataType;
import orm.DataTypeEnum;
import utils.DummyUtil;
import utils.StdUtils;

class Main {
public function new() {
trace('ORM');

var dbName = 'main.sqlite';
var userRow = 'users';
var userTable = 'users';

// "mysql://user:pass@host/dbname",
// "sqlite://test.sqlite"
var db = new DBSqlite(dbName);

var user = DummyUtil.User();

var _User2Obj:User2Obj = {
id2: Data.Type().INTEGER().PRIMARY().AUTOINCREMENT().set(),
username2: Data.Type().TEXT().NOT_NULL().UNIQUE().set(),
password2: Data.Type().TEXT().NOT_NULL().set(),
// // first try ORM
// var _User2Obj = {
// id2: Data.Type().INTEGER().PRIMARY().AUTOINCREMENT().set(),
// username2: Data.Type().TEXT().NOT_NULL().UNIQUE().set(),
// password2: Data.Type().TEXT().NOT_NULL().set(),
// }
// db.init('user2', _User2Obj);
// db.insert('user2', {
// username2: user.name,
// password2: user.password,
// });

// second try ORM
var _User3Obj = {
id3: [DataTypeEnum.INTEGER, DataTypeEnum.PRIMARY, DataTypeEnum.AUTOINCREMENT],
username3: [DataTypeEnum.TEXT, DataTypeEnum.NOT_NULL, DataTypeEnum.UNIQUE],
password3: [DataTypeEnum.TEXT, DataTypeEnum.NOT_NULL],
}
db.init('user2', _User2Obj);
db.insert('user2', {
username2: user.name,
password2: user.password,
db.init2('user3', _User3Obj);
db.insert('user3', {
username3: user.name,
password3: user.password,
});
var rs = db.select('user3');
for (record in (rs : Iterator<Dynamic>)) {
// trace(haxe.Json.stringify(record));
trace('${record.id3}) ${record.username3}, ${record.password3} --> ${haxe.Json.stringify(record)}');
}
// db.query('CREATE TABLE IF NOT EXISTS ${userTable} (

// id INTEGER PRIMARY KEY AUTOINCREMENT,
// username TEXT NOT NULL UNIQUE,
// password TEXT NOT NULL
// );');

// var rs = db.query('INSERT INTO ${userTable} (username, password) VALUES ("${user.name}", "${user.password}");');

// // db.pr

// var rs = db.query('SELECT * FROM ${userTable};');

// trace('-- SELECT * FROM ${userTable}');
// for (record in (rs : Iterator<UserObj>)) {
// trace('${record.id}) ${record.username}, ${record.password} --> ${haxe.Json.stringify(record)}');
// }

// trace(Std.bool(true));
// trace(Std.bool('true'));
// trace(Std.bool(1));
// trace(Std.bool('1'));
// trace(Std.bool(false));
// trace(Std.bool('false'));
// trace(Std.bool(0));
// trace(Std.bool('0'));

var _TestObj:TestObj = {
_id: "fooooo",
id: 2,
text: 'xxxx',
int: 1000,
bool: true,
stringArr: ['one', 'two'],
intArr: [1, 2],
date: Date.now(),
}

db.query('CREATE TABLE IF NOT EXISTS ${userRow} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL
);');

var rs = db.query('INSERT INTO ${userRow} (username, password) VALUES ("${user.name}", "${user.password}");');

// db.pr

var rs = db.query('SELECT * FROM ${userRow};');
var testObj = new TestObjTable();
testObj.text = "Hello, SQLite!";
testObj.int = 42;
testObj.bool = true;
// testObj.stringArr = haxe.Json.stringify(["item1", "item2", "item3"]);
// testObj.intArr = haxe.Json.stringify([1, 2, 3]);
testObj.array = ["item1", "item2", "item3"];
testObj.array = [1, 2, 3];
testObj.date = Date.now();

trace('-- SELECT * FROM ${userRow}');
for (record in (rs : Iterator<UserObj>)) {
trace('${record.id}) ${record.username}, ${record.password} --> ${haxe.Json.stringify(record)}');
}
db.init3('test01', _TestObj);

db.close();

Expand All @@ -63,8 +115,19 @@ typedef UserObj = {
password:String,
}

typedef User2Obj = {
id2:String,
username2:String,
password2:String,
// typedef User2Obj = {
// id2:String,
// username2:String,
// password2:String,
// }

typedef TestObj = {
@:optional var _id:String;
var id:Int;
var text:String;
var int:Int;
var bool:Bool;
var stringArr:Array<String>;
var intArr:Array<Int>;
var date:Date;
}
68 changes: 68 additions & 0 deletions docs/28build_orm/src/TestObjTable.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
class TestObjTable {
@:isVar private var id(default, null):Int = 0; // SQLite INTEGER PRIMARY KEY (auto-increment)

@:isVar public var text(get, set):String;

// public var int(get, set):Int = 0;
@:isVar public var int(get, set):Int;
// public var bool(get, set):Bool = false;
@:isVar public var bool(get, set):Bool;

@:isVar public var array(get, set):Array<Dynamic>;

// public var stringArr(get, set):String = ""; // Opslaan als JSON-string in SQLite
// public var intArr(get, set):String = ""; // Opslaan als JSON-string in SQLite
// public var date(get, set):String = ""; // Opslaan als tekst in SQLite
@:isVar public var date(get, set):String;

// public var _id(default, SqlId):Int = 0; // SQLite INTEGER PRIMARY KEY (auto-increment)
// public var id(default, SqlInt):Int = 0;
// public var text(default, SqlText):String = "";
// public var int(default, SqlInt):Int = 0;
// public var bool(default, SqlBool):Bool = false;
// public var stringArr(default, SqlText):String = ""; // Opslaan als JSON-string in SQLite
// public var intArr(default, SqlText):String = ""; // Opslaan als JSON-string in SQLite
// public var date(default, SqlText):String = ""; // Opslaan als tekst in SQLite

public function new() {}

function get_text():String {
return text;
}

function set_text(value:String):String {
return text = value;
}

function get_array():Array<Dynamic> {
return array;
}

function set_array(value:Array<Dynamic>):Array<Dynamic> {
return array = value;
}

function get_bool():Bool {
return bool;
}

function set_bool(value:Bool):Bool {
return bool = value;
}

function get_int():Int {
return int;
}

function set_int(value:Int):Int {
return int = value;
}

function get_date():String {
return date;
}

function set_date(value:Date):String {
return date = DateTools.format(value, 'YYYY-MM-DD HH:MM:SS.SSS');
}
}
80 changes: 59 additions & 21 deletions docs/28build_orm/src/orm/DBSqlite.hx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package orm;

import haxe.Exception;
import haxe.iterators.RestKeyValueIterator;
import orm.IDB;
import sys.db.Connection;
import sys.db.ResultSet;
Expand All @@ -17,7 +18,7 @@ class DBSqlite implements IDB {
}

public function query(sql:String):ResultSet {
trace('query (${sql})');
trace('query -- "${sql}"');
var r = null;
try {
r = connection.request(sql);
Expand All @@ -27,63 +28,100 @@ class DBSqlite implements IDB {
return r;
}

public function select(table:String):ResultSet {
return this.query('SELECT * FROM ${table};');
}

/**
* [Description]
* @param table
* @param arg
*/
public function insert(table:String, arg:{}) {
trace(Type.typeof(arg));
var columns = '';
var values = '';
for (key in Reflect.fields(arg)) {
trace("Key: " + key + ", Value: " + Reflect.field(arg, key));
// trace("Key: " + key + ", Value: " + Reflect.field(arg, key));
columns += '${key},';
values += '"${Reflect.field(arg, key)}",';
trace(Type.typeof(values));
}

if (columns.endsWith(',')) {
columns = columns.substring(0, columns.length - 1);
}
if (values.endsWith(',')) {
values = values.substring(0, values.length - 1);
}
columns = columns.substring(0, columns.length - 1);
values = values.substring(0, values.length - 1);
this.query('INSERT INTO ${table} (${columns}) VALUES (${values});');
}

/**
* [Description]
* @param row
* @param table
* @param arg
*/
public function init(table:String, arg:{}) {
trace(Type.typeof(arg));
// Loop through the JSON object and print key-value pairs
var str = '';
for (key in Reflect.fields(arg)) {
trace("Key: " + key + ", Value: " + Reflect.field(arg, key));
str += '${key} ${Reflect.field(arg, key)},';
}

if (str.endsWith(',')) {
str = str.substring(0, str.length - 1);
var value = Reflect.field(arg, key);
trace("Key: " + key + ", Value: " + value);
str += '${key} ${value},';
trace(Type.typeof(value));
}
str = str.substring(0, str.length - 1);
this.query('CREATE TABLE IF NOT EXISTS ${table} (${str});');
}

public function init2(table:String, arg:{}) {
trace(Type.typeof(arg));
// Loop through the JSON object and print key-value pairs
var str = '';
for (key in Reflect.fields(arg)) {
var value = Reflect.field(arg, key);
trace("Key: " + key + ", Value: " + value);
var arr:Array<String> = cast(value);
str += '${key} ${arr.join(' ')},';
// trace(arr.join(' '));
trace(Type.typeof(arr));
}
str = str.substring(0, str.length - 1);
this.query('CREATE TABLE IF NOT EXISTS ${table} (${str});');
}

public function quote(s:Dynamic):String {
throw new haxe.exceptions.NotImplementedException();
public function init3(table:String, arg:Dynamic) {
trace(Type.typeof(arg));
// Loop through the JSON object and print key-value pairs
var str = '';
for (key in Reflect.fields(arg)) {
var value = Reflect.field(arg, key);
trace("Key: " + key + ", Value: " + value);
// var arr:Array<String> = cast(value);
// str += '${key} ${arr.join(' ')},';
// trace(arr.join(' '));
trace(Type.typeof(value));
// trace(Type.typeof(arr));
}
str = str.substring(0, str.length - 1);
// this.query('CREATE TABLE IF NOT EXISTS ${table} (${str});');
}

public function lastInsertId():Int {
return connection.lastInsertId();
}

public function getTables():Array<String> {
var rows = query("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
return Lambda.array(Lambda.map(rows.results(), function(row) return row.name));
}

public function close():Void {
try {
connection.close();
} catch (_:Dynamic) {}
connection = null;
}

public function getTables():Array<String> {
var rows = query("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name");
return Lambda.array(Lambda.map(rows.results(), function(row) return row.name));
public function quote(s:Dynamic):String {
throw new haxe.exceptions.NotImplementedException();
}

public function getFields(table:String):Array<DbTableFieldData> {
Expand Down
10 changes: 10 additions & 0 deletions docs/28build_orm/src/orm/DataTypeEnum.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package orm;

enum abstract DataTypeEnum(String) {
var INTEGER = "INTEGER";
var PRIMARY = "PRIMARY KEY";
var AUTOINCREMENT = "AUTOINCREMENT";
var TEXT = "TEXT";
var NOT_NULL = "NOT NULL";
var UNIQUE = "UNIQUE";
}
14 changes: 14 additions & 0 deletions docs/28build_orm/src/utils/StdUtils.hx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package utils;

class Std extends std.Std {
public static function bool(v:Dynamic):Bool {
return v != false
&& v != null
&& v != 0
&& v != ""
&& v != "0"
&& (!Std.isOfType(v, String)
|| cast(v, String).toLowerCase() != "false"
&& cast(v, String).toLowerCase() != "off" && cast(v, String).toLowerCase() != "null");
}
}

0 comments on commit 0ec1248

Please sign in to comment.