namespace DataClasses
{
using Dapper;
using Dapper.Contrib;
using Dapper.Contrib.Extensions;
/// <summary>
/// Тестовый класс для разбора работы с Dapper и Contrib
/// </summary>
public class Proxy
{
public int id {get; set;}
public string protocol {get; set;}
public string ip {get; set;}
public string login {get; set;}
public string pass {get; set;}
}
/// <summary>
/// Тестовый класс для разбора работы с Dapper и Contrib
/// </summary>
public class User
{
public int id {get; set;}
public string login {get; set;}
public string pass {get; set;}
public string email {get; set;}
}
/// <summary>
/// Класс для примера работы с собчтв. классом, его методами и БД, выполняет операции с БД и подгтовку прокси к использованию
/// </summary>
public class Proxyserver
{
public int id {get; set;}
/// <summary>
/// протокол работы
/// </summary>
public string protocol {get; set;}
/// <summary>
/// ip-адрес прокси
/// </summary>
public string ip {get; set;}
/// <summary>
/// Порт прокси
/// </summary>
public int port{get; set;}
/// <summary>
/// логин
/// </summary>
public string login {get; set;}
/// <summary>
/// пароль
/// </summary>
public string pass {get; set;}
/// <summary>
/// Св-во показывает, доступен ли в БД текущий объект Proxy для получения другим потокам
/// </summary>
public bool isuse {get; set;}
public string connString;
private IZennoPosterProjectModel project;
/// <summary>
/// Пустой конструктор класса
/// </summary>
public Proxyserver()
{
}
/// <summary>
/// Конструктор класса. Создает строку подключения к ДБ и отменяет мапинг по умолчанию для Dapper.Contrib
/// </summary>
/// <param name="project"></param>
public Proxyserver(IZennoPosterProjectModel project)
{
Dapper.Contrib.Extensions.SqlMapperExtensions.TableNameMapper = (type) => type.Name;
this.project = project;
connString = String.Format("Data Source={0};UserId={1};Password={2};database={3};Charset={4};SSL Mode=None",
project.Variables["DB_host"].Value,
project.Variables["DB_user"].Value,
project.Variables["DB_pass"].Value,
project.Variables["DB_name"].Value,
project.Variables["DB_charset"].Value);
}
/// <summary>
/// Метод возвращает в текущий объект строку таблицы с указанным в параметре типом протокола, и выставляет в этой строке БД isuse = true
/// </summary>
/// <param name="protocolparam">тип протокола, строку с которым нужно получить </param>
/// <param name="isuseparam">Значение ячейки isuse в БД, по умолчанию false</param>
public void GetProxyserverFromDb(string protocolparam, bool isuseparam=false)
{
string query = "SELECT * FROM proxyserver WHERE protocol = @protocol AND isuse = @isuse LIMIT 1;";
Proxyserver proxy = new Proxyserver();
using(var conn = new MySql.Data.MySqlClient.MySqlConnection(connString))
{
conn.Open();
proxy = conn.QuerySingle<Proxyserver>(query, new{protocol = protocolparam, isuse = protocolparam});
this.id = proxy.id;
this.protocol = proxy.protocol;
this.ip = proxy.ip;
this.port = proxy.port;
this.login = proxy.login;
this.pass = proxy.pass;
conn.Execute("UPDATE proxyserver SET isuse = true WHERE id=@id", proxy);
proxy = null;
}
}
/// <summary>
/// Метод возвращает строку прокси вида protocol://login:pass@ip:port
/// </summary>
/// <returns></returns>
public string ProxyserverToString()
{
if(string.IsNullOrEmpty(this.protocol) || string.IsNullOrEmpty(this.ip) || string.IsNullOrEmpty(this.port.ToString())) throw new Exception("protocol or ip or port is empty!");
string tostr = string.Format("{0}{1}:{2}@{3}:{4}", this.protocol, this.login, this.pass, this.ip, this.port.ToString());
return tostr;
}
/// <summary>
/// Метод разбирает строку с прокси вида protocol://login:pass@ip:port на объект Proxyserver
/// </summary>
/// <param name="proxystring">строка с прокси вида protocol://login:pass@ip:port</param>
public void ProxyserverFromString(string proxystring)
{
string protoreg = @".*//";
this.protocol = new Regex(protoreg).Match(proxystring).Value;
proxystring = ZennoLab.Macros.TextProcessing.Replace(proxystring, protoreg, "", "Regex", "First");
string[] split = proxystring.Split('@');
this.login = split[0].Split(':')[0];
this.pass = split[0].Split(':')[1];
this.ip = split[1].Split(':')[0];
this.port = Int32.Parse(split[1].Split(':')[1]);
}
/// <summary>
/// Метод выставляет ячейку БД isuse=false для текущего объекта Proxyserver, разрешая таким образом др. ротокам работать с этой строкой
/// </summary>
public void ReturnProxyserverToDb()
{
using(var conn = new MySql.Data.MySqlClient.MySqlConnection(connString))
{
conn.Open();
conn.Update(new Proxyserver{
id = this.id,
protocol = this.protocol,
ip = this.ip,
port = this.port,
login = this.login,
pass = this.pass,
isuse = this.isuse});
this.project.SendInfoToLog("SET isuse = false item where id = " + this.id, false);
}
}
}
}