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;
}
}
}