Esempio n. 1
0
        private void UpdateLastId(long lastId, DBAdapter.IDBAdapter dbAdapter)
        {
            string sql = string.Format("update {0} set id = {1} where Opr = 'Insert'",
                                       _DBProvider.Table.TriggerTableName, lastId);

            dbAdapter.ExcuteSql(sql);
        }
Esempio n. 2
0
        public void Run()
        {
            if (Parameters.Count != 2)
            {
                throw new ArgumentException("the number of parameters must be 2. Parameter 1 is DBAdapter name, Parameter 2 is connection string.");
            }

            DBAdapter.IDBAdapter dbAdapter = (DBAdapter.IDBAdapter)Hubble.Framework.Reflection.Instance.CreateInstance(
                Data.DBProvider.GetDBAdapter(Parameters[0]));
            dbAdapter.ConnectionString = Parameters[1];

            dbAdapter.ConnectionTest();
        }
Esempio n. 3
0
        public void Do()
        {
            DBAdapter.IDBAdapter dbAdapter = (DBAdapter.IDBAdapter)Hubble.Framework.Reflection.Instance.CreateInstance(
                Data.DBProvider.GetDBAdapter(_DBProvider.Table.DBAdapterTypeName));

            int lastDocId = _DBProvider.LastDocIdForIndexOnly;

            dbAdapter.Table = _DBProvider.Table;

            if (lastDocId <= 0 && _DBProvider.DocumentCount <= 0 && (_Flags & SyncFlags.Rebuild) == 0)
            {
                //first time synchronize
                //Truncate trigger table

                dbAdapter.Truncate(_DBProvider.Table.TriggerTableName);
            }

            long from = GetLastId(lastDocId, dbAdapter);

            if (from == long.MaxValue)
            {
                from = -1;
            }

            //Synchronize for delete
            if ((_Flags & SyncFlags.Delete) != 0)
            {
                SychronizeForDelete(dbAdapter);
            }

            _TableSync.SetProgress(5);


            int count = GetRemainCount(from, dbAdapter);


            _TableSync.SetProgress(10);

            //Synchronize for insert

            if ((_Flags & SyncFlags.Insert) != 0)
            {
                int insertCount = 0;

                Global.Report.WriteAppLog(string.Format("SynchronizeCanUpdate Insert count = {0}, table={1}",
                                                        count, _DBProvider.TableName));

                while (true)
                {
                    if (_TableSync.Stopping)
                    {
                        _TableSync.SetProgress(-1, insertCount);
                        _TableSync.ResetStopping();

                        try
                        {
                            if (_GetDocForInsertThread != null)
                            {
                                _GetDocForInsertThread.Abort();
                            }
                        }
                        catch
                        {
                        }

                        return;
                    }

                    Global.Report.WriteAppLog(string.Format("SynchronizeCanUpdate GetDocumentsForInsert, from = {0}, table={1}",
                                                            from, _DBProvider.TableName));

                    List <Document> documents = GetDocumentsForInsertInvoke(dbAdapter, ref from);

                    if (documents.Count == 0)
                    {
                        //Global.Report.WriteAppLog(string.Format("Exit before finish when synchronized {0}. Some records deleted during synchronization. insertCount={1} count={2}",
                        //    _DBProvider.Table.Name, insertCount, count));

                        _TableSync.SetProgress(70, insertCount);
                        break;
                    }

                    insertCount += documents.Count;

                    Global.Report.WriteAppLog(string.Format("SynchronizeCanUpdate Insert to DBProvider, count = {0}, table={1}",
                                                            documents.Count, _DBProvider.TableName));

                    _DBProvider.Insert(documents);

                    if ((_Flags & SyncFlags.Rebuild) == 0)
                    {
                        UpdateLastId(from, dbAdapter);
                    }

                    double progress;

                    if (!_HasInsertCount)
                    {
                        progress = (double)((insertCount % 100000) * 60) / (double)100000;
                    }
                    else
                    {
                        progress = (double)insertCount * 60 / (double)count;
                    }

                    if (progress > 60)
                    {
                        progress = 60;
                    }

                    _TableSync.SetProgress(10 + progress, insertCount);

                    if (_DBProvider.TooManyIndexFiles)
                    {
                        Global.Report.WriteAppLog(string.Format("Begin optimize:type={0}, table={1}",
                                                                OptimizationOption.Speedy, _DBProvider.TableName));

                        DoOptimize(OptimizationOption.Speedy, false);
                        DoOptimize(OptimizationOption.Speedy, false);

                        Global.Report.WriteAppLog(string.Format("Finish optimize:type={0}, table={1}",
                                                                OptimizationOption.Speedy, _DBProvider.TableName));
                    }
                }
            }

            _TableSync.SetProgress(70);

            //Synchronize for update
            if ((_Flags & SyncFlags.Update) != 0)
            {
                SychronizeForUpdate(dbAdapter);
            }

            if (_OptimizeOption != OptimizationOption.Idle)
            {
                Global.Report.WriteAppLog(string.Format("Begin optimize1:type={0}, table={1}",
                                                        _OptimizeOption, _DBProvider.TableName));

                DoOptimize(_OptimizeOption, true);

                Global.Report.WriteAppLog(string.Format("Begin optimize2:type={0}, table={1}",
                                                        _OptimizeOption, _DBProvider.TableName));

                DoOptimize(_OptimizeOption, true);
            }

            Global.Report.WriteAppLog(string.Format("Finish Synchronize optimize:type={0}, table={1}",
                                                    _OptimizeOption, _DBProvider.TableName));
        }
Esempio n. 4
0
        private int GetRemainCount(long from, DBAdapter.IDBAdapter dbAdapter)
        {
            string dbAdapterName = (dbAdapter as INamedExternalReference).Name;

            _HasInsertCount = true;

            if (dbAdapterName.IndexOf("sqlserver", 0, StringComparison.CurrentCultureIgnoreCase) == 0)
            {
                //For sql server

                string sql = string.Format("select rows from sysindexes where id = object_id('{0}') and indid in (0,1)",
                                           _DBProvider.Table.DBTableName.Replace("'", "''"));

                System.Data.DataSet ds = null;

                try
                {
                    ds = dbAdapter.QuerySql(sql);
                }
                catch
                {
                    ds = null;
                }

                if (ds != null)
                {
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        return(int.Parse(ds.Tables[0].Rows[0][0].ToString()) -
                               _DBProvider.DocumentCount);
                    }
                }
            }

            //For others
            {
                string sql = string.Format("select count(*) from {0} where {2} > {1}",
                                           _DBProvider.Table.DBTableName, from, _DBProvider.Table.DocIdReplaceField);

                System.Data.DataSet ds = null;
                int times = 0;

                if (!_FastestMode)
                {
                    while (times < 3)
                    {
                        try
                        {
                            ds = dbAdapter.QuerySql(sql);
                            break;
                        }
                        catch
                        {
                            ds = null;
                            times++;
                        }
                    }
                }

                int count;

                if (ds == null)
                {
                    count           = 50000000;
                    _HasInsertCount = false;
                }
                else
                {
                    count = int.Parse(ds.Tables[0].Rows[0][0].ToString());
                }

                return(count);
            }
        }
Esempio n. 5
0
        private long GetLastId(int lastDocId, DBAdapter.IDBAdapter dbAdapter)
        {
            if ((_Flags & SyncFlags.Rebuild) != 0)
            {
                //Rebuild
                return(long.MaxValue);
            }

            string sql = string.Format("select id from {0} where Opr = 'Insert'",
                                       _DBProvider.Table.TriggerTableName);

            System.Data.DataSet ds = dbAdapter.QuerySql(sql);

            if (ds.Tables[0].Rows.Count <= 0)
            {
                long from = -1;

                while (lastDocId > 0)
                {
                    from = _DBProvider.GetDocIdReplaceFieldValue(lastDocId);

                    if (from != long.MaxValue)
                    {
                        break;
                    }

                    lastDocId--;
                }

                if (from < 0)
                {
                    from = _DBProvider.GetDocIdReplaceFieldValue(lastDocId);
                }

                if (from == long.MaxValue)
                {
                    sql = string.Format("insert into {0} (id, Opr, Fields) values(-1, 'Insert', '')",
                                        _DBProvider.Table.TriggerTableName);
                }
                else
                {
                    sql = string.Format("insert into {0} (id, Opr, Fields) values({1}, 'Insert', '')",
                                        _DBProvider.Table.TriggerTableName, from);
                }
                dbAdapter.ExcuteSql(sql);
                return(from);
            }
            else
            {
                long lastId = long.Parse(ds.Tables[0].Rows[0][0].ToString());

                if (lastId < 0)
                {
                    return(long.MaxValue);
                }
                else
                {
                    return(lastId);
                }
            }
        }
Esempio n. 6
0
        public void Do()
        {
            long from = _DBProvider.LastDocIdForIndexOnly;

            DBAdapter.IDBAdapter dbAdapter = (DBAdapter.IDBAdapter)Hubble.Framework.Reflection.Instance.CreateInstance(
                Data.DBProvider.GetDBAdapter(_DBProvider.Table.DBAdapterTypeName));

            dbAdapter.Table = _DBProvider.Table;

            int count = GetRemainCount(from, dbAdapter);

            _TableSync.SetProgress(10);

            int insertCount = 0;

            while (insertCount < count)
            {
                if (_TableSync.Stopping)
                {
                    _TableSync.SetProgress(-1, insertCount);
                    _TableSync.ResetStopping();

                    try
                    {
                        if (_GetDocForInsertThread != null)
                        {
                            _GetDocForInsertThread.Abort();
                        }
                    }
                    catch
                    {
                    }

                    return;
                }

                List <Document> documents = GetDocumentsForInsertInvoke(dbAdapter, ref from);

                if (documents.Count == 0)
                {
                    Global.Report.WriteAppLog(string.Format("Exit before finish when synchronized {0}. Some records deleted during synchronization or synchronization termination. insertCount={1} count={2}",
                                                            _DBProvider.Table.Name, insertCount, count));
                    _TableSync.SetProgress(90, insertCount);
                    break;
                }
                else
                {
                    insertCount += documents.Count;

                    Global.Report.WriteAppLog(string.Format("SynchronizeCanUpdate Insert to DBProvider, count = {0} table={1}",
                                                            documents.Count, _DBProvider.TableName));

                    _DBProvider.Insert(documents);

                    double progress;

                    if (!_HasInsertCount)
                    {
                        progress = (double)((insertCount % 100000) * 80) / (double)100000;
                    }
                    else
                    {
                        progress = (double)insertCount * 80 / (double)count;
                    }

                    if (progress > 80)
                    {
                        progress = 80;
                    }

                    _TableSync.SetProgress(10 + progress, insertCount);

                    if (_DBProvider.TooManyIndexFiles)
                    {
                        Global.Report.WriteAppLog(string.Format("Begin optimize:type={0}, table={1}",
                                                                OptimizationOption.Speedy, _DBProvider.TableName));

                        DoOptimize(OptimizationOption.Speedy, false);
                        DoOptimize(OptimizationOption.Speedy, false);

                        Global.Report.WriteAppLog(string.Format("Finish optimize:type={0}, table={1}",
                                                                OptimizationOption.Speedy, _DBProvider.TableName));
                    }
                }
            }

            if (_OptimizeOption != OptimizationOption.Idle)
            {
                Global.Report.WriteAppLog(string.Format("Begin optimize1:type={0}, table={1}",
                                                        _OptimizeOption, _DBProvider.TableName));


                DoOptimize(_OptimizeOption, true);

                Global.Report.WriteAppLog(string.Format("Begin optimize2:type={0}, table={1}",
                                                        _OptimizeOption, _DBProvider.TableName));

                DoOptimize(_OptimizeOption, true);
            }

            Global.Report.WriteAppLog(string.Format("Finish Synchronize optimize:type={0}, table={1}",
                                                    _OptimizeOption, _DBProvider.TableName));
        }