/projects/PigeonCms.Core/DAL/SectionsManager.cs

http://pigeoncms.googlecode.com/ · C# · 447 lines · 381 code · 46 blank · 20 comment · 38 complexity · 66003519ec76163cbb203f3bdf5aeb48 MD5 · raw file

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.ComponentModel;
  11. using System.Collections.Generic;
  12. using System.IO;
  13. using System.Data.Common;
  14. using PigeonCms;
  15. using System.Diagnostics;
  16. namespace PigeonCms
  17. {
  18. /// <summary>
  19. /// DAL for categoria obj (in table categorie)
  20. /// </summary>
  21. public class SectionsManager : TableManager<Section, SectionsFilter, int>, ITableManagerWithPermission
  22. {
  23. private bool checkUserContext = false;
  24. private bool writeMode = false;
  25. public bool CheckUserContext
  26. {
  27. get { return checkUserContext; }
  28. }
  29. public bool WriteMode
  30. {
  31. get { return writeMode; }
  32. }
  33. [DebuggerStepThrough()]
  34. public SectionsManager(): this(false, false)
  35. { }
  36. public SectionsManager(bool checkUserContext, bool writeMode)
  37. {
  38. this.TableName = "#__sections";
  39. this.KeyFieldName = "Id";
  40. this.checkUserContext = checkUserContext;
  41. this.writeMode = writeMode;
  42. if (this.writeMode) this.checkUserContext = true; //forced
  43. }
  44. public override Dictionary<string, string> GetList()
  45. {
  46. Dictionary<string, string> res = new Dictionary<string, string>();
  47. SectionsFilter filter = new SectionsFilter();
  48. List<Section> list = GetByFilter(filter, "");
  49. foreach (Section item in list)
  50. {
  51. res.Add(item.Id.ToString(), item.Title);
  52. }
  53. return res;
  54. }
  55. public override List<Section> GetByFilter(SectionsFilter filter, string sort)
  56. {
  57. DbProviderFactory myProv = Database.ProviderFactory;
  58. DbConnection myConn = myProv.CreateConnection();
  59. DbDataReader myRd = null;
  60. DbCommand myCmd = myConn.CreateCommand();
  61. string sSql;
  62. List<Section> result = new List<Section>();
  63. try
  64. {
  65. myConn.ConnectionString = Database.ConnString;
  66. myConn.Open();
  67. myCmd.Connection = myConn;
  68. sSql = "SELECT t.Id, t.Enabled, "
  69. + " t.AccessType, t.PermissionId, t.AccessCode, t.AccessLevel, "
  70. + " t.WriteAccessType, t.WritePermissionId, t.WriteAccessCode, t.WriteAccessLevel, "
  71. + " t.MaxItems, t.MaxAttachSizeKB "
  72. + " FROM ["+ this.TableName +"] t "
  73. + " WHERE t.Id > 0 ";
  74. if (filter.Id > 0 || filter.Id == -1)
  75. {
  76. sSql += " AND t.Id = @Id ";
  77. myCmd.Parameters.Add(Database.Parameter(myProv, "Id", filter.Id));
  78. }
  79. if (filter.Enabled != Utility.TristateBool.NotSet)
  80. {
  81. sSql += " AND t.Enabled = @Enabled ";
  82. myCmd.Parameters.Add(Database.Parameter(myProv, "Enabled", filter.Enabled));
  83. }
  84. if (!string.IsNullOrEmpty(sort))
  85. {
  86. sSql += " ORDER BY " + sort;
  87. }
  88. myCmd.CommandText = Database.ParseSql(sSql);
  89. myRd = myCmd.ExecuteReader();
  90. while (myRd.Read())
  91. {
  92. var item = new Section();
  93. FillObject(item, myRd);
  94. result.Add(item);
  95. }
  96. myRd.Close();
  97. //(other loop to avoid multiple reader on same command)
  98. foreach (Section item in result)
  99. {
  100. //load read roles
  101. if (item.ReadPermissionId > 0 && item.ReadAccessType != MenuAccesstype.Public)
  102. item.ReadRolenames = new PermissionProvider().GetPermissionRoles(item.ReadPermissionId);
  103. //load write roles
  104. if (item.WritePermissionId > 0 && item.WriteAccessType != MenuAccesstype.Public)
  105. item.WriteRolenames = new PermissionProvider().GetPermissionRoles(item.WritePermissionId);
  106. }
  107. if (this.CheckUserContext)
  108. {
  109. result.RemoveAll(new PermissionProvider().IsItemNotAllowed);
  110. if (this.WriteMode)
  111. result.RemoveAll(new PermissionProvider().IsItemNotAllowedForWrite);
  112. }
  113. //culture specifics
  114. foreach (Section item in result)
  115. {
  116. getCultureSpecific(item, myRd, myCmd, myProv);
  117. }
  118. }
  119. finally
  120. {
  121. myConn.Dispose();
  122. }
  123. return result;
  124. }
  125. public override Section GetByKey(int id)
  126. {
  127. var result = new Section();
  128. var resultList = new List<Section>();
  129. var filter = new SectionsFilter();
  130. filter.Id = id == 0 ? -1 : id;
  131. resultList = GetByFilter(filter, "");
  132. if (resultList.Count > 0)
  133. result = resultList[0];
  134. return result;
  135. }
  136. public override int Update(Section theObj)
  137. {
  138. DbProviderFactory myProv = Database.ProviderFactory;
  139. DbTransaction myTrans = null;
  140. DbConnection myConn = myProv.CreateConnection();
  141. DbCommand myCmd = myConn.CreateCommand();
  142. string sSql;
  143. int result = 0;
  144. try
  145. {
  146. //fill ReadPermissionId and WritePermissionId before trans
  147. new PermissionProvider().UpdatePermissionObj(theObj);
  148. myConn.ConnectionString = Database.ConnString;
  149. myConn.Open();
  150. myCmd.Connection = myConn;
  151. myTrans = myConn.BeginTransaction();
  152. myCmd.Transaction = myTrans;
  153. sSql = "UPDATE [" + this.TableName + "] "
  154. + " SET Enabled=@Enabled, "
  155. + " AccessType=@AccessType, PermissionId=@PermissionId, "
  156. + " [AccessCode]=@AccessCode, AccessLevel=@AccessLevel, "
  157. + " WriteAccessType=@WriteAccessType, WritePermissionId=@WritePermissionId, "
  158. + " [WriteAccessCode]=@WriteAccessCode, WriteAccessLevel=@WriteAccessLevel, "
  159. + " [MaxItems]=@MaxItems, MaxAttachSizeKB=@MaxAttachSizeKB "
  160. + " WHERE Id = @Id";
  161. myCmd.CommandText = Database.ParseSql(sSql);
  162. myCmd.Parameters.Add(Database.Parameter(myProv, "Id", theObj.Id));
  163. myCmd.Parameters.Add(Database.Parameter(myProv, "Enabled", theObj.Enabled));
  164. //read permissions
  165. myCmd.Parameters.Add(Database.Parameter(myProv, "AccessType", theObj.ReadAccessType));
  166. myCmd.Parameters.Add(Database.Parameter(myProv, "PermissionId", theObj.ReadPermissionId));
  167. myCmd.Parameters.Add(Database.Parameter(myProv, "AccessCode", theObj.ReadAccessCode));
  168. myCmd.Parameters.Add(Database.Parameter(myProv, "AccessLevel", theObj.ReadAccessLevel));
  169. //write permissions
  170. myCmd.Parameters.Add(Database.Parameter(myProv, "WriteAccessType", theObj.WriteAccessType));
  171. myCmd.Parameters.Add(Database.Parameter(myProv, "WritePermissionId", theObj.WritePermissionId));
  172. myCmd.Parameters.Add(Database.Parameter(myProv, "WriteAccessCode", theObj.WriteAccessCode));
  173. myCmd.Parameters.Add(Database.Parameter(myProv, "WriteAccessLevel", theObj.WriteAccessLevel));
  174. //limits
  175. myCmd.Parameters.Add(Database.Parameter(myProv, "MaxItems", theObj.MaxItems));
  176. myCmd.Parameters.Add(Database.Parameter(myProv, "MaxAttachSizeKB", theObj.MaxAttachSizeKB));
  177. result = myCmd.ExecuteNonQuery();
  178. updateCultureText(theObj, myCmd, myProv);
  179. myTrans.Commit();
  180. }
  181. catch (Exception e)
  182. {
  183. myTrans.Rollback();
  184. throw e;
  185. }
  186. finally
  187. {
  188. myTrans.Dispose();
  189. myConn.Dispose();
  190. }
  191. return result;
  192. }
  193. public override Section Insert(Section newObj)
  194. {
  195. DbProviderFactory myProv = Database.ProviderFactory;
  196. DbTransaction myTrans = null;
  197. DbConnection myConn = myProv.CreateConnection();
  198. DbCommand myCmd = myConn.CreateCommand();
  199. string sSql;
  200. Section result = new Section();
  201. try
  202. {
  203. //create read/write permission
  204. new PermissionProvider().CreatePermissionObj(newObj);
  205. myConn.ConnectionString = Database.ConnString;
  206. myConn.Open();
  207. myCmd.Connection = myConn;
  208. myTrans = myConn.BeginTransaction();
  209. myCmd.Transaction = myTrans;
  210. result = newObj;
  211. result.Id = base.GetNextId();
  212. sSql = "INSERT INTO [" + this.TableName + "](Id, Enabled, "
  213. + " AccessType, PermissionId, AccessCode, AccessLevel, "
  214. + " WriteAccessType, WritePermissionId, WriteAccessCode, WriteAccessLevel, "
  215. + " MaxItems, MaxAttachSizeKB) "
  216. + " VALUES(@Id, @Enabled, "
  217. + " @AccessType, @PermissionId, @AccessCode, @AccessLevel, "
  218. + " @WriteAccessType, @WritePermissionId, @WriteAccessCode, @WriteAccessLevel, "
  219. + " @MaxItems, @MaxAttachSizeKB) ";
  220. myCmd.CommandText = Database.ParseSql(sSql);
  221. myCmd.Parameters.Add(Database.Parameter(myProv, "Id", result.Id));
  222. myCmd.Parameters.Add(Database.Parameter(myProv, "Enabled", result.Enabled));
  223. //read permissions
  224. myCmd.Parameters.Add(Database.Parameter(myProv, "AccessType", (int)result.ReadAccessType));
  225. myCmd.Parameters.Add(Database.Parameter(myProv, "PermissionId", result.ReadPermissionId));
  226. myCmd.Parameters.Add(Database.Parameter(myProv, "AccessCode", (string)result.ReadAccessCode));
  227. myCmd.Parameters.Add(Database.Parameter(myProv, "AccessLevel", (int)result.ReadAccessLevel));
  228. //write permissions
  229. myCmd.Parameters.Add(Database.Parameter(myProv, "WriteAccessType", (int)result.WriteAccessType));
  230. myCmd.Parameters.Add(Database.Parameter(myProv, "WritePermissionId", result.WritePermissionId));
  231. myCmd.Parameters.Add(Database.Parameter(myProv, "WriteAccessCode", (string)result.WriteAccessCode));
  232. myCmd.Parameters.Add(Database.Parameter(myProv, "WriteAccessLevel", (int)result.WriteAccessLevel));
  233. //limits
  234. myCmd.Parameters.Add(Database.Parameter(myProv, "MaxItems", (int)result.MaxItems));
  235. myCmd.Parameters.Add(Database.Parameter(myProv, "MaxAttachSizeKB", (int)result.MaxAttachSizeKB));
  236. myCmd.ExecuteNonQuery();
  237. updateCultureText(result, myCmd, myProv);
  238. myTrans.Commit();
  239. }
  240. catch (Exception e)
  241. {
  242. myTrans.Rollback();
  243. throw e;
  244. }
  245. finally
  246. {
  247. myTrans.Dispose();
  248. myConn.Dispose();
  249. }
  250. return result;
  251. }
  252. public int DeleteById(int id, bool deleteChilds)
  253. {
  254. DbProviderFactory myProv = Database.ProviderFactory;
  255. DbTransaction myTrans = null;
  256. DbConnection myConn = myProv.CreateConnection();
  257. DbCommand myCmd = myProv.CreateCommand();
  258. string sSql;
  259. int res = 0;
  260. if (!deleteChilds && this.hasChilds(id))
  261. {
  262. throw new ArgumentException("current obj has childs");
  263. }
  264. try
  265. {
  266. var currObj = this.GetByKey(id);
  267. if (deleteChilds && id>0)
  268. {
  269. //delete all its categories
  270. var catman = new CategoriesManager();
  271. var catfilter = new CategoriesFilter();
  272. catfilter.SectionId = id;
  273. var catList = catman.GetByFilter(catfilter, "");
  274. foreach (var cat in catList)
  275. {
  276. catman.DeleteById(cat.Id, true);
  277. }
  278. }
  279. currObj.DeleteImages();
  280. currObj.DeleteFiles();
  281. new PermissionProvider().RemovePermissionById(currObj.ReadPermissionId);
  282. new PermissionProvider().RemovePermissionById(currObj.WritePermissionId);
  283. myConn.ConnectionString = Database.ConnString;
  284. myConn.Open();
  285. myCmd.Connection = myConn;
  286. myTrans = myConn.BeginTransaction();
  287. myCmd.Transaction = myTrans;
  288. sSql = "DELETE FROM [" + this.TableName + "] WHERE Id = @Id ";
  289. myCmd.CommandText = Database.ParseSql(sSql);
  290. myCmd.Parameters.Add(Database.Parameter(myProv, "Id", id));
  291. res = myCmd.ExecuteNonQuery();
  292. sSql = "DELETE FROM [" + this.TableName + "_Culture] WHERE SectionId = @SectionId ";
  293. myCmd.CommandText = Database.ParseSql(sSql);
  294. myCmd.Parameters.Clear();
  295. myCmd.Parameters.Add(Database.Parameter(myProv, "SectionId", id));
  296. myCmd.ExecuteNonQuery();
  297. myTrans.Commit();
  298. }
  299. catch (Exception e)
  300. {
  301. myTrans.Rollback();
  302. throw e;
  303. }
  304. finally
  305. {
  306. myTrans.Dispose();
  307. myConn.Dispose();
  308. }
  309. return res;
  310. }
  311. public override int DeleteById(int id)
  312. {
  313. return this.DeleteById(id, false);
  314. }
  315. protected override void FillObject(Section result, DbDataReader myRd)
  316. {
  317. if (!Convert.IsDBNull(myRd["Id"]))
  318. result.Id = (int)myRd["Id"];
  319. if (!Convert.IsDBNull(myRd["Enabled"]))
  320. result.Enabled = (bool)myRd["Enabled"];
  321. //read permissions
  322. if (!Convert.IsDBNull(myRd["AccessType"]))
  323. result.ReadAccessType = (MenuAccesstype)int.Parse(myRd["AccessType"].ToString());
  324. if (!Convert.IsDBNull(myRd["PermissionId"]))
  325. result.ReadPermissionId = (int)myRd["PermissionId"];
  326. if (!Convert.IsDBNull(myRd["AccessCode"]))
  327. result.ReadAccessCode = (string)myRd["AccessCode"];
  328. if (!Convert.IsDBNull(myRd["AccessLevel"]))
  329. result.ReadAccessLevel = (int)myRd["AccessLevel"];
  330. //write permissions
  331. if (!Convert.IsDBNull(myRd["WriteAccessType"]))
  332. result.WriteAccessType = (MenuAccesstype)int.Parse(myRd["WriteAccessType"].ToString());
  333. if (!Convert.IsDBNull(myRd["WritePermissionId"]))
  334. result.WritePermissionId = (int)myRd["WritePermissionId"];
  335. if (!Convert.IsDBNull(myRd["WriteAccessCode"]))
  336. result.WriteAccessCode = (string)myRd["WriteAccessCode"];
  337. if (!Convert.IsDBNull(myRd["WriteAccessLevel"]))
  338. result.WriteAccessLevel = (int)myRd["WriteAccessLevel"];
  339. //limits
  340. if (!Convert.IsDBNull(myRd["MaxItems"]))
  341. result.MaxItems = (int)myRd["MaxItems"];
  342. if (!Convert.IsDBNull(myRd["MaxAttachSizeKB"]))
  343. result.MaxAttachSizeKB = (int)myRd["MaxAttachSizeKB"];
  344. }
  345. private bool hasChilds(int sectionId)
  346. {
  347. bool res = false;
  348. var man = new CategoriesManager();
  349. var filter = new CategoriesFilter();
  350. filter.SectionId = sectionId;
  351. if (man.GetByFilter(filter, "").Count > 0)
  352. res = true;
  353. return res;
  354. }
  355. private void getCultureSpecific(Section result, DbDataReader myRd,
  356. DbCommand myCmd, DbProviderFactory myProv)
  357. {
  358. string sSql;
  359. //culture specific
  360. sSql = "SELECT CultureName, SectionId, Title, Description "
  361. + " FROM [" + this.TableName + "_culture] t "
  362. + " WHERE SectionId = @SectionId ";
  363. myCmd.CommandText = Database.ParseSql(sSql);
  364. myCmd.Parameters.Clear();
  365. myCmd.Parameters.Add(Database.Parameter(myProv, "SectionId", result.Id));
  366. myRd = myCmd.ExecuteReader();
  367. while (myRd.Read())
  368. {
  369. if (!Convert.IsDBNull(myRd["Title"]))
  370. result.TitleTranslations.Add((string)myRd["cultureName"], (string)myRd["Title"]);
  371. if (!Convert.IsDBNull(myRd["Description"]))
  372. result.DescriptionTranslations.Add((string)myRd["cultureName"], (string)myRd["Description"]);
  373. }
  374. myRd.Close();
  375. }
  376. private void updateCultureText(Section theObj, DbCommand myCmd, DbProviderFactory myProv)
  377. {
  378. string sSql = "";
  379. foreach (KeyValuePair<string, string> item in theObj.TitleTranslations)
  380. {
  381. string descriptionValue = "";
  382. theObj.DescriptionTranslations.TryGetValue(item.Key, out descriptionValue);
  383. sSql = "DELETE FROM [" + this.TableName + "_culture] WHERE CultureName=@CultureName AND SectionId=@SectionId ";
  384. myCmd.CommandText = Database.ParseSql(sSql);
  385. myCmd.Parameters.Clear();
  386. myCmd.Parameters.Add(Database.Parameter(myProv, "CultureName", item.Key));
  387. myCmd.Parameters.Add(Database.Parameter(myProv, "SectionId", theObj.Id));
  388. myCmd.ExecuteNonQuery();
  389. sSql = "INSERT INTO [" + this.TableName + "_culture](CultureName, SectionId, Title, Description) "
  390. + " VALUES(@CultureName, @SectionId, @Title, @Description) ";
  391. myCmd.CommandText = Database.ParseSql(sSql);
  392. myCmd.Parameters.Clear();
  393. myCmd.Parameters.Add(Database.Parameter(myProv, "CultureName", item.Key));
  394. myCmd.Parameters.Add(Database.Parameter(myProv, "SectionId", theObj.Id));
  395. myCmd.Parameters.Add(Database.Parameter(myProv, "Title", item.Value));
  396. myCmd.Parameters.Add(Database.Parameter(myProv, "Description", descriptionValue));
  397. myCmd.ExecuteNonQuery();
  398. }
  399. }
  400. }
  401. }