parser: Let the TIMESERIES command accept optional data-source names. These may be specified as an array of strings after the time-series identifier.
timeseries: Add support for fetching specific data-sources. The data-sources are specified by name and are then returned in the specified order. It is an error to request a data-source that does not exist. Implement the feature in the RRDtool timeseries plugin (the only such plugin).
Don't fetch timeseries info when fetching the interval. For this purpose, add query options to fine-tune the behavior. These are passed in to sdb_plugin_query.
Add support for multiple metric data-stores. It did not make sense to only store one and let conflicting values override each other on each iteration. Instead, track each separately, along with the respective last_update timestamp. This will allow to read the right data on access. At the moment, when requesting a timeseries, the most up to date data store will be used. The network plugin does not support sending multiple data stores at the moment. It will only send the first.
Let the network protocol and SysQL support last_update for metric stores.
Store a separate last_update timestamp for metric stores. Currently, it is (at least) the same as the metric's last_update timestamp. We'll need this later when supporting multiple metric stores.
frontend/query: Add the DATA type to TIMESERIES replies. This was lost in 9a96acd759c31211aa512e174339a9c178c4eb83.
frontend/query: Simplified code a little.
frontend/query: Fixed an uninitialized value.
Add support for fetching arbitrary objects, including attributes. That is, the backend now supports this. The functionality is not yet exposed via SysQL.
FETCH: Add parameter for fetching the main object without children. That is, exclude any attributes or child objects. Use this to simplify the TIMESERIES fetcher which no longer requires an attribute callback.
Build a more generic/powerful query API which writes to a store-writer. Instead of letting the query implementation write JSON directly, let them emit objects to a store-writer. This allows for more powerful and centralized post-processing of the data and avoids code-duplication by moving all logic of how to write out the data to the core. Also, this had a couple of nice side effects and allowed for further simplication: - The TIMESERIES command is now handled by the front-end (based on a FETCH of the respective metric data); query plugin no longer have to implement this. - All protocol specific information is now handled by the frontend; query plugins no longer have to handle this (response-type). - Further separation of the memory-store and generic store code.
parser: Require a context for each parser operation. That is, let the caller provide the execution context (object type) when parsing incomplete commands (conditionals / arithmetic expressions). This removes the need to call the analyzer again and avoids some special code in the analyzer.
Let the front-end handle STORE commands. … rather than requiring each reader plugin to do so which doesn't make any sense at all.
frontend: Connection-specific functions now use the sdb_conn_ prefix. … instead of sdb_fe_.
frontend: Use the plugin query interface instead of direct store access. The built-in store is registered as a reader automatically at the moment.
frontend: Drop sdb_fe_store_* in favor of sdb_store_query_execute. Instead, build a temporary AST to represent the command to be executed.
frontend: Drop sdb_fe_exec_* in favor of sdb_store_query_execute. Instead, build a temporary AST to represent the command to be executed.
Remove (now) usued sdb_fe_exec_timeseries().
frontend/query: Split AST execution into a separate function.