namespace bts.SilverPine { using System; using System.Data; using System.Data.SQLite; using System.Diagnostics; using System.Collections; using BCG; [DataStreamUserRespresentation("SQLite")] public class SQLiteStream : ViewStream { private readonly string _connection_string, _query; private Stopwatch _stopwatch = new Stopwatch(); private SQLiteStream(string connection_string, string query, bool noop) { _connection_string = connection_string; _query = query; } public SQLiteStream(string db_name, string query) : this($"Data Source={SQLiteHelper.location}{db_name};Version=3", query, true) { } public SQLiteStream(string query) : this(SQLiteHelper.db_name, query) { } private void _read_from_sqlite_and_fire() { _stopwatch.Start(); DataTable dt = SQLiteHelper.execute_select_query(_connection_string, _query); _stopwatch.Stop(); Log.Gen.info($"SQLiteStream.ExecuteSelectQuery time to read db: {_stopwatch.ElapsedMilliseconds} msecs"); _stopwatch.Restart(); #region perf measures // SQLiteHelper.get_table(_connection_string, _query); // _stopwatch.Stop(); // Log.Gen.info($"SQLiteStream.get_table time to read db: {_stopwatch.ElapsedMilliseconds} msecs"); // _stopwatch.Restart(); // SQLiteHelper.ExecuteBulkRead(_connection_string, _query); // _stopwatch.Stop(); // Log.Gen.info($"SQLiteStream.ExecuteBulkRead time to read db: {_stopwatch.ElapsedMilliseconds} msecs"); // _stopwatch.Restart(); // SQLiteHelper.get_table_2(_connection_string, _query); // _stopwatch.Stop(); // Log.Gen.info($"SQLiteStream.get_table_2 time to read db: {_stopwatch.ElapsedMilliseconds} msecs"); // _stopwatch.Restart(); #endregion IBlueRowCollection rows = BCG.BlueDataUtility.toIBlueRowCollection(dt); //IBlueRowCollection rows = new DataTableWrapperTable(dt); _stopwatch.Stop(); Log.Gen.info($"SQLiteStream._read_from_sqlite_and_fire time to load into IBlueRowCollection: {_stopwatch.ElapsedMilliseconds} msecs"); DataPacket dp = BlueDataUtility.build_dp_inc(rows, myLastValue as DataPacket); myFireEvent(dp); } protected override void myOnFirstSubscriber() { _read_from_sqlite_and_fire(); } protected override void myOnLastSubscriber() { // this value will be cleared by the base class // but in this particular stream this behaviour // is not usefull since any new subscribers // would force the query to be recreated //myLastDP = myLastValue; } } }