From 630ba69536a819e9a4d9eb9c7d01eaff62f4174c Mon Sep 17 00:00:00 2001 From: Ben Merckx Date: Wed, 2 Oct 2019 21:21:32 +0200 Subject: [PATCH] See haxetink/tink_streams#20 --- src/tink/sql/Dataset.hx | 6 ++++++ src/tink/sql/drivers/php/MySQLi.hx | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/tink/sql/Dataset.hx b/src/tink/sql/Dataset.hx index 404efab..7d4f38d 100755 --- a/src/tink/sql/Dataset.hx +++ b/src/tink/sql/Dataset.hx @@ -3,6 +3,7 @@ package tink.sql; import tink.sql.Expr; import tink.streams.RealStream; import tink.sql.Query; +import tink.sql.Info; using tink.CoreApi; @@ -185,7 +186,12 @@ class Dataset { return cnx.execute(toQuery()); public function all():Promise> + #if php + return (cast cnx: tink.sql.drivers.php.MySQLi.MySQLiConnection) + .syncResult(cast toQuery()); + #else return stream().collect(); + #end public function first():Promise return all() diff --git a/src/tink/sql/drivers/php/MySQLi.hx b/src/tink/sql/drivers/php/MySQLi.hx index 9c3ca5b..766ca12 100755 --- a/src/tink/sql/drivers/php/MySQLi.hx +++ b/src/tink/sql/drivers/php/MySQLi.hx @@ -58,12 +58,27 @@ class MySQLiConnection implements Connection implements San public function getFormatter() return formatter; + public function syncResult(query:Query): Outcome, Error> { + return switch query { + case Select(_) | Union(_): + switch cnx.query(formatter.format(query)) { + case false: Failure(new Error(cnx.errno, cnx.error)); + case (cast _: ResultSet) => res: + Success([ + for (row in res.nestedIterator(formatter.isNested(query))) + row + ]); + } + default: throw 'Cannot iterate this query'; + } + } + public function execute(query:Query):Result { inline function fetch(): Promise return run(formatter.format(query)); return switch query { case Select(_) | Union(_): Stream.promise(fetch().next(function (res:ResultSet) - return Stream.ofIterator(res.nestedIterator(formatter.isNested(query))) + return Stream.ofIterator(cast res.nestedIterator(formatter.isNested(query))) )); case CreateTable(_, _) | DropTable(_) | AlterTable(_, _): fetch().next(function(_) return Noise); @@ -87,7 +102,6 @@ class MySQLiConnection implements Connection implements San case false: new Error(cnx.errno, cnx.error); case v: (cast v: T); } - } private abstract ResultSet(NativeResultSet) from NativeResultSet {