-
Notifications
You must be signed in to change notification settings - Fork 17
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #130 from kevinresol/transactions
Initial attempt to implement transactions
- Loading branch information
Showing
37 changed files
with
795 additions
and
271 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
{ | ||
"version": "4.1.3", | ||
"version": "4.2.1", | ||
"resolveLibs": "scoped" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
# @install: lix --silent download "gh://github.com/haxetink/tink_core#914f3cda113652bfa62226664fae49e17bd1730b" into tink_core/2.0.0-rc.3/github/914f3cda113652bfa62226664fae49e17bd1730b | ||
-cp ${HAXE_LIBCACHE}/tink_core/2.0.0-rc.3/github/914f3cda113652bfa62226664fae49e17bd1730b/src | ||
-D tink_core=2.0.0-rc.3 | ||
# @install: lix --silent download "gh://github.com/haxetink/tink_core#8fb0b9aa4de933614b5a04cc88da871b89cb8c6a" into tink_core/2.0.2/github/8fb0b9aa4de933614b5a04cc88da871b89cb8c6a | ||
-cp ${HAXE_LIBCACHE}/tink_core/2.0.2/github/8fb0b9aa4de933614b5a04cc88da871b89cb8c6a/src | ||
-D tink_core=2.0.2 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,4 @@ | ||
package tink.sql; | ||
|
||
#if macro | ||
import haxe.macro.Expr; | ||
#end | ||
import tink.core.Error; | ||
import tink.sql.Info; | ||
|
||
|
||
@:autoBuild(tink.sql.macros.DatabaseBuilder.build()) | ||
class Database implements DatabaseInfo { | ||
|
||
public var name(default, null):String; | ||
|
||
// To type this correctly we'd need a self type #4474 or unnecessary macros | ||
var cnx:Connection<Dynamic>; | ||
var tables:Map<String, TableInfo>; | ||
var driver:Driver; | ||
|
||
function new(name, driver, tables) { | ||
this.name = name; | ||
this.driver = driver; | ||
this.tables = tables; | ||
} | ||
|
||
public function tableNames():Iterable<String> | ||
return { | ||
iterator: function () return tables.keys() | ||
}; | ||
|
||
public function tableInfo(name:String):TableInfo | ||
return switch tables[name] { | ||
case null: throw new Error(NotFound, 'Table `${this.name}.$name` not found'); | ||
case v: cast v; | ||
} | ||
|
||
macro public function from(ethis:Expr, target:Expr) | ||
return tink.sql.macros.Targets.from(ethis, target, macro $ethis.cnx); | ||
|
||
} | ||
@:genericBuild(tink.sql.Database.build()) | ||
class Database<T> {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
package tink.sql; | ||
|
||
import haxe.macro.Expr; | ||
import haxe.macro.Context; | ||
import tink.macro.BuildCache; | ||
import tink.sql.macros.Helper; | ||
|
||
using tink.MacroApi; | ||
|
||
class Database { | ||
public static function build() { | ||
return BuildCache.getType('tink.sql.Database', (ctx:BuildContext) -> { | ||
final name = ctx.name; | ||
final ct = ctx.type.toComplex(); | ||
final def = macro class $name extends tink.sql.Transaction<$ct> { | ||
public static final INFO = ${Helper.typePathToExpr(switch macro:tink.sql.Transaction<$ct> {case TPath(tp): tp; case _: null;}, ctx.pos)}.INFO; | ||
|
||
public final __name:String; | ||
public final __info:tink.sql.Info.DatabaseInfo; | ||
public final __pool:tink.sql.Connection.ConnectionPool<$ct>; | ||
|
||
public function new(name, driver:tink.sql.Driver) { | ||
super(__pool = driver.open(__name = name, __info = INFO.instantiate(name))); | ||
} | ||
|
||
public inline function getName() return __name; | ||
public inline function getInfo() return __info; | ||
|
||
public function transaction<T>(run:tink.sql.Transaction<$ct>->tink.core.Promise<tink.sql.Transaction.TransactionEnd<T>>):tink.core.Promise<tink.sql.Transaction.TransactionEnd<T>> { | ||
return tink.sql.Transaction.TransactionTools.transaction(__pool, isolated -> run(new tink.sql.Transaction<$ct>(isolated))); | ||
} | ||
} | ||
|
||
// trace(new haxe.macro.Printer().printTypeDefinition(def)); | ||
def.pack = ['tink', 'sql']; | ||
def; | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
package tink.sql; | ||
|
||
@:autoBuild(tink.sql.DatabaseDefinition.build()) | ||
interface DatabaseDefinition {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package tink.sql; | ||
|
||
import haxe.macro.Expr; | ||
import haxe.macro.Context; | ||
import tink.macro.ClassBuilder; | ||
|
||
using tink.MacroApi; | ||
|
||
class DatabaseDefinition { | ||
public static function build() { | ||
final c = new ClassBuilder(); | ||
|
||
for (t in c.target.meta.extract(':tables')) | ||
for (p in t.params) { | ||
var tp = p.toString().asTypePath(); | ||
c.addMember({ | ||
pos: p.pos, | ||
name: switch tp { case { sub: null, name: name } | { sub: name } : name; }, | ||
meta: [{ name: ':table', pos: p.pos, params: [] }], | ||
kind: FVar(TPath(tp)), | ||
}); | ||
} | ||
|
||
for (m in c) if(!m.isStatic) { | ||
function extractMeta(name:String) { | ||
return switch (m:Field).meta.getValues(name) { | ||
case []: null; | ||
case [[]]: m.name; | ||
case [[v]]: v.getName().sure(); | ||
default: m.pos.error('Invalid use of @$name'); | ||
} | ||
} | ||
|
||
switch extractMeta(':table') { | ||
case null: | ||
case table: | ||
var type = TAnonymous([{ | ||
name : m.name, | ||
pos: m.pos, | ||
kind: FVar(m.getVar().sure().type), | ||
}]); | ||
m.kind = FVar(macro : tink.sql.Table<$type>); | ||
m.isFinal = true; | ||
} | ||
|
||
switch extractMeta(':procedure') { | ||
case null: | ||
case procedure: | ||
final type = m.getVar().sure().type; | ||
m.kind = FVar(macro : tink.sql.Procedure<$type>); | ||
m.isFinal = true; | ||
} | ||
} | ||
|
||
return c.export(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
package tink.sql; | ||
|
||
import tink.sql.Info; | ||
|
||
using tink.CoreApi; | ||
|
||
class DatabaseStaticInfo implements DatabaseInfo { | ||
|
||
final tables:Map<String, TableInfo>; | ||
|
||
public function new(tables) { | ||
this.tables = tables; | ||
} | ||
|
||
public function instantiate(name) { | ||
return new DatabaseInstanceInfo(name, tables); | ||
} | ||
|
||
public function tableNames():Iterable<String> | ||
return { | ||
iterator: function () return tables.keys() | ||
}; | ||
|
||
public function tableInfo(name:String):TableInfo | ||
return switch tables[name] { | ||
case null: throw new Error(NotFound, 'Table `${nameOfTable(name)}` not found'); | ||
case v: cast v; | ||
} | ||
|
||
function nameOfTable(tbl:String) { | ||
return tbl; | ||
} | ||
} | ||
|
||
class DatabaseInstanceInfo extends DatabaseStaticInfo { | ||
|
||
final name:String; | ||
|
||
public function new(name, tables) { | ||
super(tables); | ||
this.name = name; | ||
} | ||
|
||
override function nameOfTable(tbl:String) { | ||
return '$name.$tbl'; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.