Exemplo n.º 1
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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());
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
        /// <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;
            }
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        /// <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;
            }
        }
Exemplo n.º 13
0
        /// <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);
                    }
                }
            }
        }