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); }
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(); }
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)); }
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); } }
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); } } }
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)); }