/// <summary> /// Pobiera informację o najbliższym zadaniu do wykonania /// </summary> /// <param name="instance">Identyfikator instancji workera</param> /// <returns> /// Informacje o zadaniu, napis "0", gdy nic nie zaplanowano /// lub komunikat o błędzie z bazy danych /// </returns> public static (FtpScheduleModel, string) GetNextSync(int instance) { var ret = new FtpScheduleModel(); SqlConnection conn = new SqlConnection(IFtpDiligentDatabaseClient.connStr); SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = "exec [ftp].[sp_select_next_sync] @ins_xx"; cmd.Parameters.Add("ins_xx", SqlDbType.Int).Value = instance; try { conn.Open(); var sdr = cmd.ExecuteReader(CommandBehavior.SingleRow); if (!sdr.Read()) { return(ret, "0"); } ret.xx = sdr.GetInt32(0); ret.name = sdr.GetString(1); ret.nextSyncTime = sdr.GetDateTimeOffset(2).LocalDateTime; sdr.Close(); } catch (SqlException oex) { return(ret, oex.Message); } catch (Exception sex) { return(ret, sex.Message); } finally { conn.Close(); } return(ret, string.Empty); }
/// <summary> /// Tworzenie, modyfikacja, usunięcie harmonogramu transferów FTP /// </summary> /// <param name="schedule">Definicja harmonogramu</param> /// <param name="mode">Rodzaj operacji</param> /// <returns>Komunikat o ewentualnym błędzie</returns> public static string ModifySchedule(FtpScheduleModel schedule, eDbOperation mode) { SqlCommand cmd = guiConn.CreateCommand(); cmd.CommandText = "exec [ftp].[sp_modify_schedule] @mode,@xx,@end_xx,@nazwa,@start,@stop,@stride,@disabled"; var par = cmd.Parameters; par.Add("mode", SqlDbType.Int).Value = (int)mode; par.Add("xx", SqlDbType.Int).Value = schedule.xx; par.Add("end_xx", SqlDbType.Int).Value = schedule.endXX; par.Add("nazwa", SqlDbType.VarChar, 128).Value = schedule.name; par.Add("start", SqlDbType.SmallInt).Value = (short)schedule.startSpan.TotalMinutes; par.Add("stop", SqlDbType.SmallInt).Value = (short)schedule.stopSpan.TotalMinutes; par.Add("stride", SqlDbType.SmallInt).Value = schedule.stride; par.Add("disabled", SqlDbType.TinyInt).Value = !schedule.enabled; if (mode == eDbOperation.Insert) { return(ExecuteNonQueryStoreKey(cmd)); } else { return(ExecuteNonQuery(cmd)); } }
/// <summary> /// Pobiera informację o najbliższym zadaniu do wykonania /// </summary> /// <param name="instance">Identyfikator instancji workera</param> /// <returns> /// Informacje o zadaniu, napis "0", gdy nic nie zaplanowano /// lub komunikat o błędzie z bazy danych /// </returns> public static (FtpScheduleModel, string) GetNextSync(int instance) { var ret = new FtpScheduleModel(); OracleConnection conn = new OracleConnection(IFtpDiligentDatabaseClient.connStr); OracleCommand cmd = conn.CreateCommand(); cmd.CommandText = "begin select_next_sync(:ins_xx,:refCur); end;"; cmd.Parameters.Add("ins_xx", OracleDbType.Int32).Value = instance; cmd.Parameters.Add("refCur", OracleDbType.RefCursor).Direction = ParameterDirection.Output; try { conn.Open(); var odr = cmd.ExecuteReader(CommandBehavior.SingleRow); if (!odr.Read()) { return(ret, "0"); } ret.xx = (int)odr.GetDecimal(0); ret.name = odr.GetString(1); ret.nextSyncTime = odr.GetDateTime(2); odr.Close(); } catch (OracleException oex) { return(ret, OracleMessageFormatter.FirstLine(oex.Message)); } catch (Exception sex) { return(ret, sex.Message); } finally { conn.Close(); } return(ret, string.Empty); }
/// <summary> /// Tworzenie, modyfikacja, usunięcie harmonogramu transferów FTP /// </summary> /// <param name="schedule">Definicja harmonogramu</param> /// <param name="mode">Rodzaj operacji</param> /// <returns>Komunikat o ewentualnym błędzie</returns> public static string ModifySchedule(FtpScheduleModel schedule, eDbOperation mode) { OracleCommand cmd = guiConn.CreateCommand(); cmd.CommandText = "begin modify_schedule2(:mode,:xx,:end_xx,:nazwa,:start,:stop,:stride,:disabled); end;"; var par = cmd.Parameters; par.Add("mode", OracleDbType.Int32).Value = (int)mode; par.Add("xx", OracleDbType.Int32).Value = schedule.xx; par.Add("end_xx", OracleDbType.Int32).Value = schedule.endXX; par.Add("nazwa", OracleDbType.Varchar2, 128).Value = schedule.name; par.Add("start", OracleDbType.Int16).Value = (short)schedule.startSpan.TotalMinutes; par.Add("stop", OracleDbType.Int16).Value = (short)schedule.stopSpan.TotalMinutes; par.Add("stride", OracleDbType.Int16).Value = schedule.stride; par.Add("disabled", OracleDbType.Byte).Value = !schedule.enabled; if (mode == eDbOperation.Insert) { return(ExecuteNonQueryStoreKeyAsync(cmd, 1).Result); } else { return(ExecuteNonQueryAsync(cmd).Result); } }
/// <summary> /// Wykonuje transfer plików na podstawie zaplanowanej pozycji harmonogramu /// Jest uruchamiana przez dispatcher o odpowiedniej porze i tylko dla poprawnych pozycji harmonogramu /// </summary> /// <param name="iSchXX"> /// Jeœli dodatni, to identyfikator pozycji harmonogramu uruchomionej automatycznie, /// jeœli ujemny, to identyfikator endpointu, dla którego transfer uruchomiono rêcznie /// </param> public void ExecuteFtpTransfer(object o) { FtpScheduleModel schedule = (FtpScheduleModel)o; int key = schedule.xx; var(endpoint, errmsg) = FtpDiligentDatabaseClient.SelectEndpoint(key).Result; if (!string.IsNullOrEmpty(errmsg)) { if (errmsg == "0") { errmsg = "Brak definicji endpointu dla harmonogramu: " + key; } m_mainWnd.ShowErrorInfo(eSeverityCode.Error, errmsg); return; } string remote = endpoint.host + endpoint.remDir; FtpSyncModel log = new FtpSyncModel() { xx = key, syncTime = endpoint.nextSync }; IFtpUtility fu = IFtpUtility.Create(endpoint, this, m_mainWnd.m_syncMode); eFtpDirection eDirection = endpoint.direction; if (key < 0) { m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Rozpoczêto transfer plików z serwera {remote}"); } else { m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Rozpoczêto zaplanowany transfer plików {schedule.name} z serwera {remote}"); } try { // transferuj pliki #region pobieranie if (eDirection.HasFlag(eFtpDirection.Get)) { if (!fu.Download(ref log)) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, $"Pobieranie plików z serwera {remote} zakoñczy³o siê niepowodzeniem"); return; } // loguj zmiany int filesTransfered = log.fileNames.Length; if (filesTransfered == 0) { FtpDiligentDatabaseClient.LogActivation(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Na serwerze {remote} nie znaleziono plików odpowiednich do pobrania"); } else { log.direction = eFtpDirection.Get; FtpDiligentDatabaseClient.LogSync(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Pobrano {filesTransfered} plików z serwera {remote}"); } } #endregion #region wstawianie if (eDirection.HasFlag(eFtpDirection.Put)) { if (!fu.Upload(ref log)) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, $"Wstawianie plików na serwer {remote} zakoñczy³o siê niepowodzeniem"); return; } // loguj zmiany int filesTransfered = log.fileNames.Length; if (filesTransfered == 0) { FtpDiligentDatabaseClient.LogActivation(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Nie znaleziono plików do wstawienia na serwer {remote}"); } else { log.direction = eFtpDirection.Put; FtpDiligentDatabaseClient.LogSync(log); m_mainWnd.ShowErrorInfo(eSeverityCode.Message, $"Wstawiono {filesTransfered} plików na serwer {remote}"); } } #endregion } catch (FtpUtilityException fex) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, fex.Message); } catch (Exception se) { m_mainWnd.ShowErrorInfo(eSeverityCode.TransferError, se.Message); } }