public ResourceDataDistribution?GetResourceDataDistribution(int revision) { var viewName = GetResourceName(); using var db = new SqliteConnection($"Data Source={FilePath}"); db.Open(); using var t = db.BeginTransaction(); var tableInfoList = db.Query <SqliteTableInfo>(SqliteBuilder.GetTableInfo(), new { name = $"{viewName}%" }, t) .Where(x => !x.name.Contains("_Search")) .AsList() ?? throw new NullReferenceException(); foreach (var tableInfo in tableInfoList) { var revisionString = Regex.Split(tableInfo.name, "([0-9])+$", RegexOptions.IgnoreCase | RegexOptions.Compiled)[1]; if (!int.TryParse(revisionString, out var tableRevision) || tableRevision != revision) { continue; } var count = db.QuerySingle <long>($"SELECT COUNT(*) FROM \"{tableInfo.name}\"", transaction: t); var result = new ResourceDataDistribution { Partition = tableInfo.name, RowCount = count }; return(result); } return(default);
private void Visit(IDbConnection db, IDbTransaction t) { var viewName = GetResourceName(); var tableInfoList = db.Query <SqliteTableInfo>(SqliteBuilder.GetTableInfo(), new { name = $"{viewName}%" }, t) .Where(x => !x.name.Contains("_Search")) .AsList() ?? throw new NullReferenceException(); int revision; if (tableInfoList.Count == 0) { revision = 1; Visit(db, t, revision, tableInfoList); } else { var tableInfo = tableInfoList[0]; var revisionString = Regex.Split(tableInfo.name, "([0-9])+$", RegexOptions.IgnoreCase | RegexOptions.Compiled)[1]; if (!int.TryParse(revisionString, out revision)) { throw new FormatException(_localizer.GetString("invalid revision number")); } if (_revision <= revision) { return; } Visit(db, t, _revision, tableInfoList); } }