1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

361 lines
15 KiB

using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PhilExampleCrawler.DataBase.Models;
using System.Data;
namespace PhilExampleCrawler.DataBase
{
public class CrawlSessionAccess
{
private readonly string _dbconn;
public CrawlSessionAccess(DBSettings dbSettings)
{
_dbconn = dbSettings.ToString();
}
public async Task<DB_CrawlSession?> AddCrawlSessionAsync(DB_CrawlSession newCS)
{
DB_CrawlSession? cs = null;
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = SQL_InsertCrawlSession(newCS);
if (await cmd.ExecuteScalarAsync() is int csID)
cs = new DB_CrawlSession(id: csID,
user_id: newCS.UserID,
keywords: newCS.Keywords,
location_text: newCS.LocationText,
category_id: newCS.CategoryID,
radius_km: newCS.RadiusKM,
minPrice: newCS.MinPrice,
maxPrice: newCS.MaxPrice,
isPrivate: newCS.IsPrivate,
isCommerial: newCS.IsCommercial);
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return cs;
}
public async Task<bool> UpdateCrawlSessionAsync(DB_CrawlSession cs)
{
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = SQL_UpdateCrawlSession(cs);
if (await cmd.ExecuteNonQueryAsync() > 0)
return true;
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return false;
}
public async Task<List<DB_CrawlSession>> GetCrawlSessionsAsync(int userID)
{
List<DB_CrawlSession> l = new();
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = SQL_SeletCrawlSession(userID);
using (var dr = await cmd.ExecuteReaderAsync())
while (await dr.ReadAsync())
l.Add(new DB_CrawlSession(id: dr.GetInt32("id"),
user_id: userID,
keywords: dr.GetString("keywords"),
location_text: dr.GetString("location_text"),
category_id: dr.GetInt32("category_id"),
radius_km: dr.GetInt32("radius_km"),
minPrice: dr.GetInt32("min_price"),
maxPrice: dr.GetInt32("max_price"),
isPrivate: dr.GetBoolean("is_private"),
isCommerial: dr.GetBoolean("is_commercial")));
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return l;
}
public async Task<List<DB_CrawlSession>> GetAllCrawlSessionsAsync()
{
List<DB_CrawlSession> l = new();
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = SQL_SeletAllCrawlSessions();
using (var dr = await cmd.ExecuteReaderAsync())
while (await dr.ReadAsync())
l.Add(new DB_CrawlSession(id: dr.GetInt32("id"),
user_id: dr.GetInt32("user_id"),
keywords: dr.GetString("keywords"),
location_text: dr.GetString("location_text"),
category_id: dr.GetInt32("category_id"),
radius_km: dr.GetInt32("radius_km"),
minPrice: dr.GetInt32("min_price"),
maxPrice: dr.GetInt32("max_price"),
isPrivate: dr.GetBoolean("is_private"),
isCommerial: dr.GetBoolean("is_commercial")));
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return l;
}
public async Task<bool> RemoveCrawlSessionAsync(int crawlSessionID)
{
bool deleted = false;
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = SQL_DeleteCrawlSession(crawlSessionID);
await cmd.ExecuteNonQueryAsync();
deleted = true;
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return deleted;
}
public async Task<List<DB_Insertion>> AddInsertionsAsync(IEnumerable<DB_Insertion> insertions)
{
List<DB_Insertion> l = new();
if (!insertions.Any())
return l;
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
foreach(var i in insertions)
{
cmd.CommandText = SQL_InsertInsertion(i.Href, i.CrawlSessionID, i.Name, i.PostCode, i.LocationStr, i.Price, i.Is_VB,
i.Date, i.IsTopAd, i.IsHighlight, i.IsRequest);
if (await cmd.ExecuteNonQueryAsync() > 0)
l.Add(new DB_Insertion(i));
}
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return l;
}
public async Task<List<DB_Insertion>> GetInsertions(int userID, int? limitPerCrawlSession = 5)
{
List<DB_Insertion> ins = new();
try
{
using var conn = new NpgsqlConnection(_dbconn);
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = SQL_SeletAllCrawlSessionIDs(userID);
//crawl session ids
List<int> csIDs = new();
using (var dr = await cmd.ExecuteReaderAsync())
while (await dr.ReadAsync())
csIDs.Add(dr.GetInt32("id"));
//insertions
foreach (int csID in csIDs)
{
cmd.CommandText = SQL_SelectInsertions(csID, limitPerCrawlSession);
using var dr = await cmd.ExecuteReaderAsync();
while (await dr.ReadAsync())
ins.Add(new DB_Insertion(href: dr.GetString("href"),
crawlSessionID: csID,
name: dr.GetString("name"),
postCode: dr.ReadNullableInt("post_code"),
locationStr: dr.ReadNullableString("location_text"),
price: dr.GetDecimal("price"),
is_vb: dr.GetBoolean("is_vb"),
date: dr.ReadNullableDateTime("date"),
isTopAd: dr.GetBoolean("is_topad"),
isHighlight: dr.GetBoolean("is_highlight"),
isRequest: dr.GetBoolean("is_request")));
}
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
//TODO: log
}
return ins;
}
#region SQLQueries
private static string SQL_InsertCrawlSession (DB_CrawlSession cs)
=> $"INSERT INTO " +
"crawl_session" +
"(user_id, keywords, location_text, category_id, radius_km, min_price, max_price, is_private, is_commercial)" +
" VALUES " +
"(" +
$"{cs.UserID}," +
$"'{cs.Keywords}'," +
$"'{cs.LocationText}'," +
$"{cs.CategoryID}," +
$"{cs.RadiusKM}," +
$"{cs.MinPrice}," +
$"{cs.MaxPrice}," +
$"{cs.IsPrivate}," +
$"{cs.IsCommercial}" +
")" +
" RETURNING id;";
private static string SQL_UpdateCrawlSession(DB_CrawlSession cs)
=> "UPDATE " +
"crawl_session" +
" SET " +
$"keywords = '{cs.Keywords}'," +
$"location_text = '{cs.LocationText}'," +
$"category_id = {cs.CategoryID}," +
$"radius_km = {cs.RadiusKM}," +
$"min_price = {cs.MinPrice}," +
$"max_price = {cs.MaxPrice}," +
$"is_private = {cs.IsPrivate}," +
$"is_commercial = {cs.IsCommercial}" +
" WHERE " +
$"id = {cs.ID}" +
$" and user_id = {cs.UserID};";
private static string SQL_SeletCrawlSession(int userID) => $"SELECT " +
"id," +
"keywords," +
"location_text," +
"category_id," +
"radius_km," +
"min_price," +
"max_price," +
"is_private," +
"is_commercial" +
" FROM " +
"crawl_session" +
" WHERE " +
$"user_id = {userID};";
private static string SQL_SeletAllCrawlSessions() => $"SELECT " +
"id," +
"user_id," +
"keywords," +
"location_text," +
"category_id," +
"radius_km," +
"min_price," +
"max_price," +
"is_private," +
"is_commercial" +
" FROM " +
"crawl_session;";
private static string SQL_SeletAllCrawlSessionIDs(int userID)
=> $"SELECT " +
"id" +
" FROM " +
"crawl_session" +
" WHERE " +
$"user_id = {userID};";
private static string SQL_DeleteCrawlSession(int crawlSessionID)
=> $"DELETE FROM " +
"crawl_session" +
" WHERE " +
$"id = {crawlSessionID}";
private static string SQL_InsertInsertion(string href, int crawlSessionID, string name, int? postCode, string? locStr, decimal price, bool is_vb,
DateTime? date, bool isTopAd, bool isHighlight, bool isRequest)
=> $"INSERT INTO " +
"insertion" +
"(href, crawl_session_id, name, post_code, location_text, price, is_vb, date, " +
"is_topad, is_highlight, is_request)" +
" VALUES " +
"(" +
$"'{href}'," +
$"{crawlSessionID}," +
$"'{name}'," +
$"{Extensions.WriteNullableInt(postCode)}," +
$"{Extensions.WriteNullableString(locStr)}," +
$"{price}," +
$"{is_vb}," +
$"{Extensions.WriteNullableDateTime(date)}," +
$"{isTopAd}," +
$"{isHighlight}," +
$"{isRequest}" +
");";
private static string SQL_SelectInsertions(int crawlSessionID, int? limit)
=> $"SELECT " +
"href," +
"name," +
"post_code," +
"location_text," +
"price," +
"is_vb," +
"date," +
"is_topad," +
"is_highlight," +
"is_request" +
" FROM " +
"insertion" +
" WHERE " +
$"crawl_session_id = {crawlSessionID}" +
" and is_topad = false" +
" and is_highlight = false" + //TODO: these 3 booleans are untested
" and is_request = false" +
" ORDER BY id desc " +
$" LIMIT {limit?.ToString() ?? "null"}";
#endregion
}
}