On Friday, 4 March 2016 at 11:57:49 UTC, Kagamin wrote:
On Thursday, 3 March 2016 at 18:08:26 UTC, Erik Smith wrote:
db.execute("select from t").reader; //row range
db.execute("select from t").get!long; //scalar
db.execute("select from t"); //non-query

More good options (the 3rd one is there). Also at the value access level there are several options to consider: v.get!long, v.as!long, v.to!long, etc.

to!long looks ok.

On the other hand execute can simply return the reader with extra getter for scalar result. Just don't do stuff until it's iterated. Is it possible?
auto rows = db.execute("select * from t");

I'm hedging a bit on this because there are other capabilities that need to be introduced that might present a problem.

Can you elaborate?

Actually I like this and I think it can work. I'm trying to keep a single execute function name for both row/no-row queries. I can still return the range proxy for no-row queries that is either empty or throws on access.

On the other hand these helper methods are built on top of abstraction API and you have to duplicate them in all drivers. Maybe better have them as extension methods in a single module that will work with all drivers? They are effectively a sort of minimal frontend already.

I'm just waiting for the code to settle a bit in a basic working state before I refactor into a two layer design.

The result set is even iterator/stream, i.e. conceptually has even less container properties than ranges themselves. Why would you think of it as a container? I think it's ok as input range. Anyway, this `execute` method is a frontend, i.e. it's replaceable without touching the driver.

The range itself is an InputRange. The statement is acting as a container only in that it is the source of the range and holds the data. I agree that it is confusing to use the term container although it seems to fit the definition of one.



Reply via email to