-
Notifications
You must be signed in to change notification settings - Fork 5
Working with results — ds_result
Each result set returned by the data source is encapsulated by the ds_result
type. The ds_result
type provides access to information about the the result set and rows returned by the data source.
Typically when a data source is invoked one ds_result is generated. For convenience ds
replicates most of the methods ds_result
provides and directs them to the most recent ds_result
.
Once invoked, the ds type can be queried directly as by default any ds_result
sets are iterated:
with result in my_ds->sql('
UPDATE products SET status = 2 WHERE status = 1;
') do {
#result->affected // Number of rows affected
#result->found // Number of rows found
}
Returns the columns names returned by the data source.
Returns the number of rows found.
Returns the number of rows affected by an update, insert or delete.
Returns the result sets number within the current set.
Accessing result set rows
Returns staticarray containing the ds_rows returned by the data source.
Returns staticarray containing the specified type created with each ds_row
— this is a really fast efficient approach to OOP (the overhead is minimal). Any type that supports ->oncreate(p::ds_row)
can be returned in this way.
with product in result->rows(::product) do {
#product->isa(::product) // true
}
In the above example each row will be encapsulated by the product type — a custom type which inherits activerow
. This is achieved by specifying activerow
as the parent of the product
type. From there you can modify and extend the product type as required.
The supplied memberstream
will be invoked for each ds_row
with the ds_row
as the parameter, the results will be returned in a staticarray
.
with product in result->rows(\product) do {
#product->isa(::product) // true
}
However some data sources can generate multiple ds_result sets depending on the number of result sets returned by the data source.
with result in my_ds->sql('
UPDATE products SET status = 2 WHERE status = 1;
SELECT * FROM products WHERE status = 2;
') do {
#result->affected // Number of rows affected
#result->found // Number of row found
}
ds_result sets can also be accessed and stored by calling '->results'.
local(
ds = ds(::store.products),
sql = 'UPDATE products SET status = 2 WHERE status = 1;
SELECT * FROM products WHERE status = 2',
results = #ds->sql(#sql)->results
)
with result in #results do {
#result->affected ? #ds->do_something
#result->found ? #ds->do_something_else
}
When ds
is provided a capture in a similar fashion to inline
the result helper returns either the current ds_result
or a specified ds_result
if multiple result sets are available. Simply call result within the supplied capture like so:
ds(::store.products)->all => {
result->found // found count
result->rows // rows to work with
}
inline(-database='store',-table='products',-findall) => {
result->found // found count
result->rows // rows to work with
}
Specific ds_result
sets can retrieved by the helper by specifying an integer:
ds(::store.products)->sql('
UPDATE products SET status = 2 WHERE status = 1;
SELECT * FROM products WHERE status = 2;
') => {
result(1)->affected // number of rows affected by UPDATE
result(2)->rows // rows returned by SELECT
}