/// <summary> /// Gets the current rows from the table. Since this is accomplished with a trigger table its just a small querie. /// </summary> /// <param name="table">The table to get the current rows from.</param> /// <returns>Returns the number of rows in the given table</returns> public override int GetCurrentRowsFromTable(Table table) { try { SQLQueryBuilder sqb = new SQLQueryBuilder(); sqb.Select().AddValue("rowCount").From().AddValue(table.TableName + "_count").Where().AddValue("id").Equal().AddValue("1"); List <List <object> > result = ReadQuery(sqb.ToString(), new List <KeyValuePair <int, Type> >() { new KeyValuePair <int, Type>(0, typeof(int)) }); if (result == null) { return(0); } else { return((int)result[0][0]); } } catch (Exception) { throw; } }
/// <summary> /// Gets the current rows from the table. There are no triggers in access so i had to do it with the count method. /// </summary> /// <param name="table">The table to get the current rows from.</param> /// <returns>Returns the number of rows in the given table</returns> public override int GetCurrentRowsFromTable(Table table) { try { SQLQueryBuilder sqb = new SQLQueryBuilder(); string columnName = table.Columns.First().Key; sqb.Select().AddValue("Count(" + columnName + ")").From().AddValue(table.TableName); List <List <object> > result = ReadQuery(sqb.ToString(), new List <KeyValuePair <int, Type> >() { new KeyValuePair <int, Type>(0, typeof(int)) }); if (result == null) { return(0); } else { return((int)result[0][0]); } } catch (Exception e) { throw e; } }
/// <summary> /// Get's the last n rows from the specified table. /// <para/> /// SQL query Example:<para/> /// SELECT * FROM table ORDER BY id DESC LIMIT 100 /// </summary> /// <param name="rows">number of the rows to display.</param> /// <param name="table">The table to get the values from.</param> /// <returns></returns> public override List <List <object> > GetLastNRowsFromTable(Table table, int rows) { SQLQueryBuilder sqb = new SQLQueryBuilder(); sqb.Select().ALL().From().AddValue(table.TableName).OrderBY().AddValue(table.Columns.First().Key).Desc().Limit().AddValue(rows.ToString()); List <List <object> > results = ReadQuery(sqb.ToString(), GenerateOutputValuesFromTable(table)); return(results); }
/// <summary> /// Deletes the last n rows of the given table. /// </summary> /// <param name="table">The table to delete the last n data from.</param> /// <param name="rows">The amount of data to delete.</param> public override void DeleteLastNRows(Table table, int rows) { SQLQueryBuilder sqb = new SQLQueryBuilder(); string columnName = table.Columns.First().Key; string param = sqb.Select().AddValue(columnName).From().AddValue(table.TableName).OrderBY(). AddValue(columnName).Asc().Limit().AddValue(rows.ToString()).Flush(); sqb.Delete().From().AddValue(table.TableName).Where().AddValue(columnName).In().Brackets(param); CommitQuery(sqb.ToString()); }
/// <summary> /// Gets all rows in the given id slot. /// <para/> /// SQL query Example: <para/> /// SELECT * from table3 where id >= 0 and id -= 1 /// </summary> /// <param name="table"></param> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> public override List <List <object> > GetRowsFromTableWithIndex(Table table, int start, int end) { SQLQueryBuilder sqb = new SQLQueryBuilder(); sqb.Select().ALL().From().AddValue(table.TableName).Where().AddValue(table.Columns.First().Key); sqb.GreaterThen().AddValue(start.ToString()).AND().AddValue(table.Columns.First().Key).LesserThen().AddValue(end.ToString()); List <List <object> > results = ReadQuery(sqb.ToString(), GenerateOutputValuesFromTable(table)); return(results); }
/// <summary> /// Get's the last n rows from the specified table. /// <para/> /// SQL query Example:<para/> /// SELECT * FROM (SELECT * FROM name.table3 ORDER BY id DESC LIMIT 1) ORDER BY id ASC; /// </summary> /// <param name="rows">number of the rows to display.</param> /// <param name="table">The table to get the values from.</param> /// <param name="ascending">Ascending or descending by first param.</param> /// <returns></returns> public override List <List <object> > GetLastNRowsFromTable(Table table, int rows, bool ascending = true) { try { SQLQueryBuilder sqb = new SQLQueryBuilder(); sqb.Select().ALL().From().AddValue(table.TableName).OrderBY().AddValue(table.Columns.First().Key).Desc().Limit().AddValue(rows.ToString()); if (ascending) { string value = sqb.Flush(); sqb.Select().ALL().From().Brackets(value).OrderBY().AddValue(table.Columns.First().Key).Asc(); } List <List <object> > results = ReadQuery(sqb.ToString(), GenerateOutputValuesFromTable(table)); return(results); } catch (Exception) { throw; } }
static void Main(string[] args) { var builder = new SQLQueryBuilder(); var selectQuery = builder. Select("students.name", "age", "major", "course", "grade"). Distinct(). From("students"). InnerJoin("grades", ("students.name", "grades.name")). Where("students.name", "grades.name").AND("students.name", "Markus").OR("students.name", "Joji").AND("age", "99"). OrderBy("students.name"). FinishQuery(); Console.WriteLine(selectQuery + "\r\n"); var updateQuery = builder. Update("students"). Set(("age", "23")). Where("name", "markus"). FinishQuery(); var selectQuery2 = builder. Select("students.name", "course", "grade", "age", "major"). Distinct(). From("students", "grades"). Where("students.name", "grades.name"). OrderBy("major"). FinishQuery(); Console.WriteLine(updateQuery + "\r\n"); Console.WriteLine(selectQuery2 + "\r\n"); //string connectionString = @"Server=(localdb)\MyInstance;Initial Catalog = Local;Integrated Security=true;"; //bool usePostgress = false; //ExecuteQuery(usePostgress, connectionString, updateQuery); //ExecuteQuery(usePostgress, connectionString, selectQuery); //ExecuteQuery(usePostgress, connectionString, selectQuery2); }
/// <summary> /// Gets all rows in the given DateTime slot. /// <para/> /// SQL query Example: <para/> /// select * from table3 where Date >= "2018-12-06 11:10:32.632" and Date -= "2018-12-06 12:05:57.526"; /// </summary> /// <param name="table">The name of the table to get the data from.</param> /// <param name="DateTimeColumnName">The name of the column with the DateTime values.</param> /// <param name="from">A DateTime object with the beginning of the timeslot.</param> /// <param name="until">A DateTime object with the end of the timeslot.</param> /// <returns></returns> public override List <List <object> > GetRowsFromTableWithTime(Table table, string DateTimeColumnName, DateTime from, DateTime until) { SQLQueryBuilder sqb = new SQLQueryBuilder(); string stringFrom = sqb.Apostrophe(from.ToString(_stringFormat)).Flush(); string stringUntil = sqb.Apostrophe(until.ToString(_stringFormat)).Flush(); sqb.Select().ALL().From().AddValue(table.TableName).Where().AddValue(DateTimeColumnName); sqb.GreaterThen().AddValue(stringFrom).AND().AddValue(DateTimeColumnName).LesserThen().AddValue(stringUntil); List <List <object> > results = ReadQuery(sqb.ToString(), GenerateOutputValuesFromTable(table)); return(results); }
/// <summary> /// If the current rowCount value is higher then the MaxRows value the deletion will be started. /// Now the size of the table will be shrinked to 70% of the MaxRows value. The oldest values will be deleted. /// If the amount of the rows to be deleted is higher than the global _maxDeleteRowSize then only every 5 seconds the highest amount possible /// will be deleted until the initial calculated amountToDelete is 0. /// <para/> /// Example: <para/> /// If you have 50 000 000 as MaxRows defined. Then 70% would be 35 000 000 rows. So 15 000 000 would have to be deleted. /// If youre _maxDeleteRowSize is 100 000 this would mean 150 turns every 5 seconds. This would take then round about 12,5 minutes to delete all of them. /// If you calculated with 500 entries per second. This would only mean 375 000 entries in these 12,5 minutes. /// So this should be enough time to delete all entries with plenty of time in between for other sources to write to the database. /// </summary> /// <param name="tables">All saved tables.</param> public override void CheckDeleteTables(ConcurrentDictionary <string, Table> tables) { try { foreach (Table table in tables.Values) { // Get the current row value long result = GetCurrentRowsFromTable(table); if (result >= table.MaxRows) { // Calculate 70% and the amount to delete double seventyPercent = (double)table.MaxRows * (double)0.7; long amountToDelete = result - (long)Math.Round(seventyPercent); string text = "Started to delete entries on table: " + table.TableName + Environment.NewLine; text += "Current Rows: " + result + " | Max table rows: " + table.MaxRows + " | Amount to delete: " + amountToDelete; OnDeleteEvent(text); while (amountToDelete > 0) { long rows; if (amountToDelete > MaxDeleteRowSize) { rows = MaxDeleteRowSize; } else { rows = amountToDelete; } amountToDelete -= rows; SQLQueryBuilder sqb = new SQLQueryBuilder(); string columnName = table.Columns.First().Key; string param = sqb.Select().Top().AddValue(rows.ToString()).AddValue(columnName).From().AddValue(table.TableName) .OrderBY().AddValue(columnName).Desc().Flush(); sqb.Delete().From().AddValue(table.TableName).Where().AddValue(columnName).In().Brackets(param); CommitQuery(sqb.ToString()); Thread.Sleep(5000); } OnDeleteEvent("Finished the Deletion of the table: " + table.TableName); } } } catch (Exception e) { throw e; } }
/// <summary> /// Deletes the last n rows of the given table. /// </summary> /// <param name="table">The table to delete the last n data from.</param> /// <param name="rows">The amount of data to delete.</param> public override void DeleteLastNRows(Table table, int rows) { // TODO: Check Query try { SQLQueryBuilder sqb = new SQLQueryBuilder(); string columnName = table.Columns.First().Key; string param = sqb.Select().Top().AddValue(rows.ToString()).AddValue(columnName).From().AddValue(table.TableName) .OrderBY().AddValue(columnName).Desc().Flush(); sqb.Delete().From().AddValue(table.TableName).Where().AddValue(columnName).In().Brackets(param); CommitQuery(sqb.ToString()); } catch (Exception e) { throw e; } }
/// <summary> /// Gets all rows in the given id slot. /// <para/> /// </summary> /// <param name="table"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="ascending">Ascending or descending by first param.</param> /// <returns></returns> public override List <List <object> > GetRowsFromTableWithIndex(Table table, int start, int end, bool ascending = true) { try { SQLQueryBuilder sqb = new SQLQueryBuilder(); sqb.Select().ALL().From().AddValue(table.TableName).Where().AddValue(table.Columns.First().Key); sqb.GreaterThen().AddValue(start.ToString()).AND().AddValue(table.Columns.First().Key).LesserThen().AddValue(end.ToString()); if (!ascending) { sqb.OrderBY().AddValue(table.Columns.First().Key).Desc(); } List <List <object> > results = ReadQuery(sqb.ToString(), GenerateOutputValuesFromTable(table)); return(results); } catch (Exception e) { throw e; } }
/// <summary> /// Gets all rows in the given DateTime slot. /// <para/> /// </summary> /// <param name="table">The name of the table to get the data from.</param> /// <param name="DateTimeColumnName">The name of the column with the DateTime values.</param> /// <param name="from">A DateTime object with the beginning of the timeslot.</param> /// <param name="until">A DateTime object with the end of the timeslot.</param> /// <param name="ascending">Ascending or descending by DateTimeColumn param.</param> /// <returns></returns> public override List <List <object> > GetRowsFromTableWithTime(Table table, string DateTimeColumnName, DateTime from, DateTime until, bool ascending = true) { try { SQLQueryBuilder sqb = new SQLQueryBuilder(); string stringFrom = sqb.Tags(from.ToString(_stringFormat)).Flush(); string stringUntil = sqb.Tags(until.ToString(_stringFormat)).Flush(); sqb.Select().ALL().From().AddValue(table.TableName).Where().AddValue(DateTimeColumnName); sqb.GreaterThen().AddValue(stringFrom).AND().AddValue(DateTimeColumnName).LesserThen().AddValue(stringUntil); if (!ascending) { sqb.OrderBY().AddValue(DateTimeColumnName).Desc(); } List <List <object> > results = ReadQuery(sqb.ToString(), GenerateOutputValuesFromTable(table)); return(results); } catch (Exception e) { throw e; } }
/// <summary> /// Gets called if the Timer.Elapsed event is raised. /// If the current rowCount value is higher then the MaxRows value in each table a deleteThread will be started. /// Now the size of the table will be shrinked to 70% of the MaxRows value. The oldest values will be deleted. /// If the amount of the rows to be deleted is higher than the global _maxDeleteRowSize then only every 5 seconds the highest amount possible /// will be deleted until the the initial calculated RowsToDelete, which is stored in the Table object, is 0. /// The thread is also stored in a global Dictionary so it can be aborted. /// Every table can only have one DeleteThread active which is marked with the DeleteThreadActive variable. /// <para/> /// Example: <para/> /// If you have 50 000 000 as MaxRows defined. Then 70% would be 35 000 000 rows. So 15 000 000 would have to be deleted. /// If youre _maxDeleteRowSize is 100 000 this would mean 150 turns every 5 seconds. This would take then round about 12,5 minutes to delete all of them. /// If you calculated with 500 entries per second. This would only mean 375 000 entries in these 12,5 minutes. /// So this should be enough time to delete all entries with plenty of time in between for other sources to write to the database. /// </summary> /// <param name="tables">All saved tables.</param> public override void OnDeleteTimer(Dictionary <string, Table> tables) { foreach (Table table in tables.Values) { long result = GetCurrentRowsFromTable(table); if (result == 0) { continue; } if (result >= table.MaxRows) { // Calculate 70% and the amount to delete double seventyPercent = (double)table.MaxRows * (double)0.7; long amountToDelete = result - (long)Math.Round(seventyPercent); Console.WriteLine(result + ">= " + table.MaxRows + " -> Clear the table: " + table.TableName); // Start the Thread if it isn't active allready if (!table.DeleteThreadActive) { table.RowsToDelete = amountToDelete; table.DeleteThreadActive = true; Thread deleteThread = new Thread(() => { try { while (table.RowsToDelete > 0) { long rows; if (table.RowsToDelete > MaxDeleteRowSize) { rows = MaxDeleteRowSize; } else { rows = table.RowsToDelete; } table.RowsToDelete -= rows; SQLQueryBuilder deleteQuery = new SQLQueryBuilder(); string columnName = table.Columns.First().Key; string param = deleteQuery.Select().AddValue(columnName).From().AddValue(table.TableName).OrderBY(). AddValue(columnName).Asc().Limit().AddValue(rows.ToString()).Flush(); deleteQuery.Delete().From().AddValue(table.TableName).Where().AddValue(columnName).In().Brackets(param); CommitQuery(deleteQuery.ToString()); Console.WriteLine("Delete Thread deleted {0} rows!", rows); Thread.Sleep(5000); } table.DeleteThreadActive = false; _tableDeleteThreads.Remove(table.TableName); } catch (Exception) { } }); _tableDeleteThreads.Add(table.TableName, deleteThread); deleteThread.Start(); Console.WriteLine("Started Thread on: " + table.TableName); } } } }