diff --git a/RMuseum/Services/Implementation/GanjoorService.cs b/RMuseum/Services/Implementation/GanjoorService.cs
index 6a208227..60e4722c 100644
--- a/RMuseum/Services/Implementation/GanjoorService.cs
+++ b/RMuseum/Services/Implementation/GanjoorService.cs
@@ -10,6 +10,8 @@ using RMuseum.Models.GanjoorAudio;
using RMuseum.Models.GanjoorAudio.ViewModels;
using RMuseum.Models.GanjoorIntegration.ViewModels;
using RSecurityBackend.Models.Generic;
+using RSecurityBackend.Services;
+using RSecurityBackend.Services.Implementation;
using System;
using System.Collections.Generic;
using System.Data;
@@ -943,154 +945,179 @@ namespace RMuseum.Services.Implementation
(
async token =>
{
+
using (RMuseumDbContext context = new RMuseumDbContext(Configuration)) //this is long running job, so _context might be already been freed/collected by GC
+ using (RMuseumDbContext contextReport = new RMuseumDbContext(Configuration)) //this is long running job, so _context might be already been freed/collected by GC
{
- using (MySqlConnection connection = new MySqlConnection
- (
- $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["Username"]};pwd={Configuration.GetSection("AudioMySqlServer")["Password"]};database={Configuration.GetSection("AudioMySqlServer")["Database"]};charset=utf8;convert zero datetime=True"
- ))
+ LongRunningJobProgressServiceEF jobProgressServiceEF = new LongRunningJobProgressServiceEF(contextReport);
+ var job = (await jobProgressServiceEF.NewJob("GanjoorService:ImportFromMySql", "pre open connection")).Result;
+
+ try
{
- connection.Open();
- using (MySqlDataAdapter src = new MySqlDataAdapter(
- "SELECT ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count, " +
- "COALESCE((SELECT meta_value FROM ganja_postmeta WHERE post_id = ID AND meta_key='_wp_page_template'), '') AS template," +
- "(SELECT meta_value FROM ganja_postmeta WHERE post_id = ID AND meta_key='otherpoetid') AS other_poet_id " +
- "FROM ganja_posts",
- connection))
+ using (MySqlConnection connection = new MySqlConnection
+ (
+ $"server={Configuration.GetSection("AudioMySqlServer")["Server"]};uid={Configuration.GetSection("AudioMySqlServer")["Username"]};pwd={Configuration.GetSection("AudioMySqlServer")["Password"]};database={Configuration.GetSection("AudioMySqlServer")["Database"]};charset=utf8;convert zero datetime=True"
+ ))
{
- using (DataTable srcData = new DataTable())
+ connection.Open();
+ using (MySqlDataAdapter src = new MySqlDataAdapter(
+ "SELECT ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count, " +
+ "COALESCE((SELECT meta_value FROM ganja_postmeta WHERE post_id = ID AND meta_key='_wp_page_template'), '') AS template," +
+ "(SELECT meta_value FROM ganja_postmeta WHERE post_id = ID AND meta_key='otherpoetid') AS other_poet_id " +
+ "FROM ganja_posts",
+ connection))
{
- await src.FillAsync(srcData);
- foreach (DataRow row in srcData.Rows)
+ using (DataTable srcData = new DataTable())
{
- GanjoorPageType pageType =
- row["post_type"].ToString() == "post" && row["comment_status"].ToString() != "closed" ?
- GanjoorPageType.PoemPage
- :
- row["template"].ToString() == "comspage.php" ?
- GanjoorPageType.AllComments
- :
- row["template"].ToString() == "relations.php" ?
- GanjoorPageType.ProsodySimilars
- :
- row["template"].ToString() == "vazn.php" ?
- GanjoorPageType.ProsodyAndStats
- :
- GanjoorPageType.None;
+ await src.FillAsync(srcData);
- int? poetId = row["post_author"].ToString() == "0" ? (int?)null : int.Parse(row["post_author"].ToString());
- if (poetId == 36)//رشحه
- {
- continue;
- }
+ job = (await jobProgressServiceEF.UpdateJob(job.Id, 0, "phase 1")).Result;
- if (poetId != null)
+
+ foreach (DataRow row in srcData.Rows)
{
- if (!await context.GanjoorPoets.Where(poet => poet.Id == poetId).AnyAsync())
+ GanjoorPageType pageType =
+ row["post_type"].ToString() == "post" && row["comment_status"].ToString() != "closed" ?
+ GanjoorPageType.PoemPage
+ :
+ row["template"].ToString() == "comspage.php" ?
+ GanjoorPageType.AllComments
+ :
+ row["template"].ToString() == "relations.php" ?
+ GanjoorPageType.ProsodySimilars
+ :
+ row["template"].ToString() == "vazn.php" ?
+ GanjoorPageType.ProsodyAndStats
+ :
+ GanjoorPageType.None;
+
+ int? poetId = row["post_author"].ToString() == "0" ? (int?)null : int.Parse(row["post_author"].ToString());
+ if (poetId == 36)//رشحه
{
continue;
}
- }
- GanjoorPage page = new GanjoorPage()
- {
- Id = int.Parse(row["ID"].ToString()),
- GanjoorPageType = pageType,
- Published = true,
- PageOrder = -1,
- Title = row["post_title"].ToString(),
- UrlSlug = row["post_name"].ToString(),
- HtmlText = row["post_content"].ToString(),
- ParentId = row["post_parent"].ToString() == "0" ? (int?)null : int.Parse(row["post_parent"].ToString()),
- PoetId = row["post_author"].ToString() == "1" ? (int?)null : int.Parse(row["post_author"].ToString()),
- SecondPoetId = row["other_poet_id"] == DBNull.Value ? (int?)null : int.Parse(row["other_poet_id"].ToString()),
- PostDate = (DateTime)row["post_date"]
- };
-
-
-
- if (pageType == GanjoorPageType.PoemPage)
- {
- var poem = await context.GanjoorPoems.Where(p => p.Id == page.Id).FirstOrDefaultAsync();
- if (poem == null)
- continue;
- page.PoemId = poem.Id;
- }
- if (poetId != null && pageType == GanjoorPageType.None)
- {
- GanjoorCat cat = await context.GanjoorCategories.Where(c => c.PoetId == poetId && c.ParentId == null && c.UrlSlug == page.UrlSlug).SingleOrDefaultAsync();
- if (cat != null)
+ if (poetId != null)
{
- page.GanjoorPageType = GanjoorPageType.PoetPage;
- page.CatId = cat.Id;
- }
- else
- {
- cat = await context.GanjoorCategories.Where(c => c.PoetId == poetId && c.ParentId != null && c.UrlSlug == page.UrlSlug).SingleOrDefaultAsync();
- if (cat != null)
+ if (!await context.GanjoorPoets.Where(poet => poet.Id == poetId).AnyAsync())
{
- page.GanjoorPageType = GanjoorPageType.CatPage;
- page.CatId = cat.Id;
+ continue;
}
}
- }
- context.GanjoorPages.Add(page);
+ GanjoorPage page = new GanjoorPage()
+ {
+ Id = int.Parse(row["ID"].ToString()),
+ GanjoorPageType = pageType,
+ Published = true,
+ PageOrder = -1,
+ Title = row["post_title"].ToString(),
+ UrlSlug = row["post_name"].ToString(),
+ HtmlText = row["post_content"].ToString(),
+ ParentId = row["post_parent"].ToString() == "0" ? (int?)null : int.Parse(row["post_parent"].ToString()),
+ PoetId = row["post_author"].ToString() == "1" ? (int?)null : int.Parse(row["post_author"].ToString()),
+ SecondPoetId = row["other_poet_id"] == DBNull.Value ? (int?)null : int.Parse(row["other_poet_id"].ToString()),
+ PostDate = (DateTime)row["post_date"]
+ };
+
+
+
+ if (pageType == GanjoorPageType.PoemPage)
+ {
+ var poem = await context.GanjoorPoems.Where(p => p.Id == page.Id).FirstOrDefaultAsync();
+ if (poem == null)
+ continue;
+ page.PoemId = poem.Id;
+ }
+ if (poetId != null && pageType == GanjoorPageType.None)
+ {
+ GanjoorCat cat = await context.GanjoorCategories.Where(c => c.PoetId == poetId && c.ParentId == null && c.UrlSlug == page.UrlSlug).SingleOrDefaultAsync();
+ if (cat != null)
+ {
+ page.GanjoorPageType = GanjoorPageType.PoetPage;
+ page.CatId = cat.Id;
+ }
+ else
+ {
+ cat = await context.GanjoorCategories.Where(c => c.PoetId == poetId && c.ParentId != null && c.UrlSlug == page.UrlSlug).SingleOrDefaultAsync();
+ if (cat != null)
+ {
+ page.GanjoorPageType = GanjoorPageType.CatPage;
+ page.CatId = cat.Id;
+ }
+ }
+ }
+
+ context.GanjoorPages.Add(page);
+ }
}
}
}
- }
- await context.SaveChangesAsync();
+ await context.SaveChangesAsync();
+
+ job = (await jobProgressServiceEF.UpdateJob(job.Id, 50, "phase 2")).Result;
- var orphanPages = await context.GanjoorPages.Include(p => p.Poem).Where(p => p.FullUrl == null).ToListAsync();
- foreach (var page in orphanPages)
- {
- string fullUrl = page.UrlSlug;
- string fullTitle = page.Title;
-
- if (page.GanjoorPageType == GanjoorPageType.PoemPage)
+ var orphanPages = await context.GanjoorPages.Include(p => p.Poem).Where(p => p.FullUrl == null).ToListAsync();
+ double count = orphanPages.Count;
+ int i = 0;
+ foreach (var page in orphanPages)
{
- fullTitle = page.Poem.FullTitle;
- fullUrl = page.Poem.FullUrl;
- }
- else
- {
- if (page.ParentId != null)
+
+ job = (await jobProgressServiceEF.UpdateJob(job.Id, 50 + i / count * 100, "phase 2")).Result;
+
+ string fullUrl = page.UrlSlug;
+ string fullTitle = page.Title;
+
+ if (page.GanjoorPageType == GanjoorPageType.PoemPage)
{
- GanjoorPage parent = await context.GanjoorPages.Where(p => p.Id == page.ParentId).SingleAsync();
- while (parent != null)
- {
- fullUrl = parent.UrlSlug + "/" + fullUrl;
- fullTitle = parent.Title + " » " + fullTitle;
- parent = parent.ParentId == null ? null : await context.GanjoorPages.Where(p => p.Id == parent.ParentId).SingleAsync();
- }
+ fullTitle = page.Poem.FullTitle;
+ fullUrl = page.Poem.FullUrl;
}
else
{
- GanjoorCat cat = await context.GanjoorCategories.Where(c => c.PoetId == page.PoetId && c.UrlSlug == page.UrlSlug).SingleOrDefaultAsync();
- if (cat != null)
+ if (page.ParentId != null)
{
- fullUrl = cat.FullUrl;
- while (cat.ParentId != null)
+ GanjoorPage parent = await context.GanjoorPages.Where(p => p.Id == page.ParentId).SingleAsync();
+ while (parent != null)
{
- cat = await context.GanjoorCategories.Where(c => c.Id == cat.Id).SingleOrDefaultAsync();
- if (cat != null)
+ fullUrl = parent.UrlSlug + "/" + fullUrl;
+ fullTitle = parent.Title + " » " + fullTitle;
+ parent = parent.ParentId == null ? null : await context.GanjoorPages.Where(p => p.Id == parent.ParentId).SingleAsync();
+ }
+ }
+ else
+ {
+ GanjoorCat cat = await context.GanjoorCategories.Where(c => c.PoetId == page.PoetId && c.UrlSlug == page.UrlSlug).SingleOrDefaultAsync();
+ if (cat != null)
+ {
+ fullUrl = cat.FullUrl;
+ while (cat.ParentId != null)
{
- fullTitle = cat.Title + " » " + fullTitle;
+ cat = await context.GanjoorCategories.Where(c => c.Id == cat.Id).SingleOrDefaultAsync();
+ if (cat != null)
+ {
+ fullTitle = cat.Title + " » " + fullTitle;
+ }
}
}
}
+
}
+ page.FullUrl = fullUrl;
+ page.FullTitle = fullTitle;
+ context.Update(page);
}
- page.FullUrl = fullUrl;
- page.FullTitle = fullTitle;
- context.Update(page);
+ await context.SaveChangesAsync();
+
+ await jobProgressServiceEF.UpdateJob(job.Id, 100, "Finised", true);
+ }
+ catch(Exception jobExp)
+ {
+ await jobProgressServiceEF.UpdateJob(job.Id, job.Progress, "", false, jobExp.ToString());
}
-
- await context.SaveChangesAsync();
}
});
@@ -1243,6 +1270,7 @@ namespace RMuseum.Services.Implementation
///
protected readonly IBackgroundTaskQueue _backgroundTaskQueue;
+
///
/// constructor
///
diff --git a/RSecurityBackend/Services/Implementation/LongRunningJobProgressServiceEF.cs b/RSecurityBackend/Services/Implementation/LongRunningJobProgressServiceEF.cs
index 745c39b1..ea27b285 100644
--- a/RSecurityBackend/Services/Implementation/LongRunningJobProgressServiceEF.cs
+++ b/RSecurityBackend/Services/Implementation/LongRunningJobProgressServiceEF.cs
@@ -54,7 +54,7 @@ namespace RSecurityBackend.Services.Implementation
{
try
{
- var jobs = await _context.LongRunningJobs.Where(j => (succeeded && j.Succeeded == true) || (failed && j.Exception != "")).OrderByDescending(j => j.StartTime).ToArrayAsync();
+ var jobs = await _context.LongRunningJobs.Where(j => (succeeded || (!succeeded && j.Succeeded == false)) && (failed || (!failed && j.Exception != ""))).OrderByDescending(j => j.StartTime).ToArrayAsync();
return new RServiceResult(jobs);
}