static CrawlerApi() { Db = DbApi.Create(); lock (Db) { try { CrawlerId = Log.EntryAssemblyName; Record r = Db.Get("SELECT State FROM Crawlers WHERE Id=@Id").GetFirstRecord("@Id", CrawlerId); if (r == null) { LogMessage.Exit("Crawler id '" + CrawlerId + "' does not exist in [Crawlers] table."); } if ((Crawler.State)r["State"] == Crawler.State.DISABLED) { LogMessage.Exit("Crawler id '" + CrawlerId + "' is disabled."); } ProductsTable = Db.CreateProductsTableForCrawler(CrawlerId); Session.Closing += session_Closing; string archive = "session_start_time:" + (r["_SessionStartTime"] != null ? ((DateTime)r["_SessionStartTime"]).ToString("yyyy-MM-dd HH:mm:ss") : "") + " start_time:" + (r["_LastStartTime"] != null ? ((DateTime)r["_LastStartTime"]).ToString("yyyy-MM-dd HH:mm:ss") : "") + " end_time:" + (r["_LastEndTime"] != null ? ((DateTime)r["_LastEndTime"]).ToString("yyyy-MM-dd HH:mm:ss") : "") + " state:" + (r["_LastSessionState"] != null ? ((Crawler.SessionState)r["_LastSessionState"]).ToString() : "") + " log:" + r["_LastLog"] + "\n" + r["_Archive"]; const int MAX_ARCHIVE_LENGTH = 10000; archive = archive.Substring(0, archive.Length < MAX_ARCHIVE_LENGTH ? archive.Length : MAX_ARCHIVE_LENGTH); if (Db.Get("UPDATE Crawlers SET _SessionStartTime=@SessionStartTime, _LastProcessId=@ProcessId, _LastStartTime=GETDATE(), _LastEndTime=NULL, _LastSessionState=" + (int)Crawler.SessionState.STARTED + ", _LastLog=@Log, _Archive=@Archive WHERE Id=@Id").Execute( "@SessionStartTime", Session.This.StartTime, "@ProcessId", Process.GetCurrentProcess().Id, "@Log", Log.SessionDir, "@Archive", archive, "@Id", CrawlerId) < 1 ) { throw new Exception("Could not update Crawlers table."); } Log.Main.Write(Log.MessageType.INFORM, CrawlerApi.MessageMark.STARTED + "\r\nCommand line: " + string.Join("|", Environment.GetCommandLineArgs()) + "\n Running as: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name); } catch (Exception e) { LogMessage.Exit(e); } } }
static public void LoadFromDatabase(Assembly assembly, System.Configuration.ApplicationSettingsBase settings) { Assembly entry_assembly = Assembly.GetEntryAssembly(); string scope = entry_assembly.GetName().Name; string key = KEY_PREFIX + assembly.GetName().Name; DbApi di = DbApi.Create(); Dictionary <string, object> setting_names2value = Cliver.Bot.DbSettings.Get <Dictionary <string, object> >(di, scope, key); if (setting_names2value == null) { setting_names2value = new Dictionary <string, object>(); } FieldInfo fi = settings.GetType().GetField("defaultInstance", BindingFlags.NonPublic | BindingFlags.Static); PropertyInfo[] pis = fi.FieldType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); bool new_property = false; foreach (PropertyInfo pi in pis) { string name = pi.DeclaringType.FullName + "." + pi.Name; object value; if (setting_names2value.TryGetValue(name, out value)) { if (!pi.CanWrite) { Log.Warning("Settings '" + name + "' is not writable."); continue; } if (pi.PropertyType == typeof(int) && value is string) { value = int.Parse((string)value); } pi.SetValue(settings, value); } else { new_property = true; setting_names2value[name] = pi.GetValue(settings); } } if (new_property) { Cliver.Bot.DbSettings.Save(di, scope, key, setting_names2value); } }
protected Service() { Db = DbApi.Create(); lock (Db) { try { ServiceId = Log.EntryAssemblyName; ThreadLog.Exitig += ThreadLog_Exitig; Record r = Db.Get("SELECT State FROM Services WHERE Id=@Id").GetFirstRecord("@Id", ServiceId); if (r == null) { LogMessage.Exit("Service id '" + ServiceId + "' does not exist in [Services] table."); } if ((Service.State)r["State"] == Service.State.DISABLED) { LogMessage.Exit("Service id '" + ServiceId + "' is disabled."); } string archive = " start_time:" + (r["_LastStartTime"] != null ? ((DateTime)r["_LastStartTime"]).ToString("yyyy-MM-dd HH:mm:ss") : "") + " end_time:" + (r["_LastEndTime"] != null ? ((DateTime)r["_LastEndTime"]).ToString("yyyy-MM-dd HH:mm:ss") : "") + " state:" + (r["_LastSessionState"] != null ? ((Service.SessionState)r["_LastSessionState"]).ToString() : "") + " log:" + r["_LastLog"] + "\n" + r["_Archive"]; const int MAX_ARCHIVE_LENGTH = 10000; archive = archive.Substring(0, archive.Length < MAX_ARCHIVE_LENGTH ? archive.Length : MAX_ARCHIVE_LENGTH); if (1 > Db.Get("UPDATE Services SET _LastProcessId=@ProcessId, _LastStartTime=GETDATE(), _LastEndTime=NULL, _LastSessionState=" + (int)Service.SessionState.STARTED + ", _LastLog=@Log, _Archive=@Archive WHERE Id=@Id").Execute( "@ProcessId", Process.GetCurrentProcess().Id, "@Log", Log.WorkDir, "@Archive", archive, "@Id", ServiceId) ) { throw new Exception("Could not update Services table."); } } catch (Exception e) { LogMessage.Error(e); } } }
static public void Save(string scope, string key, Dictionary <string, object> setting_names2value) { Cliver.Bot.DbSettings.Save(DbApi.Create(), scope, key, setting_names2value); }