220 lines
7.5 KiB
C#
220 lines
7.5 KiB
C#
using SafeNetLib;
|
|
using System;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Xml;
|
|
|
|
namespace Landmarks_Import
|
|
{
|
|
internal class MainClass
|
|
{
|
|
public static Config cfg;
|
|
public static Boolean doneReadFromFile = false;
|
|
private volatile Queue LandmarksList = new Queue();
|
|
private volatile landmark tmpLand = null;
|
|
private DBhandle DB;
|
|
private string MyConString;
|
|
|
|
public MainClass()
|
|
{
|
|
}
|
|
|
|
public void Start()
|
|
{
|
|
LoadConfig();
|
|
if (!CheckFiles())
|
|
{
|
|
Console.ReadKey();
|
|
Thread.Sleep(2000);
|
|
return;
|
|
}
|
|
MyConString = "SERVER=" + cfg.SERVER + "; " +
|
|
"DATABASE=" + cfg.DATABASE + "; " +
|
|
"UID=" + cfg.UID + "; " +
|
|
"PASSWORD=" + cfg.PASSWORD + "; Pooling=false;";
|
|
DB = new DBhandle(MyConString, null);
|
|
DB.land_dupl = cfg.duplicatesFileName;
|
|
DB.StartDB();
|
|
StartThreads();
|
|
Console.ReadKey();
|
|
}
|
|
|
|
private void StartThreads()
|
|
{
|
|
ThreadPool.QueueUserWorkItem(state => ReadFromFile());
|
|
ThreadPool.QueueUserWorkItem(state => ProcessCoordinates());
|
|
}
|
|
|
|
#region Config and Working with Files
|
|
|
|
private bool LoadConfig()
|
|
{
|
|
bool ret = false;
|
|
cfg = new Config();
|
|
ret = true;
|
|
return ret;
|
|
}
|
|
|
|
private bool CheckFiles()
|
|
{
|
|
if (!File.Exists(cfg.fileName))
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.always, "Source file missing!");
|
|
return false;
|
|
}
|
|
if (File.Exists(cfg.fileName) && Path.GetExtension(cfg.fileName) != ".csv")
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.always, "Invalid file type! Only .csv accepted!");
|
|
return false;
|
|
}
|
|
if (!File.Exists(cfg.errorFileName))
|
|
{
|
|
File.Create(cfg.errorFileName);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private void ReadFromFile()
|
|
{
|
|
try
|
|
{
|
|
string line;
|
|
FileStream aFile = new FileStream(cfg.fileName, FileMode.Open);
|
|
StreamReader sr = new StreamReader(aFile);
|
|
//header
|
|
sr.ReadLine();
|
|
// read data in line by line
|
|
while ((line = sr.ReadLine()) != null)
|
|
{
|
|
Console.WriteLine(line);
|
|
//line = sr.ReadLine();
|
|
string[] csv = line.Split(',');
|
|
landmark lnd = new landmark();
|
|
lnd.name = string.Format("{0}-{1}-{2}", csv[2], csv[0], csv[1]);
|
|
lnd.address = string.Format("{0} {1} {2} {3} {4}", csv[3], csv[4], csv[5], csv[6], csv[7]);
|
|
lnd.icon = cfg.iconName;
|
|
lnd.radius = cfg.radius;
|
|
lnd.userID = cfg.userID;
|
|
getCoordinates(lnd.address, out lnd.lat, out lnd.lng, out lnd.innerException);
|
|
if (lnd.lat != -181 && lnd.lng != -181)
|
|
{
|
|
LandmarksList.Enqueue(lnd);
|
|
}
|
|
else
|
|
{
|
|
WriteErrorsToFile(lnd.address, lnd.innerException);
|
|
}
|
|
Thread.Sleep(cfg.timeRequest);
|
|
}
|
|
sr.Close();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.ToString());
|
|
}
|
|
}
|
|
|
|
private void WriteErrorsToFile(string invalidAddress, string exception)
|
|
{
|
|
try
|
|
{
|
|
using (System.IO.StreamWriter file = File.AppendText(cfg.errorFileName))
|
|
{
|
|
file.WriteLine(DateTime.Now.ToString() + "," + invalidAddress + "," + exception);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(ex.ToString());
|
|
}
|
|
}
|
|
|
|
#endregion Config and Working with Files
|
|
|
|
#region Coordinates
|
|
|
|
private volatile XmlDocument doc = null;
|
|
|
|
private volatile XmlNode element = null;
|
|
|
|
private void getCoordinates(String address, out decimal LAT, out decimal LNG, out string innerEx)
|
|
{
|
|
doc = new XmlDocument();
|
|
LNG = -181; LAT = -181; innerEx = "";
|
|
try
|
|
{
|
|
// Note: Generally, you should store your private key someplace safe
|
|
// and read them into your code
|
|
const string keyString = "SWWf2O7SWZMGAMqsJj8Am1x3zdE=";
|
|
// The URL shown in these examples is a static URL which should already
|
|
// be URL-encoded. In practice, you will likely have code
|
|
// which assembles your URL from user or web service input
|
|
// and plugs those values into its parameters.
|
|
string urlString = "https://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&client=gme-safemobile";
|
|
|
|
string url = GoogleSignedUrl.Sign(urlString, keyString);
|
|
doc.Load(url);
|
|
|
|
#region oldcode
|
|
|
|
//direct link without credentials
|
|
//doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?address=" + address + "&sensor=false");
|
|
|
|
#endregion oldcode
|
|
|
|
element = doc.SelectSingleNode("//GeocodeResponse/status");
|
|
if (element.InnerText == "OK")
|
|
{
|
|
element = doc.SelectSingleNode("//GeocodeResponse/result/geometry/location/lat");
|
|
LAT = Convert.ToDecimal(element.InnerText);
|
|
element = doc.SelectSingleNode("//GeocodeResponse/result/geometry/location/lng");
|
|
LNG = Convert.ToDecimal(element.InnerText);
|
|
}
|
|
else
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.always, "Failed to retrieve coordinates for address:" + address + " response:" + element.InnerText);
|
|
innerEx = element.InnerText;
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Utils.ConsWrite(DebugMSG_Type.always, "Error on coordinates calc:" + ex.ToString());
|
|
//WriteErrorsToFile(address);
|
|
}
|
|
//Utils.ConsWrite(DebugMSG_Type.always, string.Format("Prin google: lat={0}, lng={1}", LAT, LNG));
|
|
}
|
|
|
|
private void ProcessCoordinates()
|
|
{
|
|
int Counter = 0;
|
|
int ExitCounter = 0;
|
|
while (true)
|
|
{
|
|
while (LandmarksList.Count > 0)
|
|
{
|
|
ExitCounter = 0;
|
|
tmpLand = (landmark)LandmarksList.Dequeue();
|
|
Counter++;
|
|
Utils.WriteLine("Counter value:" + Counter,ConsoleColor.Green);
|
|
DB.Insert_Landmark(tmpLand);
|
|
}
|
|
if(LandmarksList.Count == 0)
|
|
{
|
|
ExitCounter++;
|
|
Console.WriteLine("Nothing to process!");
|
|
Thread.Sleep(1000);
|
|
if(ExitCounter==10)
|
|
{
|
|
Console.WriteLine("Job done!");
|
|
return;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
#endregion Coordinates
|
|
}
|
|
} |