using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using Dapper; using DataModel.Helpers; using DataModel.Models; using Newtonsoft.Json; namespace DataModel.Process { /// /// Search management functionality of LotFinderDB interface /// public partial class LotFinderDB { /// /// Query to get user's searches /// private const string SQL_GET_USER_SEARCHES = @" SELECT s.ID, s.Name, s.Status, s.SubmitDT, s.StartDT, s.EndDT FROM dbo.Search s WHERE s.UserName = @userName ORDER BY s.SubmitDT"; /// /// Gets user's searches /// /// User name to match /// List of user's searches public static List GetUserSearches(string userName) { List results = new List(); try { using (SqlConnection connection = GetConnection()) { results.AddRange(connection.Query(SQL_GET_USER_SEARCHES, new {userName})); } } catch (Exception error) { //Log but do not forward error logger.Error("GetUserSearches: failed to get searches for user '{0}': {1}.", userName, error.Message); } return results; } /// /// Query to get queued searches /// private const string SQL_GET_QUEUED_SEARCHES = @" SELECT s.ID, s.UserName, s.Name, s.Status, s.SubmitDT, s.StartDT, s.EndDT FROM dbo.Search s WHERE s.Status < 3 ORDER BY s.SubmitDT"; /// /// Gets queued searches /// /// List of searches that have been submitted but not completed public static List GetQueuedSearches() { List results = new List(); try { using (SqlConnection connection = GetConnection()) { results.AddRange(connection.Query(SQL_GET_QUEUED_SEARCHES)); } } catch (Exception error) { //Log but do not forward error logger.Error("GetQueuedSearches: failed to get queued searches: {0}.", error.Message); } return results; } /// /// Query to get search with matching ID /// private const string SQL_GET_SEARCH = @" SELECT s.UserName, s.Name, s.Status, s.SubmitDT, s.StartDT, s.EndDT, s.Criteria as CriteriaJSON FROM dbo.Search s WHERE s.ID = @id"; /// /// Gets the search with matching ID /// /// Search ID to match /// Search with matching ID public static Search GetSearch(int id) { Search result = null; try { using (SqlConnection connection = GetConnection()) { result = connection.QueryFirstOrDefault(SQL_GET_SEARCH, new {id}); if (result != null && !string.IsNullOrEmpty(result.CriteriaJSON)) { result.ID = id; result.Criteria = JsonConvert.DeserializeObject(result.CriteriaJSON); } } } catch (Exception error) { //Log but do not forward error logger.Error("GetSearch: failed to get search with ID '{0}': {1}.", id, error.Message); } return result; } /// /// Query to get the saved results for the search with matching ID /// private const string SQL_GET_SEARCH_RESULTS = @" SELECT s.Results FROM dbo.Search AS s WHERE s.ID = @id"; /// /// Gets the saved results for the search with matching ID /// /// Search ID to match /// Raw data for saved search results public static byte[] GetSearchResults(int id) { byte[] result = null; try { using (SqlConnection connection = GetConnection()) { result = connection.Query(SQL_GET_SEARCH_RESULTS, new {id}).FirstOrDefault(); } } catch (Exception error) { //Log but do not forward error logger.Error("GetSearchResults: failed to get results for search with ID '{0}': {1}.", id, error.Message); } return result; } /// /// Saves the search to the database /// /// Search to submit /// PK ID of search record generated public static int SubmitSearch(Search search) { int searchID = -1; try { search.Status = SearchStatus.Submitted; search.SubmitDT = DateTime.Now; using (SqlConnection connection = GetConnection()) { using (SqlCommand command = new SqlCommand("SubmitSearch", connection)) { command.CommandType = CommandType.StoredProcedure; //Bind parameters command.Bind("p_UserName", search.UserName); command.Bind("p_Name", search.Name); command.Bind("p_Criteria", search.Criteria.ToJSON()); SqlParameter searchIDParameter = new SqlParameter("o_SearchID", SqlDbType.Int) { Direction = ParameterDirection.Output }; command.Parameters.Add(searchIDParameter); //Execute procedure and extract values command.ExecuteNonQuery(); searchID = Convert.ToInt32(searchIDParameter.Value); } } } catch (Exception error) { //Log but do not forward error logger.Error("SubmitSearch: failed to get submit search: {0}.", error.Message); } return searchID; } } }