Exemplo n.º 1
0
        public Task CommitTransactionAsync(string message, bool restart = true)
        {
            return(RunOnMain(() =>
            {
                if (m_options.Dryrun)
                {
                    if (!restart)
                    {
                        if (m_transaction != null)
                        {
                            m_transaction.Rollback();
                        }
                        m_transaction = null;
                    }
                    return;
                }

                using (new Logging.Timer(LOGTAG, "CommitTransactionAsync", message))
                    m_transaction.Commit();
                if (restart)
                {
                    m_transaction = m_db.BeginTransaction();
                }
                else
                {
                    m_transaction = null;
                }
            }));
        }
Exemplo n.º 2
0
        public bool AddTask(string commandString, string component, string terminalName)
        {
            if (terminalName == null || terminalName.Length == 0)
            {
                terminalName = Lfx.Environment.SystemInformation.MachineName;
            }

            qGen.Insert Comando = new qGen.Insert("sys_programador");
            Comando.ColumnValues.AddWithValue("crea_estacion", Lfx.Environment.SystemInformation.MachineName);
            Comando.ColumnValues.AddWithValue("crea_usuario", "");                    // TODO: que ponga el nombre de usuario
            Comando.ColumnValues.AddWithValue("estacion", terminalName);
            Comando.ColumnValues.AddWithValue("comando", commandString);
            Comando.ColumnValues.AddWithValue("componente", component);
            Comando.ColumnValues.AddWithValue("fecha", new qGen.SqlExpression("NOW()"));
            Comando.ColumnValues.AddWithValue("fechaejecutar", null);

            try {
                using (System.Data.IDbTransaction Trans = this.DataBase.BeginTransaction()) {
                    this.DataBase.ExecuteNonQuery(Comando);
                    Trans.Commit();
                }
            }
            catch {
                return(true);
            }

            return(false);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 插入教练信息和绑定信息
        /// </summary>
        /// <param name="coach"></param>
        /// <returns></returns>
        private static bool ImportCoach(Sys.Models.Coach coach)
        {
            System.Data.IDbConnection connection = Comm.Helper.DapperHelper.Instance;
            connection.Open();
            System.Data.IDbTransaction transaction = connection.BeginTransaction();

            try
            {
                int coach_id             = connection.Insert <Sys.Models.Coach>(coach, transaction);
                var student_venue_result = connection.Insert <Sys.Models.Coach_Venue>(new Sys.Models.Coach_Venue()
                {
                    AddTime = DateTime.Now,
                    CoachID = coach_id,
                    VenueID = coach.VenueID,
                }, transaction);

                transaction.Commit();
                return(true);
            }
            catch (Exception ex)
            {
                logs.Error("教练添加失败", ex);
                transaction.Rollback();
                return(false);
            }
            finally
            {
                connection.Close();
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 插入学生信息和绑定信息
        /// </summary>
        /// <param name="student"></param>
        /// <returns></returns>
        private static bool ImportStudent(Sys.Models.Student student)
        {
            System.Data.IDbConnection connection = Comm.Helper.DapperHelper.Instance;
            connection.Open();
            System.Data.IDbTransaction transaction = connection.BeginTransaction();

            try
            {
                student.State = 1;
                int student_id           = connection.Insert <Sys.Models.Student>(student, transaction);
                var student_venue_result = connection.Insert <Sys.Models.Student_Venue>(new Sys.Models.Student_Venue()
                {
                    AddTime   = DateTime.Now,
                    StudentID = student_id,
                    VenueID   = student.VenueID,
                }, transaction);

                transaction.Commit();
                return(true);
            }
            catch (Exception ex)
            {
                logs.Error("学生添加失败", ex);
                transaction.Rollback();
                return(false);
            }
            finally
            {
                connection.Close();
            }
        }
Exemplo n.º 5
0
 public void Commit()
 {
     if (m_isTemporary)
     {
         m_parent.Commit();
     }
 }
Exemplo n.º 6
0
 public override Lfx.Types.OperationResult SolicitudEliminacion(Lbl.ListaIds codigos)
 {
     using (Lui.Forms.YesNoDialog Pregunta = new Lui.Forms.YesNoDialog(@"Una vez anulados, los comprobantes deberán ser archivados en todas sus copias y no podrán ser rehabilitados ni reutilizados.", @"¿Está seguro de que desea anular?"))
     {
         Pregunta.DialogButtons = Lui.Forms.DialogButtons.YesNo;
         if (Pregunta.ShowDialog() == System.Windows.Forms.DialogResult.OK)
         {
             int IdRemito = codigos[0];
             System.Data.IDbTransaction Trans = this.Connection.BeginTransaction(System.Data.IsolationLevel.Serializable);
             System.Data.DataTable      Tabla = this.Connection.Select("select id_comprob from comprob where id_remito=" + IdRemito + " and anulada=0;");
             if (Tabla == null || Tabla.Rows.Count == 0)
             {
                 Lbl.Comprobantes.ComprobanteConArticulos Rem = new Lbl.Comprobantes.ComprobanteConArticulos(Connection, IdRemito);
                 if (Rem.Anulado == false)
                 {
                     Rem.Anular(false);
                     Trans.Commit();
                 }
             }
             else
             {
                 Lui.Forms.MessageBox.Show("No se puede anular si se encuentra relacionada con una factura", "¡Error!");
             }
         }
     }
     return(new Lfx.Types.SuccessOperationResult());
 }
Exemplo n.º 7
0
        public static void SetAttendanceState(string code, int state)
        {
            string sql1 = "select * from attendance where code='" + code + "' and [date]='" + DateTime.Today.ToString("s") + "'";
            string sql2 = "insert into attendance(id, code, [date], [state])";

            sql2 += " values(null, '" + code + "', '" + DateTime.Today.ToString("s") + "'," + state + ")";
            string sql3 = "update attendance set state=" + state + " where code='" + code + "'";

            //db.Connection.Open();
            System.Data.IDbTransaction trans = db.Connection.BeginTransaction();
            try
            {
                var o = db.Connection.Query(sql1, null, trans).ToList();

                if (o.Count == 0)
                {
                    db.Connection.Execute(sql2, null, trans);
                }
                else
                {
                    db.Connection.Execute(sql3, null, trans);
                }

                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Rollback();
                throw (ex);
            }
            finally
            {
                //db.Connection.Close();
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// 确认上课完成
        /// </summary>
        /// <param name="pKID">课程编号</param>
        /// <param name="venueID">场馆编号</param>
        /// <param name="teachState">排课表编号</param>
        /// <param name="curriculumState">学生排课关联表状态</param>
        /// <returns></returns>
        public static bool DoneTeachingSche(int pKID, int venueID,
                                            Sys.Models.StateEnum.TeachingSchedule teachState,
                                            Sys.Models.StateEnum.Curriculum curriculumState)
        {
            System.Data.IDbConnection connection = Comm.Helper.DapperHelper.Instance;
            connection.Open();
            System.Data.IDbTransaction transaction = connection.BeginTransaction();

            try
            {
                var teachingInfo = DapperHelper.Instance.Get <Sys.Models.TeachingSchedule>(pKID);
                if (teachingInfo.VenueID != venueID)
                {
                    throw new Comm.YYException.YYException("操作非法");
                }

                var sql = "SELECT StudentID  FROM [dbo].[Curriculum]  where PKID=@pkID and [State]=@state";

                var result = DapperHelper.Instance.Query <int>(sql, new
                {
                    pkId  = pKID,
                    state = Sys.Models.StateEnum.Curriculum.InClassTeachingSche
                });

                //没有约课成功的学生则认为已经处理完成
                if (result == null || result.Count() == 0)
                {
                    return(true);
                }

                //修改排课状态
                var updateCurriculumSql = "update Curriculum set State=@state where PKID=@pkId";
                int updateCurriculum    = connection.Execute(updateCurriculumSql, new
                {
                    pkId  = pKID,
                    state = Convert.ToInt32(curriculumState)
                }, transaction);

                teachingInfo.State = Convert.ToInt32(teachState);
                connection.Update(teachingInfo, transaction);

                transaction.Commit();
                return(true);
            }
            catch (Comm.YYException.YYException)
            {
                throw;
            }
            catch (Exception ex)
            {
                logs.Error("确认上课完成失败", ex);
                transaction.Rollback();
                return(false);
            }
            finally
            {
                connection.Close();
            }
        }
Exemplo n.º 9
0
        public static int Ins <T>(this System.Data.IDbConnection cnn
                                  , System.Collections.Generic.IEnumerable <T> entities
                                  , int?commandTimeout = null
                                  , System.Data.CommandType?commandType = null)
        {
            int  ret     = -1;
            bool wasOpen = false;

            if (cnn.State != System.Data.ConnectionState.Open)
            {
                cnn.Open();
            }
            else
            {
                wasOpen = true;
            }

            System.Data.IDbTransaction transaction = cnn.BeginTransaction();

            // string sql = "INSERT INTO T VALUES (@A, @B)";
            string sql = TableInfoCache <T> .Instance.InsertStatement;

            try
            {
                ret = cnn.Execute(sql, entities, transaction);
                transaction.Commit();
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine("Commit Exception Type: {0}", ex.GetType().FullName);
                System.Console.WriteLine("  Message: {0}", ex.Message);

                // Attempt to roll back the transaction.
                try
                {
                    transaction.Rollback();
                }
                catch (System.Exception ex2)
                {
                    // This catch block will handle any errors that may have occurred
                    // on the server that would cause the rollback to fail, such as a closed connection.
                    System.Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType().FullName);
                    System.Console.WriteLine("  Message: {0}", ex2.Message);
                }

                throw;
            }
            finally
            {
                if (!wasOpen && cnn.State != System.Data.ConnectionState.Closed)
                {
                    cnn.Close();
                }
            }

            return(ret);
        }
Exemplo n.º 10
0
        public override void PreImportar()
        {
            base.PreImportar();

            using (System.Data.IDbTransaction Trans = this.Connection.BeginTransaction()) {
                this.Connection.ExecuteNonQuery("UPDATE personas SET import_id=1 WHERE id_persona=999");
                Trans.Commit();
            }
        }
Exemplo n.º 11
0
        public override void PostImportar()
        {
            base.PostImportar();

            using (System.Data.IDbTransaction Trans = this.Connection.BeginTransaction()) {
                this.Connection.ExecuteNonQuery("UPDATE comprob a SET total=(SELECT SUM(importe) FROM comprob_detalle b WHERE a.id_comprob=b.id_comprob)");
                this.Connection.ExecuteNonQuery("UPDATE comprob SET totalreal=total, subtotal=total, cancelado=total");
                Trans.Commit();
            }
        }
Exemplo n.º 12
0
        public List <long> GetVybavOdvybavDoklady(long[] Ids, bool pri)
        {
            // Vybavi doklady. V zozname by mali byt iba V jedněho typu

            var result = new List <long>();

            System.Data.IDbTransaction transaction = this.BeginTransaction();

            try
            {
                if (pri)
                {
                    var doklady = GetList(Db.From <tblD_PRI_0>().Where(x => Sql.In(x.D_PRI_0, Ids)));
                    if (!doklady.Any())
                    {
                        throw new WebEasValidationException(null, "No receipts found");
                    }

                    foreach (var dkl in doklady)
                    {
                        dkl.V = !dkl.V;
                        UpdateData(dkl);
                    }
                }
                else
                {
                    var doklady = GetList(Db.From <tblD_VYD_0>().Where(x => Sql.In(x.D_VYD_0, Ids)));
                    if (!doklady.Any())
                    {
                        throw new WebEasValidationException(null, "No expenses found");
                    }
                    foreach (var dkl in doklady)
                    {
                        dkl.V = !dkl.V;
                        UpdateData(dkl);
                    }
                }

                transaction.Commit();
            }
            catch (WebEasException ex)
            {
                transaction.Rollback();
                throw ex;
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw new WebEasException("Nastala chyba pri vybavovaní dokladu", "Nastala chyba pri vybavovaní dokladu", ex);
            }

            return(result);

            //return result;
        }
Exemplo n.º 13
0
        public static int ExecuteNonQuery(System.Data.IDbCommand cmd)
        {
            int iAffected = -1;

            using (System.Data.IDbConnection idbConn = GetConnection())
            {
                lock (idbConn)
                {
                    lock (cmd)
                    {
                        cmd.Connection = idbConn;

                        if (cmd.Connection.State != System.Data.ConnectionState.Open)
                        {
                            cmd.Connection.Open();
                        }

                        using (System.Data.IDbTransaction idbtTrans = idbConn.BeginTransaction())
                        {
                            try
                            {
                                cmd.Transaction = idbtTrans;

                                iAffected = cmd.ExecuteNonQuery();
                                idbtTrans.Commit();
                            } // End Try
                            catch (System.Data.Common.DbException ex)
                            {
                                if (idbtTrans != null)
                                {
                                    idbtTrans.Rollback();
                                }

                                iAffected = -2;

                                if (Log(ex))
                                {
                                    throw;
                                }
                            } // End catch
                            finally
                            {
                                if (cmd.Connection.State != System.Data.ConnectionState.Closed)
                                {
                                    cmd.Connection.Close();
                                }
                            } // End Finally
                        }     // End Using idbtTrans
                    }         // End lock cmd
                }             // End lock idbConn
            }                 // End Using idbConn

            return(iAffected);
        } // End Function Execute
Exemplo n.º 14
0
        public static bool CommitTransaction(System.Data.IDbTransaction transaction)
        {
            if (transaction != null)
            {
                if (transaction.Connection.State == System.Data.ConnectionState.Open)
                {
                    transaction.Commit();
                }
                transaction.Connection.Dispose();
                transaction.Dispose();
                return(true);
            }

            return(false);
        }
Exemplo n.º 15
0
        /// <summary>
        /// 插入工资表 修改课程表
        /// </summary>
        /// <param name="coachWage"></param>
        /// <param name="coachWageSubList"></param>
        /// <returns></returns>
        private bool PrePayCoachMoney(Sys.Models.CoachWages coachWage, IList <Sys.Models.CoachWages_Sub> coachWageSubList)
        {
            System.Data.IDbConnection connection = Comm.Helper.DapperHelper.Instance;
            connection.Open();
            System.Data.IDbTransaction transaction = connection.BeginTransaction();

            using (connection)
            {
                try
                {
                    //插入工资主表
                    var coachWageId = connection.Insert <Sys.Models.CoachWages>(coachWage, transaction);

                    //更新这个排课表、约课表
                    coachWageSubList.ToList().ForEach((c) =>
                    {
                        c.WagesID = coachWageId;
                        //更新这个排课表
                        connection.Execute("UPDATE[dbo].[TeachingSchedule] SET [State] =@state WHERE PKID=@pkID", new
                        {
                            state = Convert.ToInt32(Sys.Models.StateEnum.TeachingSchedule.PayCoachMoney),
                            pkID  = c.PKID
                        }, transaction);

                        //更新约课表
                        connection.Execute("UPDATE[dbo].[Curriculum] SET [State] =@state WHERE CurriculumID=@curriculumID", new
                        {
                            state        = Convert.ToInt32(Sys.Models.StateEnum.Curriculum.PayCoachMoney),
                            curriculumID = c.CurriculumID
                        }, transaction);
                    });

                    //插入工资字表
                    connection.Insert <Sys.Models.CoachWages_Sub>(coachWageSubList, transaction);

                    transaction.Commit();
                }
                catch (Exception ex)
                {
                    logs.Error("预发工资失败", ex);
                    transaction.Rollback();
                    return(false);
                }
            }

            return(true);
        }
Exemplo n.º 16
0
        private IEnumerable <KeyValuePair <string, long> > DoDelete(LocalDeleteDatabase db, BackendManager backend, IEnumerable <IRemoteVolume> deleteableVolumes, ref System.Data.IDbTransaction transaction)
        {
            // Mark all volumes as disposable
            foreach (var f in deleteableVolumes)
            {
                db.UpdateRemoteVolume(f.Name, RemoteVolumeState.Deleting, f.Size, f.Hash, transaction);
            }

            // Before we commit the current state, make sure the backend has caught up
            backend.WaitForEmpty(db, transaction);

            if (!m_options.Dryrun)
            {
                transaction.Commit();
                transaction = db.BeginTransaction();
            }

            return(PerformDelete(backend, db.GetDeletableVolumes(deleteableVolumes, transaction)));
        }
Exemplo n.º 17
0
                public override Lfx.Types.OperationResult Ok()
                {
                        if (EntradaTicket.ValueInt == 0)
                                return new Lfx.Types.FailureOperationResult("Escriba el código de Ticket");

                        using (System.Data.IDbTransaction Trans = this.Connection.BeginTransaction()) {
                                var InsertarNovedad = new qGen.Insert("tickets_eventos");
                                InsertarNovedad.ColumnValues.AddWithValue("id_ticket", EntradaTicket.ValueInt);
                                InsertarNovedad.ColumnValues.AddWithValue("id_tecnico", EntradaEncargado.ValueInt);
                                InsertarNovedad.ColumnValues.AddWithValue("minutos_tecnico", Lfx.Types.Parsing.ParseInt(EntradaMinutos.Text));
                                InsertarNovedad.ColumnValues.AddWithValue("privado", EntradaCondicion.TextKey);
                                InsertarNovedad.ColumnValues.AddWithValue("descripcion", EntradaDescripcion.Text);
                                InsertarNovedad.ColumnValues.AddWithValue("fecha", new qGen.SqlExpression("NOW()"));
                                this.Connection.ExecuteNonQuery(InsertarNovedad);
                                Trans.Commit();
                        }

                        return base.Ok();
                }
Exemplo n.º 18
0
        /// <summary>
        /// 学生注册
        /// </summary>
        /// <param name="coach"></param>
        /// <returns></returns>
        public static bool Reginster(Sys.Models.Student student)
        {
            if (!string.IsNullOrWhiteSpace(student.OpenID))
            {
                var sql        = "select * from WxUserInfo where OpenId=@openId";
                var wxuserInfo = Comm.Helper.DapperHelper.Instance.QueryFirst <Sys.Models.WxUserInfo>(sql, new
                {
                    openId = student.OpenID
                });

                student.NickName = wxuserInfo.NickName;
                student.HeadUrl  = wxuserInfo.HeadImgUrl;
            }

            System.Data.IDbConnection connection = Comm.Helper.DapperHelper.Instance;
            connection.Open();
            System.Data.IDbTransaction transaction = connection.BeginTransaction();

            try
            {
                student.State = 1;
                int student_id           = connection.Insert <Sys.Models.Student>(student, transaction);
                var student_venue_result = connection.Insert <Sys.Models.Student_Venue>(new Sys.Models.Student_Venue()
                {
                    AddTime   = DateTime.Now,
                    StudentID = student_id,
                    VenueID   = student.VenueID,
                }, transaction);

                transaction.Commit();
                return(true);
            }
            catch (Exception ex)
            {
                logs.Error("学生注册失败", ex);
                transaction.Rollback();
                return(false);
            }
            finally
            {
                connection.Close();
            }
        }
Exemplo n.º 19
0
        public override Lfx.Types.OperationResult Ok()
        {
            if (EntradaTicket.ValueInt == 0)
            {
                return(new Lfx.Types.FailureOperationResult("Escriba el código de Ticket"));
            }

            using (System.Data.IDbTransaction Trans = this.Connection.BeginTransaction()) {
                qGen.Insert InsertarNovedad = new qGen.Insert(Connection, "tickets_eventos");
                InsertarNovedad.Fields.AddWithValue("id_ticket", EntradaTicket.ValueInt);
                InsertarNovedad.Fields.AddWithValue("id_tecnico", EntradaEncargado.ValueInt);
                InsertarNovedad.Fields.AddWithValue("minutos_tecnico", Lfx.Types.Parsing.ParseInt(EntradaMinutos.Text));
                InsertarNovedad.Fields.AddWithValue("privado", EntradaCondicion.TextKey);
                InsertarNovedad.Fields.AddWithValue("descripcion", EntradaDescripcion.Text);
                InsertarNovedad.Fields.AddWithValue("fecha", qGen.SqlFunctions.Now);
                this.Connection.Execute(InsertarNovedad);
                Trans.Commit();
            }

            return(base.Ok());
        }
Exemplo n.º 20
0
 public override void AfterSave(System.Data.IDbTransaction transaction)
 {
     Lbl.Comprobantes.Comprobante Comprob = this.Elemento as Lbl.Comprobantes.Comprobante;
     if (Comprob != null && Comprob.Tipo != null && Comprob.Tipo.ImprimirAlGuardar)
     {
         if (transaction == null)
         {
             using (transaction = this.Connection.BeginTransaction()) {
                 var Controlador = new Lazaro.Base.Controller.ComprobanteController(transaction);
                 Controlador.Imprimir(Comprob, null);
                 transaction.Commit();
                 transaction = null;
             }
         }
         else
         {
             var Controlador = new Lazaro.Base.Controller.ComprobanteController(transaction);
             Controlador.Imprimir(Comprob, null);
         }
     }
 }
Exemplo n.º 21
0
        public IHttpActionResult SetWagesOver(dynamic query)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            System.Data.IDbConnection connection = Comm.Helper.DapperHelper.Instance;
            connection.Open();
            System.Data.IDbTransaction transaction = connection.BeginTransaction();

            try
            {
                var venueId = (Newtonsoft.Json.Linq.JObject.Parse(query.ToString()))["VenueID"].ToString();
                Newtonsoft.Json.Linq.JArray ids = ((Newtonsoft.Json.Linq.JObject.Parse(query.ToString()))["WagesIDs"]);

                using (connection)
                {
                    foreach (var item in ids.ToArray())
                    {
                        connection.Execute("UPDATE[dbo].[CoachWages] SET [State] =1, [PayTime]=@payTime WHERE WagesID=@wagesID and VenueID=@venueId", new
                        {
                            wagesID = Convert.ToInt32(item),
                            venueId = Convert.ToInt32(query.VenueID),
                            payTime = DateTime.Now,
                        }, transaction);
                    }

                    transaction.Commit();
                }

                return(Ok(Comm.ResponseModel.ResponseModelBase.Success()));
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                logs.Error("设置工资发放完毕失败", ex);
                return(BadRequest());
            }
        }
Exemplo n.º 22
0
        public ResponseResult <bool> SignOut()
        {
            System.Data.IDbTransaction idbTrans = null;
            try
            {
                var token = Request.Token();
                var loginTokenServices = GetService <SysLoginTokenService>();
                var loginLogService    = GetService <SysLoginLogService>(loginTokenServices);
                idbTrans = loginTokenServices.BeginTrans();
                loginTokenServices.DisableToken(token, idbTrans);
                loginLogService.LoginOutByToken(token, idbTrans);

                idbTrans?.Commit();
                return(ResponseResult <bool> .GenSuccessResponse(true));
            }
            catch (Exception ex)
            {
                LogHelper.WriteErrorLog(HttpContext.Current.Request.RawUrl, ex);
                idbTrans?.Rollback();
                return(ResponseResult <bool> .GenFaildResponse(ex.Message));
            }
        }
Exemplo n.º 23
0
        /// <summary>
        /// Prepara las tablas internas para recibir los datos importados.
        /// </summary>
        public void PrepararTablasLazaro()
        {
            using (System.Data.IDbTransaction Trans = this.Connection.BeginTransaction()) {
                System.Collections.Generic.List <string> TablasModificadas = new List <string>();
                System.Console.WriteLine("Lbl.Servicios.Importar.Filtro: Preparando tablas internas...");
                foreach (MapaDeTabla Map in this.MapaDeTablas)
                {
                    if (Map.ColumnaIdExterna != null)
                    {
                        Lfx.Data.TableStructure Tabla = Lfx.Workspace.Master.Structure.Tables[Map.TablaLazaro];
                        if (Tabla.Columns.ContainsKey(Map.ColumnaIdLazaro) == false)
                        {
                            // Si la columna Id no existe, agrego un tag
                            Lfx.Data.Tag ImportTag = new Lfx.Data.Tag(Map.TablaLazaro, Map.ColumnaIdLazaro, "ImportId");
                            ImportTag.Connection = this.Connection;
                            ImportTag.FieldType  = Lazaro.Orm.ColumnTypes.VarChar;
                            ImportTag.Nullable   = true;
                            ImportTag.Internal   = true;
                            Lfx.Workspace.Master.Tables[Map.TablaLazaro].Tags.Add(ImportTag);
                            ImportTag.Save();
                            TablasModificadas.Add(Map.TablaLazaro);
                            Lfx.Workspace.Master.Structure.LoadBuiltIn();
                        }
                    }
                }

                // Me aseguro de que los tags se incorporen a las estructuras de la base de datos
                if (TablasModificadas.Count > 0)
                {
                    foreach (string NombreTabla in TablasModificadas)
                    {
                        Lfx.Data.TableStructure Tabla = Lfx.Workspace.Master.Structure.Tables[NombreTabla];
                        this.Connection.SetTableStructure(Tabla);
                    }
                }
                Trans.Commit();
            }
        }
Exemplo n.º 24
0
        private void CreateSchemaAndUser(string sql, System.Data.IDbConnection connection)
        {
            if (connection == null)
            {
                throw new Exception("Failed to set a connection to external available instance");
            }
            if (connection.State == System.Data.ConnectionState.Closed)
            {
                connection.Open();
            }
            using (System.Data.IDbTransaction transaction = connection.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
            {
                using (System.Data.IDbCommand command = connection.CreateCommand())
                {
                    command.Transaction = transaction;
                    command.CommandText = sql;
                    try
                    {
                        //if (command.Connection.State == System.Data.ConnectionState.Closed)
                        //    command.Connection.Open();
                        command.ExecuteScalar();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        if (connection != null && connection.State != System.Data.ConnectionState.Closed)
                        {
                            transaction.Rollback();
                        }

                        Maps.Instance.DuradosMap.Logger.Log("AppFactory", null, "CreateNewSchemaAndUser", ex, 1, "Faild to create new schema for new rds app");
                        throw new Exception("Faild to create new schema for new rds app", ex);
                    }
                }
            }
        }
Exemplo n.º 25
0
        public void DoRun(Database.LocalDeleteDatabase db, ref System.Data.IDbTransaction transaction, bool hasVerifiedBacked, bool forceCompact)
        {
            using (var backend = new BackendManager(m_backendurl, m_options, m_result.BackendWriter, db))
            {
                if (!hasVerifiedBacked && !m_options.NoBackendverification)
                {
                    FilelistProcessor.VerifyRemoteList(backend, m_options, db, m_result.BackendWriter);
                }

                var filesetNumbers = db.FilesetTimes.Zip(Enumerable.Range(0, db.FilesetTimes.Count()), (a, b) => new Tuple <long, DateTime>(b, a.Value));
                var toDelete       = m_options.GetFilesetsToDelete(db.FilesetTimes.Select(x => x.Value).ToArray());

                if (toDelete != null && toDelete.Length > 0)
                {
                    m_result.AddMessage(string.Format("Deleting {0} remote fileset(s) ...", toDelete.Length));
                }

                var lst = db.DropFilesetsFromTable(toDelete, transaction).ToArray();
                foreach (var f in lst)
                {
                    db.UpdateRemoteVolume(f.Key, RemoteVolumeState.Deleting, f.Value, null, transaction);
                }

                if (!m_options.Dryrun)
                {
                    transaction.Commit();
                    transaction = db.BeginTransaction();
                }

                foreach (var f in lst)
                {
                    if (m_result.TaskControlRendevouz() == TaskControlState.Stop)
                    {
                        backend.WaitForComplete(db, transaction);
                        return;
                    }

                    if (!m_options.Dryrun)
                    {
                        backend.Delete(f.Key, f.Value);
                    }
                    else
                    {
                        m_result.AddDryrunMessage(string.Format("Would delete remote fileset: {0}", f.Key));
                    }
                }

                backend.WaitForComplete(db, transaction);

                var count = lst.Length;
                if (!m_options.Dryrun)
                {
                    if (count == 0)
                    {
                        m_result.AddMessage("No remote filesets were deleted");
                    }
                    else
                    {
                        m_result.AddMessage(string.Format("Deleted {0} remote fileset(s)", count));
                    }
                }
                else
                {
                    if (count == 0)
                    {
                        m_result.AddDryrunMessage("No remote filesets would be deleted");
                    }
                    else
                    {
                        m_result.AddDryrunMessage(string.Format("{0} remote fileset(s) would be deleted", count));
                    }

                    if (count > 0 && m_options.Dryrun)
                    {
                        m_result.AddDryrunMessage("Remove --dry-run to actually delete files");
                    }
                }

                if (!m_options.NoAutoCompact && (forceCompact || (toDelete != null && toDelete.Length > 0)))
                {
                    m_result.CompactResults = new CompactResults(m_result);
                    new CompactHandler(m_backendurl, m_options, (CompactResults)m_result.CompactResults).DoCompact(db, true, ref transaction);
                }

                m_result.SetResults(
                    from n in filesetNumbers
                    where toDelete.Contains(n.Item2)
                    select n,
                    m_options.Dryrun);
            }
        }
Exemplo n.º 26
0
        private static object ExecImprimir(string comando)
        {
            string SubComandoImprimir = Lfx.Types.Strings.GetNextToken(ref comando, " ").Trim();

            switch (SubComandoImprimir.ToUpperInvariant())
            {
            case "COMPROBANTE":
            case "COMPROB":
                int IdComprobante = Lfx.Types.Parsing.ParseInt(Lfx.Types.Strings.GetNextToken(ref comando, " "));

                Lfx.Types.OperationResult ResultadoImpresion;

                using (Lfx.Data.Connection DataBaseImprimir = Lfx.Workspace.Master.GetNewConnection("Imprimir comprobante"))
                    using (System.Data.IDbTransaction Trans = DataBaseImprimir.BeginTransaction()) {
                        Lbl.Comprobantes.ComprobanteConArticulos Comprob = new Lbl.Comprobantes.ComprobanteConArticulos(DataBaseImprimir, IdComprobante);
                        Lazaro.Impresion.Comprobantes.ImpresorComprobanteConArticulos Impresor = new Impresion.Comprobantes.ImpresorComprobanteConArticulos(Comprob, Trans);
                        ResultadoImpresion = Impresor.Imprimir();
                        if (ResultadoImpresion.Success)
                        {
                            Trans.Commit();
                        }
                        else
                        {
                            Trans.Rollback();
                        }
                    }

                return(ResultadoImpresion);

            default:
                int  itemId   = Lfx.Types.Parsing.ParseInt(Lfx.Types.Strings.GetNextToken(ref comando, " ").Trim());
                Type TipoElem = Lbl.Instanciador.InferirTipo(SubComandoImprimir);
                if (TipoElem != null && itemId > 0)
                {
                    using (Lfx.Data.Connection DbImprimir = Lfx.Workspace.Master.GetNewConnection("Imprimir " + TipoElem.ToString() + " " + itemId.ToString())) {
                        Lbl.IElementoDeDatos      Elem = Lbl.Instanciador.Instanciar(TipoElem, DbImprimir, itemId);
                        Lfx.Types.OperationResult Res;
                        using (System.Data.IDbTransaction Trans = DbImprimir.BeginTransaction()) {
                            Lazaro.Impresion.ImpresorElemento Impresor = Lazaro.Impresion.Instanciador.InstanciarImpresor(Elem, Trans);

                            string ImprimirEn = Lfx.Types.Strings.GetNextToken(ref comando, " ").Trim().ToUpperInvariant();
                            if (ImprimirEn == "EN")
                            {
                                // El nombre de la impresora es lo que resta del comando
                                // No lo puedo separar con GetNextToken porque puede contener espacios
                                string NombreImpresora = comando;
                                Impresor.Impresora = Lbl.Impresion.Impresora.InstanciarImpresoraLocal(DbImprimir, NombreImpresora);
                            }

                            Res = Impresor.Imprimir();
                            if (Res.Success)
                            {
                                Trans.Commit();
                            }
                            else
                            {
                                Trans.Rollback();
                            }
                        }
                        return(Res);
                    }
                }
                break;
            }

            return(null);
        }
Exemplo n.º 27
0
        private long FinalizeRemoteVolumes(BackendManager backend)
        {
            var lastVolumeSize = -1L;
            m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Finalize);
            using(new Logging.Timer("FinalizeRemoteVolumes"))
            {
                if (m_blockvolume != null && m_blockvolume.SourceSize > 0)
                {
                    lastVolumeSize = m_blockvolume.SourceSize;

                    if (m_options.Dryrun)
                    {
                        m_result.AddDryrunMessage(string.Format("Would upload block volume: {0}, size: {1}", m_blockvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_blockvolume.LocalFilename).Length)));
                        if (m_indexvolume != null)
                        {
                            m_blockvolume.Close();
                            UpdateIndexVolume();
                            m_indexvolume.FinishVolume(Library.Utility.Utility.CalculateHash(m_blockvolume.LocalFilename), new FileInfo(m_blockvolume.LocalFilename).Length);
                            m_result.AddDryrunMessage(string.Format("Would upload index volume: {0}, size: {1}", m_indexvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_indexvolume.LocalFilename).Length)));
                        }

                        m_blockvolume.Dispose();
                        m_blockvolume = null;
                        m_indexvolume.Dispose();
                        m_indexvolume = null;
                    }
                    else
                    {
                        m_database.UpdateRemoteVolume(m_blockvolume.RemoteFilename, RemoteVolumeState.Uploading, -1, null, m_transaction);
                        m_blockvolume.Close();
                        UpdateIndexVolume();

                        using(new Logging.Timer("CommitUpdateRemoteVolume"))
                            m_transaction.Commit();
                        m_transaction = m_database.BeginTransaction();

                        backend.Put(m_blockvolume, m_indexvolume);

                        using(new Logging.Timer("CommitUpdateRemoteVolume"))
                            m_transaction.Commit();
                        m_transaction = m_database.BeginTransaction();

                        m_blockvolume = null;
                        m_indexvolume = null;
                    }
                }
            }

            return lastVolumeSize;
        }
Exemplo n.º 28
0
        /// <summary>
        /// Adds the found file data to the output unless the block already exists
        /// </summary>
        /// <param name="key">The block hash</param>
        /// <param name="data">The data matching the hash</param>
        /// <param name="len">The size of the data</param>
        /// <param name="offset">The offset into the data</param>
        /// <param name="hint">Hint for compression module</param>
        /// <param name="isBlocklistData">Indicates if the block is list data</param>
        private bool AddBlockToOutput(string key, byte[] data, int offset, int len, CompressionHint hint, bool isBlocklistData)
        {
            if (m_database.AddBlock(key, len, m_blockvolume.VolumeID, m_transaction))
            {
                m_blockvolume.AddBlock(key, data, offset, len, hint);

                //TODO: In theory a normal data block and blocklist block could be equal.
                // this would cause the index file to not contain all data,
                // if the data file is added before the blocklist data
                // ... highly theoretical ...
                if (m_options.IndexfilePolicy == Options.IndexFileStrategy.Full && isBlocklistData)
                    m_indexvolume.WriteBlocklist(key, data, offset, len);

                if (m_blockvolume.Filesize > m_options.VolumeSize - m_options.Blocksize)
                {
                    if (m_options.Dryrun)
                    {
                        m_blockvolume.Close();
                        m_result.AddDryrunMessage(string.Format("Would upload block volume: {0}, size: {1}", m_blockvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_blockvolume.LocalFilename).Length)));

                        if (m_indexvolume != null)
                        {
                            UpdateIndexVolume();
                            m_indexvolume.FinishVolume(Library.Utility.Utility.CalculateHash(m_blockvolume.LocalFilename), new FileInfo(m_blockvolume.LocalFilename).Length);
                            m_result.AddDryrunMessage(string.Format("Would upload index volume: {0}, size: {1}", m_indexvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_indexvolume.LocalFilename).Length)));
                            m_indexvolume.Dispose();
                            m_indexvolume = null;
                        }

                        m_blockvolume.Dispose();
                        m_blockvolume = null;
                        m_indexvolume.Dispose();
                        m_indexvolume = null;
                    }
                    else
                    {
                        //When uploading a new volume, we register the volumes and then flush the transaction
                        // this ensures that the local database and remote storage are as closely related as possible
                        m_database.UpdateRemoteVolume(m_blockvolume.RemoteFilename, RemoteVolumeState.Uploading, -1, null, m_transaction);
                        m_blockvolume.Close();
                        UpdateIndexVolume();

                        m_backend.FlushDbMessages(m_database, m_transaction);
                        m_backendLogFlushTimer = DateTime.Now.Add(FLUSH_TIMESPAN);

                        using(new Logging.Timer("CommitAddBlockToOutputFlush"))
                            m_transaction.Commit();
                        m_transaction = m_database.BeginTransaction();

                        m_backend.Put(m_blockvolume, m_indexvolume);
                        m_blockvolume = null;
                        m_indexvolume = null;

                        using(new Logging.Timer("CommitAddBlockToOutputFlush"))
                            m_transaction.Commit();
                        m_transaction = m_database.BeginTransaction();

                    }

                    m_blockvolume = new BlockVolumeWriter(m_options);
                    m_blockvolume.VolumeID = m_database.RegisterRemoteVolume(m_blockvolume.RemoteFilename, RemoteVolumeType.Blocks, RemoteVolumeState.Temporary, m_transaction);

                    if (m_options.IndexfilePolicy != Options.IndexFileStrategy.None)
                    {
                        m_indexvolume = new IndexVolumeWriter(m_options);
                        m_indexvolume.VolumeID = m_database.RegisterRemoteVolume(m_indexvolume.RemoteFilename, RemoteVolumeType.Index, RemoteVolumeState.Temporary, m_transaction);
                    }
                }

                return true;
            }

            return false;
        }
Exemplo n.º 29
0
 /// <summary>
 /// Realiza o commit.
 /// </summary>
 public void Commit()
 {
     _transaction.Commit();
 }
Exemplo n.º 30
0
        public Task GetNextTask(string component)
        {
            if (Workspace == null)
            {
                return(null);
            }

            if (this.DataBase.State != System.Data.ConnectionState.Open)
            {
                this.DataBase.Open();
            }

            qGen.Where WhereEstacion = new qGen.Where(qGen.AndOr.Or);
            WhereEstacion.AddWithValue("estacion", this.DataBase.EscapeString(Lfx.Environment.SystemInformation.MachineName));
            WhereEstacion.AddWithValue("estacion", "*");

            qGen.Where WhereFecha = new qGen.Where(qGen.AndOr.Or);
            WhereFecha.AddWithValue("fechaejecutar", qGen.ComparisonOperators.LessOrEqual, new qGen.SqlExpression("NOW()"));
            WhereFecha.AddWithValue("fechaejecutar", null);

            m_LastGetTask = DateTime.Now;
            qGen.Select NextTask = new qGen.Select("sys_programador");
            NextTask.WhereClause = new qGen.Where("estado", 0);
            NextTask.WhereClause.AddWithValue("componente", component);
            NextTask.WhereClause.AddWithValue(WhereEstacion);
            NextTask.WhereClause.AddWithValue(WhereFecha);

            NextTask.Order = "id_evento";

            Lfx.Data.Row TaskRow;
            try {
                TaskRow = this.DataBase.FirstRowFromSelect(NextTask);
            } catch {
                TaskRow = null;
            }
            if (TaskRow != null)
            {
                Task Result = new Task();

                Result.Id                  = System.Convert.ToInt32(TaskRow["id_evento"]);
                Result.Command             = TaskRow["comando"].ToString();
                Result.Component           = TaskRow["componente"].ToString();
                Result.Creator             = TaskRow["crea_usuario"].ToString();
                Result.CreatorComputerName = TaskRow["crea_estacion"].ToString();
                Result.ComputerName        = TaskRow["estacion"].ToString();
                Result.Schedule            = System.Convert.ToDateTime(TaskRow["fecha"]);
                Result.Status              = System.Convert.ToInt32(TaskRow["estado"]);

                //Elimino tareas viejas
                qGen.Update Actualizar = new qGen.Update("sys_programador", new qGen.Where("id_evento", Result.Id));
                Actualizar.ColumnValues.AddWithValue("estado", 1);

                using (System.Data.IDbTransaction Trans = this.DataBase.BeginTransaction()) {
                    this.DataBase.ExecuteNonQuery(Actualizar);
                    this.DataBase.ExecuteNonQuery(new qGen.Delete("sys_programador", new qGen.Where("fecha", qGen.ComparisonOperators.LessThan, System.DateTime.Now.AddDays(-7))));
                    Trans.Commit();
                }

                return(Result);
            }
            else
            {
                return(null);
            }
        }
Exemplo n.º 31
0
        public void Run(string[] sources, Library.Utility.IFilter filter)
        {
            m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Begin);

            using(m_database = new LocalBackupDatabase(m_options.Dbpath, m_options))
            {
                m_result.SetDatabase(m_database);
                m_result.Dryrun = m_options.Dryrun;

                Utility.VerifyParameters(m_database, m_options);
                m_database.VerifyConsistency(null);
                // If there is no filter, we set an empty filter to simplify the code
                // If there is a filter, we make sure that the sources are included
                m_filter = filter ?? new Library.Utility.FilterExpression();
                m_sourceFilter = new Library.Utility.FilterExpression(sources, true);

                var lastVolumeSize = -1L;
                m_backendLogFlushTimer = DateTime.Now.Add(FLUSH_TIMESPAN);
                System.Threading.Thread parallelScanner = null;

                try
                {
                    m_snapshot = GetSnapshot(sources, m_options, m_result);

                    // Start parallel scan
                    if (m_options.ChangedFilelist == null || m_options.ChangedFilelist.Length < 1)
                    {
                        parallelScanner = new System.Threading.Thread(CountFilesThread) {
                            Name = "Read ahead file counter",
                            IsBackground = true
                        };
                        parallelScanner.Start();
                    }

                    using(m_backend = new BackendManager(m_backendurl, m_options, m_result.BackendWriter, m_database))
                    using(m_filesetvolume = new FilesetVolumeWriter(m_options, m_database.OperationTimestamp))
                    {
                        var incompleteFilesets = m_database.GetIncompleteFilesets(null).OrderBy(x => x.Value).ToArray();
                        if (incompleteFilesets.Length != 0)
                        {
                            m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_PreviousBackupFinalize);
                            m_result.AddMessage(string.Format("Uploading filelist from previous interrupted backup"));
                            using(var trn = m_database.BeginTransaction())
                            {
                                var incompleteSet = incompleteFilesets.Last();
                                var badIds = from n in incompleteFilesets select n.Key;

                                var prevs = (from n in m_database.FilesetTimes
                                            where
                                                n.Key < incompleteSet.Key
                                                &&
                                                !badIds.Contains(n.Key)
                                            orderby n.Key
                                            select n.Key).ToArray();

                                var prevId = prevs.Length == 0 ? -1 : prevs.Last();

                                FilesetVolumeWriter fsw = null;
                                try
                                {
                                    var s = 1;
                                    var fileTime = incompleteSet.Value + TimeSpan.FromSeconds(s);
                                    var oldFilesetID = incompleteSet.Key;

                                    // Probe for an unused filename
                                    while (s < 60)
                                    {
                                        var id = m_database.GetRemoteVolumeID(VolumeBase.GenerateFilename(RemoteVolumeType.Files, m_options, null, fileTime));
                                        if (id < 0)
                                            break;

                                        fileTime = incompleteSet.Value + TimeSpan.FromSeconds(++s);
                                    }

                                    fsw = new FilesetVolumeWriter(m_options, fileTime);
                                    fsw.VolumeID = m_database.RegisterRemoteVolume(fsw.RemoteFilename, RemoteVolumeType.Files, RemoteVolumeState.Temporary, m_transaction);
                                    var newFilesetID = m_database.CreateFileset(fsw.VolumeID, fileTime, trn);
                                    m_database.LinkFilesetToVolume(newFilesetID, fsw.VolumeID, trn);
                                    m_database.AppendFilesFromPreviousSet(trn, null, newFilesetID, prevId, fileTime);

                                    m_database.WriteFileset(fsw, trn, newFilesetID);

                                    if (m_options.Dryrun)
                                    {
                                        m_result.AddDryrunMessage(string.Format("Would upload fileset: {0}, size: {1}", fsw.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(fsw.LocalFilename).Length)));
                                    }
                                    else
                                    {
                                        m_database.UpdateRemoteVolume(fsw.RemoteFilename, RemoteVolumeState.Uploading, -1, null, trn);

                                        using(new Logging.Timer("CommitUpdateFilelistVolume"))
                                            trn.Commit();

                                        m_backend.Put(fsw);
                                        fsw = null;
                                    }
                                }
                                finally
                                {
                                    if (fsw != null)
                                        try { fsw.Dispose(); }
                                        catch { fsw = null; }
                                }
                            }
                        }

                        if (!m_options.NoBackendverification)
                        {
                            m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_PreBackupVerify);
                            using(new Logging.Timer("PreBackupVerify"))
                            {
                                try
                                {
                                    FilelistProcessor.VerifyRemoteList(m_backend, m_options, m_database, m_result.BackendWriter);
                                }
                                catch (Exception ex)
                                {
                                    if (m_options.AutoCleanup)
                                    {
                                        m_result.AddWarning("Backend verification failed, attempting automatic cleanup", ex);
                                        m_result.RepairResults = new RepairResults(m_result);
                                        new RepairHandler(m_backend.BackendUrl, m_options, (RepairResults)m_result.RepairResults).Run();

                                        m_result.AddMessage("Backend cleanup finished, retrying verification");
                                        FilelistProcessor.VerifyRemoteList(m_backend, m_options, m_database, m_result.BackendWriter);
                                    }
                                    else
                                        throw;
                                }
                            }
                        }

                        m_database.BuildLookupTable(m_options);
                        m_transaction = m_database.BeginTransaction();

                        m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_ProcessingFiles);
                        var filesetvolumeid = m_database.RegisterRemoteVolume(m_filesetvolume.RemoteFilename, RemoteVolumeType.Files, RemoteVolumeState.Temporary, m_transaction);
                        m_database.CreateFileset(filesetvolumeid, VolumeBase.ParseFilename(m_filesetvolume.RemoteFilename).Time, m_transaction);

                        m_blockvolume = new BlockVolumeWriter(m_options);
                        m_blockvolume.VolumeID = m_database.RegisterRemoteVolume(m_blockvolume.RemoteFilename, RemoteVolumeType.Blocks, RemoteVolumeState.Temporary, m_transaction);

                        if (m_options.IndexfilePolicy != Options.IndexFileStrategy.None)
                        {
                            m_indexvolume = new IndexVolumeWriter(m_options);
                            m_indexvolume.VolumeID = m_database.RegisterRemoteVolume(m_indexvolume.RemoteFilename, RemoteVolumeType.Index, RemoteVolumeState.Temporary, m_transaction);
                        }

                        var filterhandler = new FilterHandler(m_snapshot, m_attributeFilter, m_sourceFilter, m_filter, m_symlinkPolicy, m_options.HardlinkPolicy, m_result);

                        using(new Logging.Timer("BackupMainOperation"))
                        {
                            if (m_options.ChangedFilelist != null && m_options.ChangedFilelist.Length >= 1)
                            {
                                m_result.AddVerboseMessage("Processing supplied change list instead of enumerating filesystem");
                                m_result.OperationProgressUpdater.UpdatefileCount(m_options.ChangedFilelist.Length, 0, true);

                                foreach(var p in m_options.ChangedFilelist)
                                {
                                    if (m_result.TaskControlRendevouz() == TaskControlState.Stop)
                                    {
                                        m_result.AddMessage("Stopping backup operation on request");
                                        break;
                                    }

                                    FileAttributes fa = new FileAttributes();
                                    try
                                    {
                                        fa = m_snapshot.GetAttributes(p);
                                    }
                                    catch (Exception ex)
                                    {
                                        m_result.AddWarning(string.Format("Failed to read attributes: {0}, message: {1}", p, ex.Message), ex);
                                    }

                                    if (filterhandler.AttributeFilter(null, p, fa))
                                    {
                                        try
                                        {
                                            this.HandleFilesystemEntry(p, fa);
                                        }
                                        catch (Exception ex)
                                        {
                                            m_result.AddWarning(string.Format("Failed to process element: {0}, message: {1}", p, ex.Message), ex);
                                        }
                                    }
                                }

                                m_database.AppendFilesFromPreviousSet(m_transaction, m_options.DeletedFilelist);
                            }
                            else
                            {
                                foreach(var path in m_snapshot.EnumerateFilesAndFolders(filterhandler.AttributeFilter))
                                {
                                    if (m_result.TaskControlRendevouz() == TaskControlState.Stop)
                                    {
                                        m_result.AddMessage("Stopping backup operation on request");
                                        break;
                                    }

                                    this.HandleFilesystemEntry(path, m_snapshot.GetAttributes(path));
                                }

                            }

                            //If the scanner is still running for some reason, make sure we kill it now
                            if (parallelScanner != null && parallelScanner.IsAlive)
                                parallelScanner.Abort();

                            // We no longer need to snapshot active
                            try { m_snapshot.Dispose(); }
                            finally { m_snapshot = null; }

                            m_result.OperationProgressUpdater.UpdatefileCount(m_result.ExaminedFiles, m_result.SizeOfExaminedFiles, true);
                        }

                        m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Finalize);
                        using(new Logging.Timer("FinalizeRemoteVolumes"))
                        {
                            if (m_blockvolume.SourceSize > 0)
                            {
                                lastVolumeSize = m_blockvolume.SourceSize;

                                if (m_options.Dryrun)
                                {
                                    m_result.AddDryrunMessage(string.Format("Would upload block volume: {0}, size: {1}", m_blockvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_blockvolume.LocalFilename).Length)));
                                    if (m_indexvolume != null)
                                    {
                                        m_blockvolume.Close();
                                        UpdateIndexVolume();
                                        m_indexvolume.FinishVolume(Library.Utility.Utility.CalculateHash(m_blockvolume.LocalFilename), new FileInfo(m_blockvolume.LocalFilename).Length);
                                        m_result.AddDryrunMessage(string.Format("Would upload index volume: {0}, size: {1}", m_indexvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_indexvolume.LocalFilename).Length)));
                                    }

                                    m_blockvolume.Dispose();
                                    m_blockvolume = null;
                                    m_indexvolume.Dispose();
                                    m_indexvolume = null;
                                }
                                else
                                {
                                    m_database.UpdateRemoteVolume(m_blockvolume.RemoteFilename, RemoteVolumeState.Uploading, -1, null, m_transaction);
                                    m_blockvolume.Close();
                                    UpdateIndexVolume();

                                    using(new Logging.Timer("CommitUpdateRemoteVolume"))
                                        m_transaction.Commit();
                                    m_transaction = m_database.BeginTransaction();

                                    m_backend.Put(m_blockvolume, m_indexvolume);

                                    m_blockvolume = null;
                                    m_indexvolume = null;
                                }
                            }
                            else
                            {
                                m_database.RemoveRemoteVolume(m_blockvolume.RemoteFilename, m_transaction);
                                if (m_indexvolume != null)
                                    m_database.RemoveRemoteVolume(m_indexvolume.RemoteFilename, m_transaction);
                            }
                        }

                        using(new Logging.Timer("UpdateChangeStatistics"))
                            m_database.UpdateChangeStatistics(m_result);
                        using(new Logging.Timer("VerifyConsistency"))
                            m_database.VerifyConsistency(m_transaction);

                        var changeCount =
                            m_result.AddedFiles + m_result.ModifiedFiles + m_result.DeletedFiles +
                            m_result.AddedFolders + m_result.ModifiedFolders + m_result.DeletedFolders +
                            m_result.AddedSymlinks + m_result.ModifiedSymlinks + m_result.DeletedSymlinks;

                        //Changes in the filelist triggers a filelist upload
                        if (m_options.UploadUnchangedBackups || changeCount > 0)
                        {
                            using(new Logging.Timer("Uploading a new fileset"))
                            {
                                if (!string.IsNullOrEmpty(m_options.ControlFiles))
                                    foreach(var p in m_options.ControlFiles.Split(new char[] { System.IO.Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries))
                                        m_filesetvolume.AddControlFile(p, m_options.GetCompressionHintFromFilename(p));

                                m_database.WriteFileset(m_filesetvolume, m_transaction);
                                m_filesetvolume.Close();

                                if (m_options.Dryrun)
                                    m_result.AddDryrunMessage(string.Format("Would upload fileset volume: {0}, size: {1}", m_filesetvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(m_filesetvolume.LocalFilename).Length)));
                                else
                                {
                                    m_database.UpdateRemoteVolume(m_filesetvolume.RemoteFilename, RemoteVolumeState.Uploading, -1, null, m_transaction);

                                    using(new Logging.Timer("CommitUpdateRemoteVolume"))
                                        m_transaction.Commit();
                                    m_transaction = m_database.BeginTransaction();

                                    m_backend.Put(m_filesetvolume);
                                }
                            }
                        }
                        else
                        {
                            m_result.AddVerboseMessage("removing temp files, as no data needs to be uploaded");
                            m_database.RemoveRemoteVolume(m_filesetvolume.RemoteFilename, m_transaction);
                        }

                        m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_WaitForUpload);
                        using(new Logging.Timer("Async backend wait"))
                            m_backend.WaitForComplete(m_database, m_transaction);

                        if (m_result.TaskControlRendevouz() != TaskControlState.Stop)
                        {
                            if (m_options.KeepTime.Ticks > 0 || m_options.KeepVersions != 0)
                            {
                                m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Delete);
                                m_result.DeleteResults = new DeleteResults(m_result);
                                using(var db = new LocalDeleteDatabase(m_database))
                                    new DeleteHandler(m_backend.BackendUrl, m_options, (DeleteResults)m_result.DeleteResults).DoRun(db, m_transaction, true, lastVolumeSize <= m_options.SmallFileSize);

                            }
                            else if (lastVolumeSize <= m_options.SmallFileSize && !m_options.NoAutoCompact)
                            {
                                m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Compact);
                                m_result.CompactResults = new CompactResults(m_result);
                                using(var db = new LocalDeleteDatabase(m_database))
                                    new CompactHandler(m_backend.BackendUrl, m_options, (CompactResults)m_result.CompactResults).DoCompact(db, true, m_transaction);
                            }
                        }

                        if (m_options.UploadVerificationFile)
                        {
                            m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_VerificationUpload);
                            FilelistProcessor.UploadVerificationFile(m_backend.BackendUrl, m_options, m_result.BackendWriter, m_database, m_transaction);
                        }

                        if (m_options.Dryrun)
                        {
                            m_transaction.Rollback();
                            m_transaction = null;
                        }
                        else
                        {
                            using(new Logging.Timer("CommitFinalizingBackup"))
                                m_transaction.Commit();

                            m_transaction = null;
                            m_database.Vacuum();

                            if (m_result.TaskControlRendevouz() != TaskControlState.Stop && !m_options.NoBackendverification)
                            {
                                m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_PostBackupVerify);
                                using(var backend = new BackendManager(m_backendurl, m_options, m_result.BackendWriter, m_database))
                                {
                                    using(new Logging.Timer("AfterBackupVerify"))
                                        FilelistProcessor.VerifyRemoteList(backend, m_options, m_database, m_result.BackendWriter);
                                    backend.WaitForComplete(m_database, null);
                                }

                                if (m_options.BackupTestSampleCount > 0 && m_database.GetRemoteVolumes().Count() > 0)
                                {
                                    m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_PostBackupTest);
                                    m_result.TestResults = new TestResults(m_result);

                                    using(var testdb = new LocalTestDatabase(m_database))
                                    using(var backend = new BackendManager(m_backendurl, m_options, m_result.BackendWriter, testdb))
                                        new TestHandler(m_backendurl, m_options, new TestResults(m_result))
                                            .DoRun(m_options.BackupTestSampleCount, testdb, backend);
                                }
                            }

                        }

                        m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Complete);
                        m_database.WriteResults();
                        return;
                    }
                }
                catch (Exception ex)
                {
                    m_result.AddError("Fatal error", ex);
                    throw;
                }
                finally
                {
                    if (parallelScanner != null && parallelScanner.IsAlive)
                    {
                        parallelScanner.Abort();
                        parallelScanner.Join(500);
                        if (parallelScanner.IsAlive)
                            m_result.AddWarning("Failed to terminate filecounter thread", null);
                    }

                    if (m_snapshot != null)
                        try { m_snapshot.Dispose(); }
                        catch (Exception ex) { m_result.AddError(string.Format("Failed to dispose snapshot"), ex); }
                        finally { m_snapshot = null; }

                    if (m_transaction != null)
                        try { m_transaction.Rollback(); }
                        catch (Exception ex) { m_result.AddError(string.Format("Rollback error: {0}", ex.Message), ex); }
                }
            }
        }
Exemplo n.º 32
0
        public void DoRun(Database.LocalDeleteDatabase db, ref System.Data.IDbTransaction transaction, bool hasVerifiedBacked, bool forceCompact, BackendManager sharedManager)
        {
            // Workaround where we allow a running backendmanager to be used
            using (var bk = sharedManager == null ? new BackendManager(m_backendurl, m_options, m_result.BackendWriter, db) : null)
            {
                var backend = bk ?? sharedManager;

                if (!hasVerifiedBacked && !m_options.NoBackendverification)
                {
                    var backupDatabase = new LocalBackupDatabase(db, m_options);
                    var latestFilelist = backupDatabase.GetTemporaryFilelistVolumeNames(latestOnly: true, transaction: transaction);
                    FilelistProcessor.VerifyRemoteList(backend, m_options, db, m_result.BackendWriter, latestFilelist);
                }

                IListResultFileset[]      filesets         = db.FilesetsWithBackupVersion.ToArray();
                List <IListResultFileset> versionsToDelete = new List <IListResultFileset>();
                versionsToDelete.AddRange(new SpecificVersionsRemover(this.m_options).GetFilesetsToDelete(filesets));
                versionsToDelete.AddRange(new KeepTimeRemover(this.m_options).GetFilesetsToDelete(filesets));
                versionsToDelete.AddRange(new RetentionPolicyRemover(this.m_options).GetFilesetsToDelete(filesets));

                // When determining the number of full versions to keep, we need to ignore the versions already marked for removal.
                versionsToDelete.AddRange(new KeepVersionsRemover(this.m_options).GetFilesetsToDelete(filesets.Except(versionsToDelete)));

                if (!m_options.AllowFullRemoval && filesets.Length == versionsToDelete.Count)
                {
                    Logging.Log.WriteInformationMessage(LOGTAG, "PreventingLastFilesetRemoval", "Preventing removal of last fileset, use --{0} to allow removal ...", "allow-full-removal");
                    versionsToDelete = versionsToDelete.OrderBy(x => x.Version).Skip(1).ToList();
                }

                if (versionsToDelete.Count > 0)
                {
                    Logging.Log.WriteInformationMessage(LOGTAG, "DeleteRemoteFileset", "Deleting {0} remote fileset(s) ...", versionsToDelete.Count);
                }

                var lst = db.DropFilesetsFromTable(versionsToDelete.Select(x => x.Time).ToArray(), transaction).ToArray();
                foreach (var f in lst)
                {
                    db.UpdateRemoteVolume(f.Key, RemoteVolumeState.Deleting, f.Value, null, transaction);
                }

                if (!m_options.Dryrun)
                {
                    transaction.Commit();
                    transaction = db.BeginTransaction();
                }

                foreach (var f in lst)
                {
                    if (m_result.TaskControlRendevouz() == TaskControlState.Stop)
                    {
                        backend.WaitForComplete(db, transaction);
                        return;
                    }

                    if (!m_options.Dryrun)
                    {
                        backend.Delete(f.Key, f.Value);
                    }
                    else
                    {
                        Logging.Log.WriteDryrunMessage(LOGTAG, "WouldDeleteRemoteFileset", "Would delete remote fileset: {0}", f.Key);
                    }
                }

                if (sharedManager == null)
                {
                    backend.WaitForComplete(db, transaction);
                }
                else
                {
                    backend.WaitForEmpty(db, transaction);
                }

                var count = lst.Length;
                if (!m_options.Dryrun)
                {
                    if (count == 0)
                    {
                        Logging.Log.WriteInformationMessage(LOGTAG, "DeleteResults", "No remote filesets were deleted");
                    }
                    else
                    {
                        Logging.Log.WriteInformationMessage(LOGTAG, "DeleteResults", "Deleted {0} remote fileset(s)", count);
                    }
                }
                else
                {
                    if (count == 0)
                    {
                        Logging.Log.WriteDryrunMessage(LOGTAG, "WouldDeleteResults", "No remote filesets would be deleted");
                    }
                    else
                    {
                        Logging.Log.WriteDryrunMessage(LOGTAG, "WouldDeleteResults", "{0} remote fileset(s) would be deleted", count);
                    }

                    if (count > 0 && m_options.Dryrun)
                    {
                        Logging.Log.WriteDryrunMessage(LOGTAG, "WouldDeleteHelp", "Remove --dry-run to actually delete files");
                    }
                }

                if (!m_options.NoAutoCompact && (forceCompact || versionsToDelete.Count > 0))
                {
                    m_result.CompactResults = new CompactResults(m_result);
                    new CompactHandler(m_backendurl, m_options, (CompactResults)m_result.CompactResults).DoCompact(db, true, ref transaction, sharedManager);
                }

                m_result.SetResults(versionsToDelete.Select(v => new Tuple <long, DateTime>(v.Version, v.Time)), m_options.Dryrun);
            }
        }
Exemplo n.º 33
0
        private async Task RunAsync(string[] sources, Library.Utility.IFilter filter)
        {
            m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Begin);

            // New isolated scope for each operation
            using (new IsolatedChannelScope())
                using (m_database = new LocalBackupDatabase(m_options.Dbpath, m_options))
                {
                    m_result.SetDatabase(m_database);
                    m_result.Dryrun = m_options.Dryrun;

                    // Check the database integrity
                    Utility.UpdateOptionsFromDb(m_database, m_options);
                    Utility.VerifyParameters(m_database, m_options);

                    var probe_path = m_database.GetFirstPath();
                    if (probe_path != null && Duplicati.Library.Utility.Utility.GuessDirSeparator(probe_path) != System.IO.Path.DirectorySeparatorChar.ToString())
                    {
                        throw new UserInformationException(string.Format("The backup contains files that belong to another operating system. Proceeding with a backup would cause the database to contain paths from two different operation systems, which is not supported. To proceed without losing remote data, delete all filesets and make sure the --{0} option is set, then run the backup again to re-use the existing data on the remote store.", "no-auto-compact"), "CrossOsDatabaseReuseNotSupported");
                    }

                    if (m_database.PartiallyRecreated)
                    {
                        throw new UserInformationException("The database was only partially recreated. This database may be incomplete and the repair process is not allowed to alter remote files as that could result in data loss.", "DatabaseIsPartiallyRecreated");
                    }

                    if (m_database.RepairInProgress)
                    {
                        throw new UserInformationException("The database was attempted repaired, but the repair did not complete. This database may be incomplete and the backup process cannot continue. You may delete the local database and attempt to repair it again.", "DatabaseRepairInProgress");
                    }

                    // If there is no filter, we set an empty filter to simplify the code
                    // If there is a filter, we make sure that the sources are included
                    m_filter       = filter ?? new Library.Utility.FilterExpression();
                    m_sourceFilter = new Library.Utility.FilterExpression(sources, true);

                    Task parallelScanner = null;
                    Task uploader        = null;
                    try
                    {
                        // Setup runners and instances here
                        using (var db = new Backup.BackupDatabase(m_database, m_options))
                            using (var backend = new BackendManager(m_backendurl, m_options, m_result.BackendWriter, m_database))
                                using (var filesetvolume = new FilesetVolumeWriter(m_options, m_database.OperationTimestamp))
                                    using (var stats = new Backup.BackupStatsCollector(m_result))
                                        using (var bk = new Common.BackendHandler(m_options, m_backendurl, db, stats, m_result.TaskReader))
                                            // Keep a reference to these channels to avoid shutdown
                                            using (var uploadtarget = ChannelManager.GetChannel(Backup.Channels.BackendRequest.ForWrite))
                                            {
                                                long filesetid;
                                                var  counterToken = new CancellationTokenSource();
                                                using (var snapshot = GetSnapshot(sources, m_options))
                                                {
                                                    try
                                                    {
                                                        // Start parallel scan, or use the database
                                                        if (m_options.DisableFileScanner)
                                                        {
                                                            var d = m_database.GetLastBackupFileCountAndSize();
                                                            m_result.OperationProgressUpdater.UpdatefileCount(d.Item1, d.Item2, true);
                                                        }
                                                        else
                                                        {
                                                            parallelScanner = Backup.CountFilesHandler.Run(sources, snapshot, m_result, m_options, m_sourceFilter, m_filter, m_result.TaskReader, counterToken.Token);
                                                        }

                                                        // Make sure the database is sane
                                                        await db.VerifyConsistencyAsync(m_options.Blocksize, m_options.BlockhashSize, true);

                                                        // Start the uploader process
                                                        uploader = Backup.BackendUploader.Run(bk, m_options, db, m_result, m_result.TaskReader, stats);

                                                        // If we have an interrupted backup, grab the
                                                        string lasttempfilelist = null;
                                                        long   lasttempfileid   = -1;
                                                        if (!m_options.DisableSyntheticFilelist)
                                                        {
                                                            var candidates = (await db.GetIncompleteFilesetsAsync()).OrderBy(x => x.Value).ToArray();
                                                            if (candidates.Length > 0)
                                                            {
                                                                lasttempfileid   = candidates.Last().Key;
                                                                lasttempfilelist = m_database.GetRemoteVolumeFromID(lasttempfileid).Name;
                                                            }
                                                        }

                                                        // TODO: Rewrite to using the uploader process, or the BackendHandler interface
                                                        // Do a remote verification, unless disabled
                                                        PreBackupVerify(backend, lasttempfilelist);

                                                        // If the previous backup was interrupted, send a synthetic list
                                                        await Backup.UploadSyntheticFilelist.Run(db, m_options, m_result, m_result.TaskReader, lasttempfilelist, lasttempfileid);

                                                        // Grab the previous backup ID, if any
                                                        var prevfileset = m_database.FilesetTimes.FirstOrDefault();
                                                        if (prevfileset.Value.ToUniversalTime() > m_database.OperationTimestamp.ToUniversalTime())
                                                        {
                                                            throw new Exception(string.Format("The previous backup has time {0}, but this backup has time {1}. Something is wrong with the clock.", prevfileset.Value.ToLocalTime(), m_database.OperationTimestamp.ToLocalTime()));
                                                        }

                                                        var lastfilesetid = prevfileset.Value.Ticks == 0 ? -1 : prevfileset.Key;

                                                        // Rebuild any index files that are missing
                                                        await Backup.RecreateMissingIndexFiles.Run(db, m_options, m_result, m_result.TaskReader);

                                                        // This should be removed as the lookups are no longer used
                                                        m_database.BuildLookupTable(m_options);

                                                        // Prepare the operation by registering the filelist
                                                        m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_ProcessingFiles);

                                                        var repcnt = 0;
                                                        while (repcnt < 100 && await db.GetRemoteVolumeIDAsync(filesetvolume.RemoteFilename) >= 0)
                                                        {
                                                            filesetvolume.ResetRemoteFilename(m_options, m_database.OperationTimestamp.AddSeconds(repcnt++));
                                                        }

                                                        if (await db.GetRemoteVolumeIDAsync(filesetvolume.RemoteFilename) >= 0)
                                                        {
                                                            throw new Exception("Unable to generate a unique fileset name");
                                                        }

                                                        var filesetvolumeid = await db.RegisterRemoteVolumeAsync(filesetvolume.RemoteFilename, RemoteVolumeType.Files, RemoteVolumeState.Temporary);

                                                        filesetid = await db.CreateFilesetAsync(filesetvolumeid, VolumeBase.ParseFilename(filesetvolume.RemoteFilename).Time);

                                                        // create USN-based scanner if enabled
                                                        var journalService = GetJournalService(sources, snapshot, filter, lastfilesetid);

                                                        // Run the backup operation
                                                        if (await m_result.TaskReader.ProgressAsync)
                                                        {
                                                            await RunMainOperation(sources, snapshot, journalService, db, stats, m_options, m_sourceFilter, m_filter, m_result, m_result.TaskReader, lastfilesetid).ConfigureAwait(false);
                                                        }
                                                    }
                                                    finally
                                                    {
                                                        //If the scanner is still running for some reason, make sure we kill it now
                                                        counterToken.Cancel();
                                                    }
                                                }

                                                // Ensure the database is in a sane state after adding data
                                                using (new Logging.Timer(LOGTAG, "VerifyConsistency", "VerifyConsistency"))
                                                    await db.VerifyConsistencyAsync(m_options.Blocksize, m_options.BlockhashSize, false);

                                                // Send the actual filelist
                                                if (await m_result.TaskReader.ProgressAsync)
                                                {
                                                    await Backup.UploadRealFilelist.Run(m_result, db, m_options, filesetvolume, filesetid, m_result.TaskReader);
                                                }

                                                // Wait for upload completion
                                                m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_WaitForUpload);
                                                var lastVolumeSize = await FlushBackend(m_result, uploadtarget, uploader).ConfigureAwait(false);

                                                // Make sure we have the database up-to-date
                                                await db.CommitTransactionAsync("CommitAfterUpload", false);

                                                // TODO: Remove this later
                                                m_transaction = m_database.BeginTransaction();

                                                if (await m_result.TaskReader.ProgressAsync)
                                                {
                                                    CompactIfRequired(backend, lastVolumeSize);
                                                }

                                                if (m_options.UploadVerificationFile && await m_result.TaskReader.ProgressAsync)
                                                {
                                                    m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_VerificationUpload);
                                                    FilelistProcessor.UploadVerificationFile(backend.BackendUrl, m_options, m_result.BackendWriter, m_database, m_transaction);
                                                }

                                                if (m_options.Dryrun)
                                                {
                                                    m_transaction.Rollback();
                                                    m_transaction = null;
                                                }
                                                else
                                                {
                                                    using (new Logging.Timer(LOGTAG, "CommitFinalizingBackup", "CommitFinalizingBackup"))
                                                        m_transaction.Commit();

                                                    m_transaction = null;

                                                    if (m_result.TaskControlRendevouz() != TaskControlState.Stop)
                                                    {
                                                        if (m_options.NoBackendverification)
                                                        {
                                                            UpdateStorageStatsFromDatabase();
                                                        }
                                                        else
                                                        {
                                                            PostBackupVerification();
                                                        }
                                                    }
                                                }

                                                m_database.WriteResults();
                                                m_database.PurgeLogData(m_options.LogRetention);
                                                if (m_options.AutoVacuum)
                                                {
                                                    m_database.Vacuum();
                                                }
                                                m_result.OperationProgressUpdater.UpdatePhase(OperationPhase.Backup_Complete);
                                                return;
                                            }
                    }
                    catch (Exception ex)
                    {
                        var aex = BuildException(ex, uploader, parallelScanner);
                        Logging.Log.WriteErrorMessage(LOGTAG, "FatalError", ex, "Fatal error");
                        if (aex == ex)
                        {
                            throw;
                        }

                        throw aex;
                    }
                    finally
                    {
                        if (parallelScanner != null && !parallelScanner.IsCompleted)
                        {
                            parallelScanner.Wait(500);
                        }

                        // TODO: We want to commit? always?
                        if (m_transaction != null)
                        {
                            try { m_transaction.Rollback(); }
                            catch (Exception ex) { Logging.Log.WriteErrorMessage(LOGTAG, "RollbackError", ex, "Rollback error: {0}", ex.Message); }
                        }
                    }
                }
        }
Exemplo n.º 34
0
        private void UploadRealFileList(BackendManager backend, FilesetVolumeWriter filesetvolume)
        {
            var changeCount = 
                m_result.AddedFiles + m_result.ModifiedFiles + m_result.DeletedFiles +
                m_result.AddedFolders + m_result.ModifiedFolders + m_result.DeletedFolders +
                m_result.AddedSymlinks + m_result.ModifiedSymlinks + m_result.DeletedSymlinks;

            //Changes in the filelist triggers a filelist upload
            if (m_options.UploadUnchangedBackups || changeCount > 0)
            {
                using(new Logging.Timer("Uploading a new fileset"))
                {
                    if (!string.IsNullOrEmpty(m_options.ControlFiles))
                        foreach(var p in m_options.ControlFiles.Split(new char[] { System.IO.Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries))
                            filesetvolume.AddControlFile(p, m_options.GetCompressionHintFromFilename(p));

                    m_database.WriteFileset(filesetvolume, m_transaction);
                    filesetvolume.Close();

                    if (m_options.Dryrun)
                        m_result.AddDryrunMessage(string.Format("Would upload fileset volume: {0}, size: {1}", filesetvolume.RemoteFilename, Library.Utility.Utility.FormatSizeString(new FileInfo(filesetvolume.LocalFilename).Length)));
                    else
                    {
                        m_database.UpdateRemoteVolume(filesetvolume.RemoteFilename, RemoteVolumeState.Uploading, -1, null, m_transaction);

                        using(new Logging.Timer("CommitUpdateRemoteVolume"))
                            m_transaction.Commit();
                        m_transaction = m_database.BeginTransaction();

                        backend.Put(filesetvolume);

                        using(new Logging.Timer("CommitUpdateRemoteVolume"))
                            m_transaction.Commit();
                        m_transaction = m_database.BeginTransaction();

                    }
                }
            }
            else
            {
                m_result.AddVerboseMessage("removing temp files, as no data needs to be uploaded");
                m_database.RemoveRemoteVolume(filesetvolume.RemoteFilename, m_transaction);
            }
        }