/*==================================================================================================================================
        * Public Methods
        *=================================================================================================================================*/
        public questStatus PerformBulkInsert(BulkInsertRequest bulkInsertRequest)
        {
            // Initialize
            questStatus status = null;


            // Read Filter
            FilterId   filterId   = new FilterId(bulkInsertRequest.FilterId);
            Filter     filter     = null;
            FiltersMgr filtersMgr = new FiltersMgr(this.UserSession);

            status = filtersMgr.Read(filterId, out filter);
            if (!questStatusDef.IsSuccess(status))
            {
                return(status);
            }
            bulkInsertRequest.Filter = filter;


            // Determine if bulk insert filter procedure exists.
            FilterProcedure filterProcedure = null;

            status = _dbBulkInsertMgr.GetFilterProcedure(bulkInsertRequest, "Insert", out filterProcedure);
            if (!questStatusDef.IsSuccessOrWarning(status))
            {
                return(status);
            }

            //  Perform bulk insert filter procedure if exists.
            if (questStatusDef.IsSuccess(status))
            {
                return(PerformBulkInsertFilterProcedure(bulkInsertRequest, filterProcedure));
            }

            // Validate bulk insert request
            BulkInsertResponse bulkInsertResponse = null;

            status = ValidateRequest(bulkInsertRequest, out bulkInsertResponse);
            if (!questStatusDef.IsSuccess(status))
            {
                return(status);
            }


            // Generate the SQL
            status = _dbBulkInsertMgr.GenerateBulkInsertSQL(bulkInsertRequest);
            if (!questStatusDef.IsSuccess(status))
            {
                return(status);
            }


            // Perform bulk insert.
            status = _dbBulkInsertMgr.PerformBulkInsert(bulkInsertRequest);
            if (!questStatusDef.IsSuccess(status))
            {
                return(status);
            }
            return(new questStatus(Severity.Success));
        }
        protected async Task <List <uint> > BulkInsertSQL(string query, List <string> values)
        {
            List <uint> InsertedIds = new List <uint>();

            BulkInsertResponse bulkInsertResponse = new BulkInsertResponse();

            StringBuilder SQLquery = new StringBuilder(query);

            using (MySqlConnection mConnection = new MySqlConnection(this.ConnectionString))
            {
                SQLquery.Append(string.Join(",", values));
                SQLquery.Append("ON DUPLICATE KEY UPDATE Value = VALUES(Value),  ModifiedDate = utc_timestamp() ; COMMIT; ");


                //Create a data reader and Execute the command
                //MySqlDataReader dataReader = myCmd.ExecuteReader();

                mConnection.Open();
                using (MySqlCommand cmd = mConnection.CreateCommand())
                {
                    cmd.CommandText = SQLquery.ToString();
                    MySqlDataReader dataReader = null;
                    try
                    {
                        dataReader = cmd.ExecuteReader();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        if (mConnection.State == ConnectionState.Open)
                        {
                            mConnection.Close();
                            mConnection.Dispose();
                        }
                        if (!dataReader.IsClosed)
                        {
                            dataReader.Close();
                        }
                    }
                }
            }

            if (bulkInsertResponse != null)
            {
                for (int i = 0; i < bulkInsertResponse.RowCount; i++)
                {
                    InsertedIds.Add(bulkInsertResponse.FirstId);
                    bulkInsertResponse.FirstId++;
                }
            }

            return(InsertedIds);
        }
        public async Task <IActionResult> BulkInsert(BulkInsert model)
        {
            var res = new BulkInsertResponse();

            res.DailyInserted       = new List <DailyInsert>();
            res.DailyNotInserted    = new List <DailyInsert>();
            res.PositiveNotInserted = new List <PositiveInsert>();
            res.PositiveInserted    = new List <PositiveInsert>();
            foreach (var item in model.PositiveInserts)
            {
                if (ModelState.IsValid)
                {
                    var dailyRes = await _da.PositiveInsertion(item);

                    if (dailyRes.StatusCode == 200)
                    {
                        res.PositiveInserted.Add(item);
                    }
                    else
                    {
                        res.PositiveNotInserted.Add(item);
                    }
                }
                else
                {
                    res.PositiveNotInserted.Add(item);
                }
            }
            foreach (var item in model.DailyInserts)
            {
                if (ModelState.IsValid)
                {
                    var dailyRes = await _da.DailyInsertion(item);

                    if (dailyRes.StatusCode == 200)
                    {
                        res.DailyInserted.Add(item);
                    }
                    else
                    {
                        res.DailyNotInserted.Add(item);
                    }
                }
                else
                {
                    res.DailyNotInserted.Add(item);
                }
            }
            return(Ok(res));
        }
        protected async Task <List <uint> > BulkInsertMySQL(StringBuilder SQLquery, List <string> values)
        {
            List <uint> InsertedIds = new List <uint>();

            BulkInsertResponse bulkInsertResponse = new BulkInsertResponse();

            using (MySqlConnection mConnection = new MySqlConnection(this.ConnectionString))
            {
                //Create a data reader and Execute the command
                //MySqlDataReader dataReader = myCmd.ExecuteReader();

                mConnection.Open();
                using (MySqlCommand cmd = mConnection.CreateCommand())
                {
                    cmd.CommandText = SQLquery.ToString();
                    MySqlDataReader dataReader = null;
                    try
                    {
                        dataReader = cmd.ExecuteReader();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        if (mConnection.State == ConnectionState.Open)
                        {
                            mConnection.Close();
                            mConnection.Dispose();
                        }
                        if (!dataReader.IsClosed)
                        {
                            dataReader.Close();
                        }
                    }
                }
            }

            if (bulkInsertResponse != null)
            {
                for (int i = 0; i < bulkInsertResponse.RowCount; i++)
                {
                    InsertedIds.Add(bulkInsertResponse.FirstId);
                    bulkInsertResponse.FirstId++;
                }
            }

            return(InsertedIds);
        }
        protected async Task <bool> BulkUpdateSQLGeneric(string query, List <string> values)
        {
            List <uint> InsertedIds = new List <uint>();

            BulkInsertResponse bulkInsertResponse = new BulkInsertResponse();

            StringBuilder SQLquery    = new StringBuilder(query);
            var           returnValue = -1;

            using (MySqlConnection mConnection = new MySqlConnection(this.ConnectionString))
            {
                //makes a comma seprated string our of List of Strings
                SQLquery.Append(string.Join("  ", values));



                //MySqlDataReader dataReader;

                //Create a data reader and Execute the command
                //MySqlDataReader dataReader = myCmd.ExecuteReader();

                mConnection.Open();
                using (MySqlCommand cmd = mConnection.CreateCommand())
                {
                    cmd.CommandText = SQLquery.ToString();
                    MySqlDataReader dataReader = null;
                    try
                    {
                        returnValue = await cmd.ExecuteNonQueryAsync();
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    finally
                    {
                        if (mConnection.State == ConnectionState.Open)
                        {
                            mConnection.Close();
                            mConnection.Dispose();
                        }
                    }
                }
            }



            return(true);
        }
        public questStatus ValidateRequest(BulkInsertRequest bulkInsertRequest, out BulkInsertResponse bulkInsertResponse)
        {
            // Initialize
            questStatus status = null;

            bulkInsertResponse = new BulkInsertResponse();
            bulkInsertResponse.BulkInsertRequest = bulkInsertRequest;


            // Get the filter.
            FilterId    filterId    = new FilterId(bulkInsertRequest.FilterId);
            Filter      filter      = null;
            DbFilterMgr dbFilterMgr = new DbFilterMgr(this.UserSession);

            status = dbFilterMgr.GetFilter(filterId, out filter);
            if (!questStatusDef.IsSuccess(status))
            {
                return(status);
            }
            bulkInsertRequest.Filter = filter;


            // Validate the request.
            foreach (BulkInsertRow bulkInsertRow in bulkInsertRequest.Rows)
            {
                BulkInsertRow invalidRow = null;
                for (int rdx = 0; rdx < bulkInsertRow.Columns.Count; rdx += 1)
                {
                    BulkInsertColumnValue bulkInsertColumnValue = bulkInsertRow.Columns[rdx];

                    string entityName = null;
                    string columnName = null;
                    if (filter.FilterTableList.Count == 1)
                    {
                        entityName = filter.FilterTableList[0].TablesetTable.Table.Name;
                        columnName = bulkInsertColumnValue.Name;
                    }
                    else
                    {
                        string[] pp = bulkInsertColumnValue.Name.Split('_');
                        entityName = pp[0];
                        columnName = pp[1];
                    }


                    FilterColumn filterColumn = null;
                    FilterTable  filterTable  = filter.FilterTableList.Find(delegate(FilterTable t) { return(t.TablesetTable.Table.Name == entityName); });
                    if (filterTable != null)
                    {
                        filterColumn = filter.FilterColumnList.Find(delegate(FilterColumn c) {
                            return(c.TablesetColumn.Column.Name == columnName && c.TablesetColumn.Column.EntityTypeId == EntityType.Table && c.TablesetColumn.Column.EntityId == filterTable.TablesetTable.Table.Id);
                        });
                        if (filterColumn == null)
                        {
                            return(new questStatus(Severity.Error, String.Format("ERROR: filter column not found for bulk insert column {0}, row # {1}",
                                                                                 bulkInsertColumnValue.Name, (rdx + 1))));
                        }
                    }
                    else
                    {
                        FilterView filterView = filter.FilterViewList.Find(delegate(FilterView v) { return(v.TablesetView.View.Name == entityName); });
                        if (filterView == null)
                        {
                            return(new questStatus(Severity.Error, String.Format("ERROR: filter view not found for bulk insert column {0}, row # {1}",
                                                                                 bulkInsertColumnValue.Name, (rdx + 1))));
                        }
                        filterColumn = filter.FilterColumnList.Find(delegate(FilterColumn c) {
                            return(c.TablesetColumn.Column.Name == columnName && c.TablesetColumn.Column.EntityTypeId == EntityType.View && c.TablesetColumn.Column.EntityId == filterView.TablesetView.View.Id);
                        });
                        if (filterColumn == null)
                        {
                            return(new questStatus(Severity.Error, String.Format("ERROR: filter column not found for bulk insert column {0}, row # {1} (view search)",
                                                                                 bulkInsertColumnValue.Name, (rdx + 1))));
                        }
                    }

                    // Validate the column
                    status = ValidateBulkInsertColumn(bulkInsertColumnValue, filterColumn);
                    if (!questStatusDef.IsSuccess(status))
                    {
                        if (invalidRow == null)
                        {
                            invalidRow = new BulkInsertRow();
                        }
                        invalidRow.Columns.Add(bulkInsertColumnValue);
                    }
                }
                if (invalidRow != null)
                {
                    bulkInsertResponse.ValidationErrors.Add(invalidRow);
                }
            }

            // TODO: IF ANY INVALID FIELDS, RETURN AN ERROR.
            if (bulkInsertResponse.ValidationErrors.Count > 0)
            {
                return(new questStatus(Severity.Error));
            }
            return(new questStatus(Severity.Success));
        }