diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql
index fcd24049..d507476e 100644
--- a/WebsitePanel/Database/update_db.sql
+++ b/WebsitePanel/Database/update_db.sql
@@ -971,7 +971,6 @@ GO
CREATE PROCEDURE [dbo].[GetBackgroundTask]
(
- @ActorID INT,
@TaskID NVARCHAR(255)
)
AS
@@ -1013,7 +1012,17 @@ CREATE PROCEDURE [dbo].[GetBackgroundTasks]
)
AS
-SELECT
+ with GetChildUsersId(id) as (
+ select UserID
+ from Users
+ where UserID = @ActorID
+ union all
+ select C.UserId
+ from GetChildUsersId P
+ inner join Users C on P.id = C.OwnerID
+)
+
+SELECT
T.ID,
T.Guid,
T.TaskID,
@@ -1035,9 +1044,12 @@ SELECT
T.NotifyOnComplete,
T.Status
FROM BackgroundTasks AS T
-INNER JOIN BackgroundTaskStack AS TS
- ON TS.TaskId = T.ID
-WHERE T.UserID = @ActorID
+INNER JOIN (SELECT T.Guid, MIN(T.StartDate) AS Date
+ FROM BackgroundTasks AS T
+ INNER JOIN BackgroundTaskStack AS TS
+ ON TS.TaskId = T.ID
+ WHERE T.UserID in (select id from GetChildUsersId)
+ GROUP BY T.Guid) AS TT ON TT.Guid = T.Guid AND TT.Date = T.StartDate
GO
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetThreadBackgroundTasks')
@@ -1046,7 +1058,6 @@ GO
CREATE PROCEDURE [dbo].GetThreadBackgroundTasks
(
- @ActorID INT,
@Guid UNIQUEIDENTIFIER
)
AS
@@ -1084,7 +1095,6 @@ GO
CREATE PROCEDURE [dbo].[GetBackgroundTopTask]
(
- @ActorID INT,
@Guid UNIQUEIDENTIFIER
)
AS
@@ -1114,7 +1124,7 @@ FROM BackgroundTasks AS T
INNER JOIN BackgroundTaskStack AS TS
ON TS.TaskId = T.ID
WHERE T.Guid = @Guid
-ORDER BY T.StartDate DESC
+ORDER BY T.StartDate ASC
GO
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddBackgroundTaskLog')
@@ -1311,10 +1321,6 @@ VALUES
)
GO
-IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteBackgroundTaskStack')
-DROP PROCEDURE DeleteBackgroundTaskStack
-GO
-
IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'DeleteBackgroundTasks')
DROP PROCEDURE DeleteBackgroundTasks
GO
@@ -1401,7 +1407,6 @@ GO
CREATE PROCEDURE [dbo].[GetScheduleBackgroundTasks]
(
- @ActorID INT,
@ScheduleID INT
)
AS
@@ -1431,91 +1436,5 @@ FROM BackgroundTasks AS T
WHERE T.Guid = (
SELECT Guid FROM BackgroundTasks
WHERE ScheduleID = @ScheduleID
- AND UserID = @ActorID
AND Completed = 0 AND Status IN (1, 3))
- AND T.UserID = @ActorID AND T.Completed = 0 AND T.Status IN (1, 3)
-GO
-
-
-
-ALTER PROCEDURE [dbo].[GetBackgroundTopTask]
-(
- @ActorID INT,
- @Guid UNIQUEIDENTIFIER
-)
-AS
-
-SELECT TOP 1
- T.ID,
- T.Guid,
- T.TaskID,
- T.ScheduleId,
- T.PackageId,
- T.UserId,
- T.EffectiveUserId,
- T.TaskName,
- T.ItemId,
- T.ItemName,
- T.StartDate,
- T.FinishDate,
- T.IndicatorCurrent,
- T.IndicatorMaximum,
- T.MaximumExecutionTime,
- T.Source,
- T.Severity,
- T.Completed,
- T.NotifyOnComplete,
- T.Status
-FROM BackgroundTasks AS T
-INNER JOIN BackgroundTaskStack AS TS
- ON TS.TaskId = T.ID
-WHERE T.Guid = @Guid
-ORDER BY T.StartDate ASC
-GO
-
-
-ALTER PROCEDURE [dbo].[GetBackgroundTasks]
-(
- @ActorID INT
-)
-AS
-
- with GetChildUsersId(id) as (
- select UserID
- from Users
- where UserID = @ActorID
- union all
- select C.UserId
- from GetChildUsersId P
- inner join Users C on P.id = C.OwnerID
-)
-
-SELECT
- T.ID,
- T.Guid,
- T.TaskID,
- T.ScheduleId,
- T.PackageId,
- T.UserId,
- T.EffectiveUserId,
- T.TaskName,
- T.ItemId,
- T.ItemName,
- T.StartDate,
- T.FinishDate,
- T.IndicatorCurrent,
- T.IndicatorMaximum,
- T.MaximumExecutionTime,
- T.Source,
- T.Severity,
- T.Completed,
- T.NotifyOnComplete,
- T.Status
-FROM BackgroundTasks AS T
-INNER JOIN (SELECT T.Guid, MIN(T.StartDate) AS Date
- FROM BackgroundTasks AS T
- INNER JOIN BackgroundTaskStack AS TS
- ON TS.TaskId = T.ID
- WHERE T.UserID in (select id from GetChildUsersId)
- GROUP BY T.Guid) AS TT ON TT.Guid = T.Guid AND TT.Date = T.StartDate
GO
\ No newline at end of file
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs
index 5cb1e7b4..94ede9cb 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Common/ObjectUtils.cs
@@ -36,11 +36,11 @@ using WebsitePanel.Providers;
namespace WebsitePanel.EnterpriseServer
{
- ///
- /// Summary description for ObjectUtils.
- ///
- public class ObjectUtils
- {
+ ///
+ /// Summary description for ObjectUtils.
+ ///
+ public class ObjectUtils
+ {
public static DT ConvertObject(ST so)
{
Dictionary sProps = GetTypePropertiesHash(typeof(ST));
@@ -53,23 +53,23 @@ namespace WebsitePanel.EnterpriseServer
{
if (dProps.ContainsKey(propName) && sProps[propName].Name != "Item")
{
- if (sProps[propName].CanRead)
- {
- object val = sProps[propName].GetValue(so, null);
- if (dProps[propName] != null)
- {
- if (val != null && dProps[propName].CanWrite)
- {
- dProps[propName].SetValue(dobj, val, null);
- }
- }
- }
+ if (sProps[propName].CanRead)
+ {
+ object val = sProps[propName].GetValue(so, null);
+ if (dProps[propName] != null)
+ {
+ if (val != null && dProps[propName].CanWrite)
+ {
+ dProps[propName].SetValue(dobj, val, null);
+ }
+ }
+ }
}
}
return dobj;
}
- private static Hashtable typeProperties = new Hashtable();
+ private static Hashtable typeProperties = new Hashtable();
public static Hashtable GetObjectProperties(object obj, bool persistentOnly)
{
@@ -82,7 +82,7 @@ namespace WebsitePanel.EnterpriseServer
{
// check for persistent attribute
object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
- if (!persistentOnly || (persistentOnly && attrs.Length > 0))
+ if (!persistentOnly || (persistentOnly && attrs.Length > 0) && !hash.ContainsKey(prop.Name))
{
object val = prop.GetValue(obj, null);
string s = "";
@@ -110,60 +110,60 @@ namespace WebsitePanel.EnterpriseServer
return hash;
}
- public static void FillCollectionFromDataSet(List list, DataSet ds)
- {
- if(ds.Tables.Count == 0)
- return;
+ public static void FillCollectionFromDataSet(List list, DataSet ds)
+ {
+ if (ds.Tables.Count == 0)
+ return;
FillCollectionFromDataView(list, ds.Tables[0].DefaultView);
- }
+ }
public static void FillCollectionFromDataView(List list, DataView dv)
- {
+ {
Type type = typeof(T);
- PropertyInfo[] props = GetTypeProperties(type);
+ PropertyInfo[] props = GetTypeProperties(type);
- foreach(DataRowView dr in dv)
- {
- // create an instance
- T obj = (T)Activator.CreateInstance(type);
- list.Add(obj);
+ foreach (DataRowView dr in dv)
+ {
+ // create an instance
+ T obj = (T)Activator.CreateInstance(type);
+ list.Add(obj);
- // fill properties
- for(int i = 0; i < props.Length; i++)
- {
- string propName = props[i].Name;
- if(dv.Table.Columns[propName] == null)
- continue;
+ // fill properties
+ for (int i = 0; i < props.Length; i++)
+ {
+ string propName = props[i].Name;
+ if (dv.Table.Columns[propName] == null)
+ continue;
- object propVal = dr[propName];
- if(propVal == DBNull.Value)
- props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
- else
- {
- try
- {
- // try implicit type conversion
- props[i].SetValue(obj, propVal, null);
- }
- catch
- {
- // convert to string and then set property value
- try
- {
- string strVal = propVal.ToString();
- props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
- }
- catch
- {
- // skip property init
- }
- }
- }
- } // for properties
- } // for rows
- }
+ object propVal = dr[propName];
+ if (propVal == DBNull.Value)
+ props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
+ else
+ {
+ try
+ {
+ // try implicit type conversion
+ props[i].SetValue(obj, propVal, null);
+ }
+ catch
+ {
+ // convert to string and then set property value
+ try
+ {
+ string strVal = propVal.ToString();
+ props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
+ }
+ catch
+ {
+ // skip property init
+ }
+ }
+ }
+ } // for properties
+ } // for rows
+ }
public static List CreateListFromDataReader(IDataReader reader)
{
@@ -179,201 +179,201 @@ namespace WebsitePanel.EnterpriseServer
return list;
}
- public static void FillCollectionFromDataReader(List list, IDataReader reader)
- {
+ public static void FillCollectionFromDataReader(List list, IDataReader reader)
+ {
Type type = typeof(T);
- try
- {
- // get type properties
- PropertyInfo[] props = GetTypeProperties(type);
+ try
+ {
+ // get type properties
+ PropertyInfo[] props = GetTypeProperties(type);
- // iterate through reader
- while(reader.Read())
- {
- T obj = (T)Activator.CreateInstance(type);
- list.Add(obj);
+ // iterate through reader
+ while (reader.Read())
+ {
+ T obj = (T)Activator.CreateInstance(type);
+ list.Add(obj);
- // set properties
- for(int i = 0; i < props.Length; i++)
- {
- string propName = props[i].Name;
-
- try
- {
+ // set properties
+ for (int i = 0; i < props.Length; i++)
+ {
+ string propName = props[i].Name;
- object propVal = reader[propName];
- if(propVal == DBNull.Value)
- props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
- else
- {
- try
- {
- // try implicit type conversion
- props[i].SetValue(obj, propVal, null);
- }
+ try
+ {
+
+ object propVal = reader[propName];
+ if (propVal == DBNull.Value)
+ props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
+ else
+ {
+ try
+ {
+ // try implicit type conversion
+ props[i].SetValue(obj, propVal, null);
+ }
catch (Exception ex)
- {
- // convert to string and then set property value
- try
- {
- string strVal = propVal.ToString();
- props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
- }
- catch(Exception e)
- {
- // skip property init
- }
- }
- }
- }
+ {
+ // convert to string and then set property value
+ try
+ {
+ string strVal = propVal.ToString();
+ props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
+ }
+ catch (Exception e)
+ {
+ // skip property init
+ }
+ }
+ }
+ }
catch (Exception e) { } // just skip
- } // for properties
- }
- }
- finally
- {
- reader.Close();
- }
- }
+ } // for properties
+ }
+ }
+ finally
+ {
+ reader.Close();
+ }
+ }
- public static T FillObjectFromDataView(DataView dv)
- {
+ public static T FillObjectFromDataView(DataView dv)
+ {
Type type = typeof(T);
- T obj = default(T);
+ T obj = default(T);
- // get type properties
- PropertyInfo[] props = GetTypeProperties(type);
+ // get type properties
+ PropertyInfo[] props = GetTypeProperties(type);
- // iterate through reader
- foreach(DataRowView dr in dv)
- {
- obj = (T)Activator.CreateInstance(type);
+ // iterate through reader
+ foreach (DataRowView dr in dv)
+ {
+ obj = (T)Activator.CreateInstance(type);
- // set properties
- for(int i = 0; i < props.Length; i++)
- {
- string propName = props[i].Name;
-
- try
- {
- // verify if there is such a column
- if (!dr.Row.Table.Columns.Contains(propName.ToLower()))
- {
- // if not, we move to another property
- // because this one we cannot set
- continue;
- }
+ // set properties
+ for (int i = 0; i < props.Length; i++)
+ {
+ string propName = props[i].Name;
- object propVal = dr[propName];
- if(propVal == DBNull.Value)
- props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
- else
- {
- try
- {
- string strVal = propVal.ToString();
+ try
+ {
+ // verify if there is such a column
+ if (!dr.Row.Table.Columns.Contains(propName.ToLower()))
+ {
+ // if not, we move to another property
+ // because this one we cannot set
+ continue;
+ }
- //convert to DateTime
- if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(DateTime).FullName)
- {
- DateTime date = DateTime.MinValue;
- if (DateTime.TryParse(strVal, out date))
- {
- props[i].SetValue(obj, date, null);
- }
- }
- else
- {
- //Convert generic
- props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
- }
- }
- catch
- {
- // skip property init
- }
- }
- }
- catch{} // just skip
- } // for properties
- }
+ object propVal = dr[propName];
+ if (propVal == DBNull.Value)
+ props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
+ else
+ {
+ try
+ {
+ string strVal = propVal.ToString();
- return obj;
- }
+ //convert to DateTime
+ if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(DateTime).FullName)
+ {
+ DateTime date = DateTime.MinValue;
+ if (DateTime.TryParse(strVal, out date))
+ {
+ props[i].SetValue(obj, date, null);
+ }
+ }
+ else
+ {
+ //Convert generic
+ props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
+ }
+ }
+ catch
+ {
+ // skip property init
+ }
+ }
+ }
+ catch { } // just skip
+ } // for properties
+ }
- public static T FillObjectFromDataReader(IDataReader reader)
+ return obj;
+ }
+
+ public static T FillObjectFromDataReader(IDataReader reader)
{
Type type = typeof(T);
T obj = default(T);
- try
- {
- // get type properties
- PropertyInfo[] props = GetTypeProperties(type);
+ try
+ {
+ // get type properties
+ PropertyInfo[] props = GetTypeProperties(type);
- // iterate through reader
- while(reader.Read())
- {
- obj = (T)Activator.CreateInstance(type);
+ // iterate through reader
+ while (reader.Read())
+ {
+ obj = (T)Activator.CreateInstance(type);
- // set properties
- for(int i = 0; i < props.Length; i++)
- {
- string propName = props[i].Name;
+ // set properties
+ for (int i = 0; i < props.Length; i++)
+ {
+ string propName = props[i].Name;
- try
- {
- if (!IsColumnExists(propName, reader.GetSchemaTable()))
- {
- continue;
- }
- object propVal = reader[propName];
-
- if(propVal == DBNull.Value)
- props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
- else
- {
- try
- {
- //try string first
- if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(String).FullName)
- {
- props[i].SetValue(obj, propVal.ToString(), null);
- }
- else
- {
- // then, try implicit type conversion
- props[i].SetValue(obj, propVal, null);
- }
- }
- catch
- {
- // convert to string and then set property value
- try
- {
- string strVal = propVal.ToString();
- props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
- }
- catch
- {
- // skip property init
- }
- }
- }
- }
- catch{} // just skip
- } // for properties
- }
- }
- finally
- {
- reader.Close();
- }
+ try
+ {
+ if (!IsColumnExists(propName, reader.GetSchemaTable()))
+ {
+ continue;
+ }
+ object propVal = reader[propName];
- return obj;
- }
+ if (propVal == DBNull.Value)
+ props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
+ else
+ {
+ try
+ {
+ //try string first
+ if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(String).FullName)
+ {
+ props[i].SetValue(obj, propVal.ToString(), null);
+ }
+ else
+ {
+ // then, try implicit type conversion
+ props[i].SetValue(obj, propVal, null);
+ }
+ }
+ catch
+ {
+ // convert to string and then set property value
+ try
+ {
+ string strVal = propVal.ToString();
+ props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
+ }
+ catch
+ {
+ // skip property init
+ }
+ }
+ }
+ }
+ catch { } // just skip
+ } // for properties
+ }
+ }
+ finally
+ {
+ reader.Close();
+ }
+
+ return obj;
+ }
private static Hashtable propertiesCache = new Hashtable();
@@ -384,7 +384,7 @@ namespace WebsitePanel.EnterpriseServer
Hashtable propValues = new Hashtable();
foreach (DataRowView dr in dv)
{
- if (propValues[dr[nameColumn]] == null)
+ if (propValues[dr[nameColumn]] == null && !propValues.ContainsKey(dr[nameColumn]))
propValues.Add(dr[nameColumn], dr[valueColumn]);
}
@@ -398,7 +398,7 @@ namespace WebsitePanel.EnterpriseServer
Hashtable propValues = new Hashtable();
while (reader.Read())
{
- if (propValues[reader[nameColumn]] == null)
+ if (propValues[reader[nameColumn]] == null && !propValues.ContainsKey(reader[nameColumn]))
propValues.Add(reader[nameColumn], reader[valueColumn]);
}
reader.Close();
@@ -416,50 +416,54 @@ namespace WebsitePanel.EnterpriseServer
return obj;
}
- public static void CopyPersistentPropertiesFromSource(T source, T target)
- where T : ServiceProviderItem
- {
- //
- var typeSource = source.GetType();
- var typeTarget = target.GetType();
- // get all property infos
- Hashtable props = null;
- if (propertiesCache[typeSource.Name] != null)
- {
- // load properties from cache
- props = (Hashtable)propertiesCache[typeSource.Name];
- }
- else
- {
- // create properties cache
- props = new Hashtable();
- //
- PropertyInfo[] objProps = typeSource.GetProperties(BindingFlags.Instance
- //| BindingFlags.DeclaredOnly
- | BindingFlags.Public);
- foreach (PropertyInfo prop in objProps)
- {
- // check for persistent attribute
- object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
- // Persistent only
- if (attrs.Length > 0)
- {
- // add property to hash
- props.Add(prop.Name, prop);
- }
- }
- // add to cache
- propertiesCache.Add(typeSource.Name, props);
- }
+ public static void CopyPersistentPropertiesFromSource(T source, T target)
+ where T : ServiceProviderItem
+ {
+ //
+ var typeSource = source.GetType();
+ var typeTarget = target.GetType();
+ // get all property infos
+ Hashtable props = null;
+ if (propertiesCache[typeSource.Name] != null)
+ {
+ // load properties from cache
+ props = (Hashtable)propertiesCache[typeSource.Name];
+ }
+ else
+ {
+ // create properties cache
+ props = new Hashtable();
+ //
+ PropertyInfo[] objProps = typeSource.GetProperties(BindingFlags.Instance
+ //| BindingFlags.DeclaredOnly
+ | BindingFlags.Public);
+ foreach (PropertyInfo prop in objProps)
+ {
+ // check for persistent attribute
+ object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
+ // Persistent only
+ if (attrs.Length > 0 && !props.ContainsKey(prop.Name))
+ {
+ // add property to hash
+ props.Add(prop.Name, prop);
+ }
+ }
- // Copy the data
- foreach (PropertyInfo propertyInfo in props.Values)
- {
- propertyInfo.SetValue(target, propertyInfo.GetValue(source, null), null);
- }
- }
+ if (!propertiesCache.ContainsKey(typeSource.Name))
+ {
+ // add to cache
+ propertiesCache.Add(typeSource.Name, props);
+ }
+ }
- public static void CreateObjectFromHash(object obj, Hashtable propValues, bool persistentOnly)
+ // Copy the data
+ foreach (PropertyInfo propertyInfo in props.Values)
+ {
+ propertyInfo.SetValue(target, propertyInfo.GetValue(source, null), null);
+ }
+ }
+
+ public static void CreateObjectFromHash(object obj, Hashtable propValues, bool persistentOnly)
{
Type type = obj.GetType();
@@ -481,15 +485,18 @@ namespace WebsitePanel.EnterpriseServer
{
// check for persistent attribute
object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
- if (!persistentOnly || (persistentOnly && attrs.Length > 0))
+ if (!persistentOnly || (persistentOnly && attrs.Length > 0) && !props.ContainsKey(prop.Name))
{
// add property to hash
props.Add(prop.Name, prop);
}
}
- // add to cache
- propertiesCache.Add(type.Name, props);
+ if (!propertiesCache.ContainsKey(type.Name))
+ {
+ // add to cache
+ propertiesCache.Add(type.Name, props);
+ }
}
// fill properties
@@ -513,37 +520,37 @@ namespace WebsitePanel.EnterpriseServer
else
if (prop.PropertyType == typeof(long))
prop.SetValue(obj, long.Parse(val), null);
- else
- if (prop.PropertyType == typeof(Boolean))
- prop.SetValue(obj, Boolean.Parse(val), null);
- else if (prop.PropertyType == typeof(Single))
- prop.SetValue(obj, Single.Parse(val), null);
- else if (prop.PropertyType.IsEnum)
- prop.SetValue(obj, Enum.Parse(prop.PropertyType, val, true), null);
- else
- if (prop.PropertyType == typeof(Guid))
- prop.SetValue(obj, new Guid(val), null);
- else
- if (prop.PropertyType == typeof(string[]))
- {
- if (val == "")
- prop.SetValue(obj, new string[0], null);
else
- prop.SetValue(obj, val.Split(';'), null);
- }
- else if (prop.PropertyType == typeof(int[]))
- {
- string[] svals = val.Split(';');
- int[] ivals = new int[svals.Length];
+ if (prop.PropertyType == typeof(Boolean))
+ prop.SetValue(obj, Boolean.Parse(val), null);
+ else if (prop.PropertyType == typeof(Single))
+ prop.SetValue(obj, Single.Parse(val), null);
+ else if (prop.PropertyType.IsEnum)
+ prop.SetValue(obj, Enum.Parse(prop.PropertyType, val, true), null);
+ else
+ if (prop.PropertyType == typeof(Guid))
+ prop.SetValue(obj, new Guid(val), null);
+ else
+ if (prop.PropertyType == typeof(string[]))
+ {
+ if (val == "")
+ prop.SetValue(obj, new string[0], null);
+ else
+ prop.SetValue(obj, val.Split(';'), null);
+ }
+ else if (prop.PropertyType == typeof(int[]))
+ {
+ string[] svals = val.Split(';');
+ int[] ivals = new int[svals.Length];
- for (int i = 0; i < svals.Length; i++)
- ivals[i] = Int32.Parse(svals[i]);
+ for (int i = 0; i < svals.Length; i++)
+ ivals[i] = Int32.Parse(svals[i]);
- if (val == "")
- ivals = new int[0];
+ if (val == "")
+ ivals = new int[0];
- prop.SetValue(obj, ivals, null);
- }
+ prop.SetValue(obj, ivals, null);
+ }
}
}
}
@@ -553,50 +560,55 @@ namespace WebsitePanel.EnterpriseServer
Dictionary hash = new Dictionary();
PropertyInfo[] props = GetTypeProperties(type);
foreach (PropertyInfo prop in props)
- hash.Add(prop.Name, prop);
+ {
+ if (!hash.ContainsKey(prop.Name))
+ {
+ hash.Add(prop.Name, prop);
+ }
+ }
return hash;
}
- private static PropertyInfo[] GetTypeProperties(Type type)
- {
- string typeName = type.AssemblyQualifiedName;
- if(typeProperties[typeName] != null)
- return (PropertyInfo[])typeProperties[typeName];
+ private static PropertyInfo[] GetTypeProperties(Type type)
+ {
+ string typeName = type.AssemblyQualifiedName;
+ if (typeProperties[typeName] != null)
+ return (PropertyInfo[])typeProperties[typeName];
- PropertyInfo[] props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
- typeProperties[typeName] = props;
- return props;
- }
+ PropertyInfo[] props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
+ typeProperties[typeName] = props;
+ return props;
+ }
- public static object GetNull(Type type)
- {
- if(type == typeof(string))
- return null;
- if(type == typeof(Int32))
- return 0;
- if(type == typeof(Int64))
- return 0;
- if(type == typeof(Boolean))
- return false;
- if(type == typeof(Decimal))
- return 0M;
- else
- return null;
- }
+ public static object GetNull(Type type)
+ {
+ if (type == typeof(string))
+ return null;
+ if (type == typeof(Int32))
+ return 0;
+ if (type == typeof(Int64))
+ return 0;
+ if (type == typeof(Boolean))
+ return false;
+ if (type == typeof(Decimal))
+ return 0M;
+ else
+ return null;
+ }
- public static object Cast(string val, Type type)
- {
- if(type == typeof(string))
- return val;
- if(type == typeof(Int32))
- return Int32.Parse(val);
- if(type == typeof(Int64))
- return Int64.Parse(val);
- if(type == typeof(Boolean))
- return Boolean.Parse(val);
- if(type == typeof(Decimal))
- return Decimal.Parse(val);
- if(type == typeof(string[]) && val != null)
+ public static object Cast(string val, Type type)
+ {
+ if (type == typeof(string))
+ return val;
+ if (type == typeof(Int32))
+ return Int32.Parse(val);
+ if (type == typeof(Int64))
+ return Int64.Parse(val);
+ if (type == typeof(Boolean))
+ return Boolean.Parse(val);
+ if (type == typeof(Decimal))
+ return Decimal.Parse(val);
+ if (type == typeof(string[]) && val != null)
{
return val.Split(';');
}
@@ -611,49 +623,49 @@ namespace WebsitePanel.EnterpriseServer
iarr[i] = Int32.Parse(sarr[i]);
return iarr;
}
- else
- return val;
- }
+ else
+ return val;
+ }
- public static string GetTypeFullName(Type type)
- {
- return type.FullName + ", " + type.Assembly.GetName().Name;
- }
+ public static string GetTypeFullName(Type type)
+ {
+ return type.FullName + ", " + type.Assembly.GetName().Name;
+ }
- #region Helper Functions
+ #region Helper Functions
- ///
- /// This function is used to determine whether IDataReader contains a Column.
- ///
- /// Name of the column.
- /// The schema that decribes result-set contains.
- /// True, when required column exists in the . Otherwise, false.
- ///
- /// The followin example shows how to look for the "Role" column in the .
- ///
- /// IDataReader reader = ....
- /// if (!IsColumnExists("Role", reader.GetSchemaTable())
- /// {
- /// continue;
- /// }
- ///
- /// object roleValue = reader["Role"];
- ///
- ///
- static bool IsColumnExists(string columnName, DataTable schemaTable)
- {
- foreach (DataRow row in schemaTable.Rows)
- {
- if (String.Compare(row[0].ToString(), columnName, StringComparison.OrdinalIgnoreCase) == 0)
- {
- return true;
- }
- }
+ ///
+ /// This function is used to determine whether IDataReader contains a Column.
+ ///
+ /// Name of the column.
+ /// The schema that decribes result-set contains.
+ /// True, when required column exists in the . Otherwise, false.
+ ///
+ /// The followin example shows how to look for the "Role" column in the .
+ ///
+ /// IDataReader reader = ....
+ /// if (!IsColumnExists("Role", reader.GetSchemaTable())
+ /// {
+ /// continue;
+ /// }
+ ///
+ /// object roleValue = reader["Role"];
+ ///
+ ///
+ static bool IsColumnExists(string columnName, DataTable schemaTable)
+ {
+ foreach (DataRow row in schemaTable.Rows)
+ {
+ if (String.Compare(row[0].ToString(), columnName, StringComparison.OrdinalIgnoreCase) == 0)
+ {
+ return true;
+ }
+ }
- return false;
- }
+ return false;
+ }
- #endregion
- }
-}
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs
index 51775512..ef0f1995 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs
@@ -1837,19 +1837,17 @@ namespace WebsitePanel.EnterpriseServer
#region Scheduler
- public static IDataReader GetBackgroundTask(int actorId, string taskId)
+ public static IDataReader GetBackgroundTask(string taskId)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetBackgroundTask",
- new SqlParameter("@actorId", actorId),
new SqlParameter("@taskId", taskId));
}
- public static IDataReader GetScheduleBackgroundTasks(int actorId, int scheduleId)
+ public static IDataReader GetScheduleBackgroundTasks(int scheduleId)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetScheduleBackgroundTasks",
- new SqlParameter("@actorId", actorId),
new SqlParameter("@scheduleId", scheduleId));
}
@@ -1860,11 +1858,10 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@actorId", actorId));
}
- public static IDataReader GetBackgroundTasks(int actorId, Guid guid)
+ public static IDataReader GetBackgroundTasks(Guid guid)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetThreadBackgroundTasks",
- new SqlParameter("@actorId", actorId),
new SqlParameter("@guid", guid));
}
@@ -1875,11 +1872,10 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@status", (int)status));
}
- public static IDataReader GetBackgroundTopTask(int actorId, Guid guid)
+ public static IDataReader GetBackgroundTopTask(Guid guid)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
- ObjectQualifier + "GetBackGroundTopTask",
- new SqlParameter("@actorId", actorId),
+ ObjectQualifier + "GetBackgroundTopTask",
new SqlParameter("@guid", guid));
}
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs
index 244ad9a2..34b9ffbf 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs
@@ -43,11 +43,10 @@ namespace WebsitePanel.EnterpriseServer
public sealed class Scheduler
{
public static SchedulerJob nextSchedule = null;
- //private static Timer timer = new Timer(ScheduleTasks, null, 30000, 30000);
public static void Start()
- {
- ScheduleTasks();
+ {
+ ScheduleTasks();
}
public static bool IsScheduleActive(int scheduleId)
@@ -57,33 +56,10 @@ namespace WebsitePanel.EnterpriseServer
return scheduledTasks.ContainsKey(scheduleId);
}
- public static void StartSchedule(SchedulerJob schedule)
- {
- if (IsScheduleActive(schedule.ScheduleInfo.ScheduleId))
- return;
-
- // run schedule
- RunSchedule(schedule, false);
- }
-
- public static void StopSchedule(SchedulerJob schedule)
- {
- Dictionary scheduledTasks = TaskManager.GetScheduledTasks();
- if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
- return;
-
- BackgroundTask activeTask = scheduledTasks[schedule.ScheduleInfo.ScheduleId];
- TaskManager.StopTask(activeTask.TaskId);
- }
-
public static void ScheduleTasks()
- {
- ScheduleTasks(null);
- }
-
- public static void ScheduleTasks(object obj)
- {
+ {
RunManualTasks();
+
nextSchedule = SchedulerController.GetNextSchedule();
if (nextSchedule != null)
@@ -125,6 +101,7 @@ namespace WebsitePanel.EnterpriseServer
backgroundTask.Guid = TaskManager.Guid;
backgroundTask.Status = BackgroundTaskStatus.Run;
+
TaskController.UpdateTask(backgroundTask);
try
@@ -132,7 +109,6 @@ namespace WebsitePanel.EnterpriseServer
var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType));
objTask.DoWork();
- // Thread.Sleep(40000);
}
catch (Exception ex)
{
@@ -199,6 +175,8 @@ namespace WebsitePanel.EnterpriseServer
counter++;
}
+ if (counter == MAX_RETRY_COUNT)
+ return;
// skip execution if the current task is still running
scheduledTasks = TaskManager.GetScheduledTasks();
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs
index c9bd79b2..3020c56c 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs
@@ -5,7 +5,6 @@ using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
-
namespace WebsitePanel.EnterpriseServer
{
public class TaskController
@@ -13,7 +12,7 @@ namespace WebsitePanel.EnterpriseServer
public static BackgroundTask GetTask(string taskId)
{
BackgroundTask task = ObjectUtils.FillObjectFromDataReader(
- DataProvider.GetBackgroundTask(SecurityContext.User.UserId, taskId));
+ DataProvider.GetBackgroundTask(taskId));
if (task == null)
{
@@ -28,12 +27,14 @@ namespace WebsitePanel.EnterpriseServer
public static List GetScheduleTasks(int scheduleId)
{
return ObjectUtils.CreateListFromDataReader(
- DataProvider.GetScheduleBackgroundTasks(SecurityContext.User.UserId, scheduleId));
+ DataProvider.GetScheduleBackgroundTasks(scheduleId));
}
public static List GetTasks()
{
- return GetTasks(SecurityContext.User.UserId);
+ var user = SecurityContext.User;
+
+ return GetTasks(user.IsPeer ? user.OwnerId : user.UserId);
}
public static List GetTasks(int actorId)
@@ -45,7 +46,7 @@ namespace WebsitePanel.EnterpriseServer
public static List GetTasks(Guid guid)
{
return ObjectUtils.CreateListFromDataReader(
- DataProvider.GetBackgroundTasks(SecurityContext.User.UserId, guid));
+ DataProvider.GetBackgroundTasks(guid));
}
public static List GetProcessTasks(BackgroundTaskStatus status)
@@ -57,7 +58,7 @@ namespace WebsitePanel.EnterpriseServer
public static BackgroundTask GetTopTask(Guid guid)
{
BackgroundTask task = ObjectUtils.FillObjectFromDataReader(
- DataProvider.GetBackgroundTopTask(SecurityContext.User.UserId, guid));
+ DataProvider.GetBackgroundTopTask(guid));
if (task == null)
{
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs
index b2af3f5b..ab907b60 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs
@@ -190,32 +190,36 @@ namespace WebsitePanel.EnterpriseServer
// call event handler
CallTaskEventHandler(task, false);
- int newTaskId = TaskController.AddTask(task);
- AddTaskThread(newTaskId, Thread.CurrentThread);
+ AddTaskThread(TaskController.AddTask(task), Thread.CurrentThread);
}
public static void WriteParameter(string parameterName, object parameterValue)
{
string val = parameterValue != null ? parameterValue.ToString() : "";
- WriteLogRecord(0, parameterName + ": " + val, null, null);
+ WriteLogRecord(Guid, 0, parameterName + ": " + val, null, null);
}
public static void Write(string text, params string[] textParameters)
{
// INFO
- WriteLogRecord(0, text, null, textParameters);
+ WriteLogRecord(Guid, 0, text, null, textParameters);
}
public static void WriteWarning(string text, params string[] textParameters)
+ {
+ WriteWarning(Guid, text, textParameters);
+ }
+
+ public static void WriteWarning(Guid guid, string text, params string[] textParameters)
{
// WARNING
- WriteLogRecord(1, text, null, textParameters);
+ WriteLogRecord(guid, 1, text, null, textParameters);
}
public static Exception WriteError(Exception ex)
{
// ERROR
- WriteLogRecord(2, ex.Message, ex.StackTrace);
+ WriteLogRecord(Guid, 2, ex.Message, ex.StackTrace);
return new Exception((TopTask != null)
? String.Format("Error executing '{0}' task on '{1}' {2}",
@@ -234,18 +238,18 @@ namespace WebsitePanel.EnterpriseServer
prms[0] = ex.Message;
}
- WriteLogRecord(2, text, ex.Message + "\n" + ex.StackTrace, prms);
+ WriteLogRecord(Guid, 2, text, ex.Message + "\n" + ex.StackTrace, prms);
}
public static void WriteError(string text, params string[] textParameters)
{
// ERROR
- WriteLogRecord(2, text, null, textParameters);
+ WriteLogRecord(Guid, 2, text, null, textParameters);
}
- private static void WriteLogRecord(int severity, string text, string stackTrace, params string[] textParameters)
+ private static void WriteLogRecord(Guid guid, int severity, string text, string stackTrace, params string[] textParameters)
{
- List tasks = TaskController.GetTasks(Guid);
+ List tasks = TaskController.GetTasks(guid);
if (tasks.Count > 0)
{
@@ -571,6 +575,8 @@ namespace WebsitePanel.EnterpriseServer
task.FinishDate = DateTime.Now;
+ WriteWarning(task.Guid, "Task aborted by user");
+
AddAuditLog(task);
TaskController.UpdateTask(task);
diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs
index 9405a417..d5407d1c 100644
--- a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs
+++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerService.cs
@@ -6,14 +6,16 @@ namespace WebsitePanel.SchedulerService
{
public partial class SchedulerService : ServiceBase
{
- private Timer _timer = new Timer(Process, null, 5000, 5000);
-
+ private Timer _Timer;
+ private static bool _isRuninng;
#region Construcor
public SchedulerService()
{
InitializeComponent();
+ _Timer = new Timer(Process, null, 5000, 5000);
+ _isRuninng = false;
}
#endregion
@@ -22,12 +24,17 @@ namespace WebsitePanel.SchedulerService
protected override void OnStart(string[] args)
{
- Scheduler.Start();
}
protected static void Process(object callback)
{
- Scheduler.Start();
+ //check running service
+ if (_isRuninng)
+ return;
+
+ _isRuninng = true;
+ Scheduler.Start();
+ _isRuninng = false;
}
#endregion