using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data.Common;
using FirebirdSql.Data.FirebirdClient;
using System.Collections;
using System.Data;
using System.Globalization;
 
namespace ConsoleApplication1
{
    class Program
    {
        static DbConnection _sqlite, _sqlce;
        static FbConnection _fbcon;
 
        static void Main(string[] args)
        {
            test(50);
            test(250);
            test(500);
            test(1000);
            test(5000);
            test(10000);
            test(20000);
            test(50000);
            System.Console.ReadKey();
        }
 
        static void test(int iter)
        {
            System.Console.WriteLine("\nTesting for " + iter + " iterations");
            DateTime t;
            TimeSpan elapsed;
            double i = iter;
            int rate = 0;
            // Init all
            SqlCeInit();
            SQLiteInit();
            FirebirdInit();
            //
            // SQLITE
            // 
            System.Console.Write("Testing sqlite... ");
            t = DateTime.Now;
            SQLiteInsert(iter);
            elapsed = (DateTime.Now - t);
            rate = (int)(i * 1000.0 / elapsed.TotalMilliseconds);
            System.Console.WriteLine("\t\t" + elapsed.TotalMilliseconds + "ms \t" + rate + " inserts / sec");
 
            //
            // Firebird 2
            //
            System.Console.Write("Testing firebird... ");
            t = DateTime.Now;
            FirebirdInsert(iter);
            elapsed = (DateTime.Now - t);
            rate = (int)(i * 1000.0 / elapsed.TotalMilliseconds);
            System.Console.WriteLine("\t\t" + elapsed.TotalMilliseconds + "ms \t" + rate + " inserts / sec");
 
            //
            // SQL CE
            //
            System.Console.Write("Testing MS SQL CE 3.5... ");
            t = DateTime.Now;
            SqlCeInsert(iter);
            elapsed = (DateTime.Now - t);
            rate = (int)(i * 1000.0 / elapsed.TotalMilliseconds);
            System.Console.WriteLine("\t" + elapsed.TotalMilliseconds + "ms \t" + rate + " inserts / sec");
        }
        static void SQLiteInit()
        {
            DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SQLite");
            _sqlite = fact.CreateConnection();
            _sqlite.ConnectionString = "data source=sqlite.db";
            _sqlite.Open();
            /*
            DbCommand c = _sqlite.CreateCommand();
            c.CommandText = "PRAGMA synchronous = off";
            c.ExecuteNonQuery();
             */
        }
 
        static void SQLiteInsert(int iter)
        {
            using (DbTransaction trans = _sqlite.BeginTransaction())
            {
                DbCommand cmd = _sqlite.CreateCommand();
                for (int i = 0; i < iter; i++)
                {
                    cmd.CommandText = "INSERT INTO Log VALUES ( 1,2,3,4,5, date('now') )";
                    cmd.ExecuteNonQuery();
                }
                trans.Commit();
            }
        }
 
        static void FirebirdInit()
        {
            _fbcon = new FbConnection("Database=DATABASE.FDB;ServerType=1;");
            _fbcon.Open();
        }
 
        static void FirebirdInsert(int iter)
        {
            using (FbTransaction trans = _fbcon.BeginTransaction())
            {
                using (FbCommand cmd = _fbcon.CreateCommand())
                {
                    for (int i = 0; i < iter; i++)
                    {
                        cmd.Transaction = trans;
                        cmd.CommandText = "INSERT INTO LOGS VALUES ( 1,2,3,4,5, CURRENT_TIMESTAMP )";
                        cmd.ExecuteNonQuery();
                    }
                    trans.Commit();
                }
            }
        }
 
        static void SqlCeInit()
        {
            DbProviderFactory fact = DbProviderFactories.GetFactory("System.Data.SqlServerCe.3.5");
            _sqlce = fact.CreateConnection();
            _sqlce.ConnectionString = "Data Source=sqlcedb.sdf";
            _sqlce.Open();
        }
 
        static void SqlCeInsert(int iter)
        {
            using (DbTransaction trans = _sqlce.BeginTransaction())
            {
                DbCommand cmd = _sqlce.CreateCommand();
                for (int i = 0; i < iter; i++)
                {
                    cmd.CommandText = "INSERT INTO Logs VALUES ( 1,2,3,4,5, '1947/08/15 03:33:20' )";
                    cmd.ExecuteNonQuery();
                }
                trans.Commit();
            }
        }
    }
}