493 lines
18 KiB
C#
Executable File
493 lines
18 KiB
C#
Executable File
using System;
|
|
using System.Text;
|
|
using System.Collections.Generic;
|
|
using MySql.Data.MySqlClient;
|
|
using MarketData.MarketDataModel;
|
|
using MarketData.Utils;
|
|
|
|
namespace MarketData.DataAccess
|
|
{
|
|
public class SECFilingDA
|
|
{
|
|
private SECFilingDA()
|
|
{
|
|
}
|
|
public static List<String> GetDistinctFilingSymbols()
|
|
{
|
|
List<String> distinctSymbols = new List<String>();
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
MySqlCommand sqlCommand=null;
|
|
String strQuery = null;
|
|
|
|
try
|
|
{
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append("select distinct(symbol) from secfilings order by symbol asc");
|
|
strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlDataReader = sqlCommand.ExecuteReader();
|
|
while (sqlDataReader.Read())
|
|
{
|
|
distinctSymbols.Add(sqlDataReader.GetString(0));
|
|
}
|
|
return distinctSymbols;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return null;
|
|
}
|
|
finally
|
|
{
|
|
if(null!=sqlCommand)sqlCommand.Dispose();
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
public static List<DateTime> GetDistinctFilingDatesForSymbol(String symbol)
|
|
{
|
|
List<DateTime> distinctFilingDates = new List<DateTime>();
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
MySqlCommand sqlCommand =null;
|
|
String strQuery = null;
|
|
|
|
try
|
|
{
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append("select distinct(filing_date) from secfilings where symbol=");
|
|
sb.Append(SqlUtils.AddQuotes(symbol));
|
|
sb.Append(" order by 1 desc");
|
|
strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlDataReader = sqlCommand.ExecuteReader();
|
|
while (sqlDataReader.Read())
|
|
{
|
|
distinctFilingDates.Add(sqlDataReader.GetDateTime(0));
|
|
}
|
|
return distinctFilingDates;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return null;
|
|
}
|
|
finally
|
|
{
|
|
if(null!=sqlCommand)sqlCommand.Dispose();
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
public static SEC13Info GetSEC13Info(String symbol)
|
|
{
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
MySqlCommand sqlCommand=null;
|
|
String strQuery = null;
|
|
SEC13Info sec13Info=new SEC13Info();
|
|
|
|
try
|
|
{
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
StringBuilder sb = new StringBuilder();
|
|
sec13Info.Symbol=symbol;
|
|
sb.Append(" select symbol,max(filing_date),count(*) from secfilings where symbol='").Append(symbol).Append("' and (form like '%13D%' or form like '%13G%')");
|
|
sb.Append(" group by symbol having datediff(curdate(),max(filing_date))<180");
|
|
strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlDataReader = sqlCommand.ExecuteReader();
|
|
if (!sqlDataReader.Read()) return sec13Info;
|
|
sec13Info.SEC13=true;
|
|
sec13Info.MostRecentFilingDate=sqlDataReader.GetDateTime(1);
|
|
sec13Info.Filings=sqlDataReader.GetInt32(2);
|
|
return sec13Info;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return sec13Info;
|
|
}
|
|
finally
|
|
{
|
|
if(null!=sqlCommand)sqlCommand.Dispose();
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
public static bool HaveSECFiling(SECFiling secFiling)
|
|
{
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
MySqlCommand sqlCommand=null;
|
|
String strQuery = null;
|
|
|
|
try
|
|
{
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append("select count(*) from secfilings ");
|
|
sb.Append("where symbol=").Append(SqlUtils.AddQuotes(secFiling.Symbol)).Append(" ");
|
|
sb.Append("and filing_date=").Append(SqlUtils.AddQuotes(Utility.DateTimeToStringYYYYHMMHDD(secFiling.FilingDate))).Append(" ");
|
|
sb.Append("and sec_accession_number=").Append(SqlUtils.AddQuotes(secFiling.SECAccessionNumber)).Append(" ");
|
|
sb.Append("and sequence=").Append(secFiling.Sequence).Append(" ");
|
|
strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlDataReader = sqlCommand.ExecuteReader();
|
|
if (!sqlDataReader.Read()) return false;
|
|
int recordCount = sqlDataReader.GetInt32(0);
|
|
return recordCount > 0 ? true : false;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
if(null!=sqlCommand)sqlCommand.Dispose();
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
public static bool DeleteSECFiling(SECFiling secFiling,MySqlTransaction sqlTransaction)
|
|
{
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
MySqlCommand sqlCommand =null;
|
|
String strQuery = null;
|
|
|
|
try
|
|
{
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.Append("delete from secfilings ");
|
|
sb.Append("where symbol=").Append(SqlUtils.AddQuotes(secFiling.Symbol)).Append(" ");
|
|
sb.Append("and filing_date=").Append(SqlUtils.AddQuotes(Utility.DateTimeToStringYYYYHMMHDD(secFiling.FilingDate)));
|
|
sb.Append("and sec_accession_number=").Append(SqlUtils.AddQuotes(secFiling.SECAccessionNumber));
|
|
sb.Append("and sequence=").Append(secFiling.Sequence);
|
|
strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection,sqlTransaction);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlCommand.ExecuteNonQuery();
|
|
return true;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
if(null!=sqlCommand)sqlCommand.Dispose();
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
public static bool InsertOrUpdateSECFilings(SECFilings secFilings)
|
|
{
|
|
MySqlTransaction sqlTransaction = null;
|
|
MySqlConnection sqlConnection = null;
|
|
|
|
try
|
|
{
|
|
secFilings=secFilings.Distinct();
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
|
|
for (int index = 0; index < secFilings.Count; index++)
|
|
{
|
|
SECFiling secFiling = secFilings[index];
|
|
if (HaveSECFiling(secFiling)) DeleteSECFiling(secFiling,sqlTransaction);
|
|
InsertSECFiling(secFiling,sqlConnection,sqlTransaction);
|
|
}
|
|
sqlTransaction.Commit();
|
|
return true;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
if (null != sqlTransaction)
|
|
{
|
|
sqlTransaction.Dispose();
|
|
sqlTransaction = null;
|
|
}
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
}
|
|
}
|
|
public static bool InsertSECFilings(SECFilings secFilings)
|
|
{
|
|
MySqlTransaction sqlTransaction = null;
|
|
MySqlConnection sqlConnection = null;
|
|
|
|
try
|
|
{
|
|
secFilings=secFilings.Distinct();
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
sqlTransaction = sqlConnection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);
|
|
for (int index = 0; index < secFilings.Count; index++)
|
|
{
|
|
SECFiling secFiling = secFilings[index];
|
|
if (HaveSECFiling(secFiling)) continue;
|
|
InsertSECFiling(secFiling, sqlConnection, sqlTransaction);
|
|
}
|
|
sqlTransaction.Commit();
|
|
return true;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
if (null != sqlTransaction)
|
|
{
|
|
sqlTransaction.Dispose();
|
|
sqlTransaction = null;
|
|
}
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
}
|
|
}
|
|
private static bool InsertSECFiling(SECFiling secFiling,MySqlConnection sqlConnection,MySqlTransaction sqlTransaction)
|
|
{
|
|
MySqlCommand sqlCommand = null;
|
|
try
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sqlCommand = new MySqlCommand();
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlCommand.Connection = sqlConnection;
|
|
sb.Append("insert into secfilings(sec_accession_number,sequence,symbol,filing_date,form,form_text,description,sec_filing_url)");
|
|
sb.Append(" values(?sec_accession_number,?sequence,?symbol,?filing_date,?form,?form_text,?description,?secFilingUrl);");
|
|
MySqlParameter secAccessionNumberParameter = new MySqlParameter("?sec_accession_number", MySqlDbType.VarChar,50);
|
|
MySqlParameter sequenceParameter = new MySqlParameter("?sequence", MySqlDbType.Int32);
|
|
MySqlParameter symbolParameter = new MySqlParameter("?symbol", MySqlDbType.VarChar, 15);
|
|
MySqlParameter filingDateParameter = new MySqlParameter("?filing_date", MySqlDbType.DateTime);
|
|
MySqlParameter formParameter = new MySqlParameter("?form", MySqlDbType.VarChar,25);
|
|
MySqlParameter formTextParameter = new MySqlParameter("?form_text", MySqlDbType.Blob, secFiling.FormText.Length);
|
|
MySqlParameter descriptionParameter = new MySqlParameter("?description", MySqlDbType.VarChar, 128);
|
|
MySqlParameter secFilingUrlParameter = new MySqlParameter("?secFilingUrl", MySqlDbType.VarChar, 255);
|
|
secAccessionNumberParameter.Value = secFiling.SECAccessionNumber;
|
|
sequenceParameter.Value = secFiling.Sequence;
|
|
symbolParameter.Value = secFiling.Symbol;
|
|
filingDateParameter.Value=Utility.DateTimeToStringYYYYHMMHDD(secFiling.FilingDate);
|
|
formParameter.Value=secFiling.Form;
|
|
formTextParameter.Value = Utility.Compress(secFiling.FormText);
|
|
descriptionParameter.Value = secFiling.Description;
|
|
secFilingUrlParameter.Value = secFiling.SecFilingUrl;
|
|
sqlCommand.Parameters.Add(secAccessionNumberParameter);
|
|
sqlCommand.Parameters.Add(symbolParameter);
|
|
sqlCommand.Parameters.Add(filingDateParameter);
|
|
sqlCommand.Parameters.Add(formParameter);
|
|
sqlCommand.Parameters.Add(formTextParameter);
|
|
sqlCommand.Parameters.Add(descriptionParameter);
|
|
sqlCommand.Parameters.Add(secFilingUrlParameter);
|
|
sqlCommand.Parameters.Add(sequenceParameter);
|
|
sqlCommand.CommandText = sb.ToString();
|
|
sqlCommand.ExecuteNonQuery();
|
|
return true;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return false;
|
|
}
|
|
finally
|
|
{
|
|
if (null != sqlCommand)
|
|
{
|
|
sqlCommand.Dispose();
|
|
sqlCommand = null;
|
|
}
|
|
}
|
|
}
|
|
public static SECFilings GetSECFilings(String symbol)
|
|
{
|
|
MySqlCommand sqlCommand = null;
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
SECFilings secFilings = new SECFilings();
|
|
try
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sqlCommand = null;
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
sb.Append("select symbol,filing_date,form,length(form_text),form_text,description,sec_filing_url,sequence,sec_accession_number from secfilings ");
|
|
sb.Append("where symbol='").Append(symbol).Append("' order by filing_date desc");
|
|
String strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlDataReader=sqlCommand.ExecuteReader();
|
|
while (sqlDataReader.Read())
|
|
{
|
|
SECFiling secFiling = new SECFiling();
|
|
secFiling.Symbol = sqlDataReader.GetString(0);
|
|
secFiling.FilingDate = sqlDataReader.GetDateTime(1);
|
|
secFiling.Form = sqlDataReader.GetString(2);
|
|
int lengthFormText=sqlDataReader.GetInt32(3);
|
|
byte[] formTextBytes=new byte[lengthFormText];
|
|
sqlDataReader.GetBytes(4,0,formTextBytes,0,lengthFormText);
|
|
secFiling.FormText=Utility.Decompress(formTextBytes);
|
|
secFiling.Description = sqlDataReader.GetString(5);
|
|
secFiling.SecFilingUrl = sqlDataReader.GetString(6);
|
|
secFiling.Sequence = sqlDataReader.GetInt32(7);
|
|
secFiling.SECAccessionNumber = sqlDataReader.GetString(8);
|
|
secFilings.Add(secFiling);
|
|
}
|
|
return secFilings;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return null;
|
|
}
|
|
finally
|
|
{
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlCommand)
|
|
{
|
|
sqlCommand.Dispose();
|
|
sqlCommand = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
public static SECFilings GetSECFilings(String symbol,DateTime filingDate)
|
|
{
|
|
MySqlCommand sqlCommand = null;
|
|
MySqlConnection sqlConnection = null;
|
|
MySqlDataReader sqlDataReader = null;
|
|
SECFilings secFilings = new SECFilings();
|
|
try
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
sqlCommand = null;
|
|
sqlConnection = SqlUtils.CreateMySqlConnection(MainDataSource.Instance.LocateDataSource("market_data"));
|
|
sb.Append("select symbol,filing_date,form,length(form_text),form_text,description,sec_filing_url,sequence,sec_accession_number from secfilings ");
|
|
sb.Append("where symbol=").Append(SqlUtils.AddQuotes(symbol));
|
|
sb.Append(" and filing_date=").Append(SqlUtils.AddQuotes(Utility.DateTimeToStringYYYYHMMHDD(filingDate)));
|
|
sb.Append(" order by filing_date desc");
|
|
String strQuery = sb.ToString();
|
|
sqlCommand = new MySqlCommand(strQuery, sqlConnection);
|
|
sqlCommand.CommandTimeout = SqlUtils.COMMAND_TIMEOUT;
|
|
sqlDataReader = sqlCommand.ExecuteReader();
|
|
while (sqlDataReader.Read())
|
|
{
|
|
SECFiling secFiling = new SECFiling();
|
|
secFiling.Symbol = sqlDataReader.GetString(0);
|
|
secFiling.FilingDate = sqlDataReader.GetDateTime(1);
|
|
secFiling.Form = sqlDataReader.GetString(2);
|
|
int lengthFormText = sqlDataReader.GetInt32(3);
|
|
byte[] formTextBytes = new byte[lengthFormText];
|
|
sqlDataReader.GetBytes(4, 0, formTextBytes, 0, lengthFormText);
|
|
secFiling.FormText = Utility.Decompress(formTextBytes);
|
|
secFiling.Description = sqlDataReader.GetString(5);
|
|
secFiling.SecFilingUrl = sqlDataReader.GetString(6);
|
|
secFiling.Sequence = sqlDataReader.GetInt32(7);
|
|
secFiling.SECAccessionNumber = sqlDataReader.GetString(8);
|
|
secFilings.Add(secFiling);
|
|
}
|
|
return secFilings;
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
MDTrace.WriteLine(LogLevel.DEBUG,exception);
|
|
return null;
|
|
}
|
|
finally
|
|
{
|
|
if (null != sqlConnection)
|
|
{
|
|
sqlConnection.Close();
|
|
sqlConnection = null;
|
|
}
|
|
if (null != sqlCommand)
|
|
{
|
|
sqlCommand.Dispose();
|
|
sqlCommand = null;
|
|
}
|
|
if (null != sqlDataReader)
|
|
{
|
|
sqlDataReader.Close();
|
|
sqlDataReader.Dispose();
|
|
sqlDataReader = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|