student 2 недель назад
Родитель
Сommit
30165bf728

+ 16 - 12
Kitty_Fall/Kitty_Fall/Database/DbLogic.cs

@@ -5,6 +5,8 @@ using System.Text;
 using System.Threading.Tasks;
 
 using System.Data;
+using System.Globalization;
+using System.Text.RegularExpressions;
 using Database.Database;
 using Microsoft.EntityFrameworkCore;
 
@@ -12,27 +14,29 @@ namespace Database;
 
 public class DbLogic
 {
-    public static async Task<int?> GenIdAsync(ModelContext dbContext, string sequence)
+    public static async Task<decimal?> GenIdAsync(ModelContext dbContext, string sequence)
     {
+        if (string.IsNullOrWhiteSpace(sequence)
+            || !Regex.IsMatch(sequence, "^[A-Za-z][A-Za-z0-9_]*$"))
+        {
+            throw new ArgumentException("Invalid Oracle sequence name.", nameof(sequence));
+        }
+
         var conn = dbContext.Database.GetDbConnection();
         if (conn.State == ConnectionState.Closed)
         {
             await conn.OpenAsync();
         }
-        var command = conn.CreateCommand();
-        string query = "select " + sequence + ".nextval from dual";
-        command.CommandText = query;
-        var reader = await command.ExecuteReaderAsync();
-        while (await reader.ReadAsync())
-        {
-            var title = reader.GetString(0);
 
-            //await conn.CloseAsync();
-            return int.Parse(title);
+        await using var command = conn.CreateCommand();
+        command.CommandText = $"SELECT {sequence}.NEXTVAL FROM DUAL";
+        await using var reader = await command.ExecuteReaderAsync();
+        if (await reader.ReadAsync())
+        {
+            return Convert.ToDecimal(reader.GetValue(0), CultureInfo.InvariantCulture);
         }
 
-        //await conn.CloseAsync();
-        return 0;
+        return null;
     }
 }
 

+ 7 - 2
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/Business/Game/GameBusinessImpl.cs

@@ -987,8 +987,13 @@ namespace Kitty_Fall.Apis.Business.Game
                 _ => ""
             };
 
-            if (string.IsNullOrWhiteSpace(sequence)) return DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-            return await DbLogic.GenIdAsync(dbContext, sequence) ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+            if (string.IsNullOrWhiteSpace(sequence))
+            {
+                throw new InvalidOperationException($"Sequence is not configured for ID type '{type}'.");
+            }
+
+            return await DbLogic.GenIdAsync(dbContext, sequence)
+                ?? throw new InvalidOperationException($"Oracle sequence '{sequence}' did not return an ID.");
         }
 
         private static byte? NormalizeRequestedLevel(int level)

+ 2 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Cms/Controllers/MonthlyWinnerController.cs

@@ -279,7 +279,8 @@ public class MonthlyWinnerController : CmsAuthorizedController
 
     private async Task<decimal> NextDecimalIdAsync(string sequence)
     {
-        return await Database.DbLogic.GenIdAsync(_db, sequence) ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+        return await Database.DbLogic.GenIdAsync(_db, sequence)
+            ?? throw new InvalidOperationException($"Oracle sequence '{sequence}' did not return an ID.");
     }
 
     private static int NormalizeMonthKey(int? monthKey)

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Services/GameMonthlyWinnerWorker.cs

@@ -394,7 +394,7 @@ namespace Kitty_Fall.Woker.Services
         private static async Task<decimal> NextDecimalIdAsync(ModelContext dbContext, string sequence)
         {
             return await Database.DbLogic.GenIdAsync(dbContext, sequence)
-                ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                ?? throw new InvalidOperationException($"Oracle sequence '{sequence}' did not return an ID.");
         }
 
         private int GetInt(string key, int defaultValue)

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Woker/Services/GameRewardPayoutWorker.cs

@@ -396,7 +396,7 @@ namespace Kitty_Fall.Woker.Services
         private static async Task<decimal> NextDecimalIdAsync(ModelContext dbContext, string sequence)
         {
             return await Database.DbLogic.GenIdAsync(dbContext, sequence)
-                ?? DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
+                ?? throw new InvalidOperationException($"Oracle sequence '{sequence}' did not return an ID.");
         }
 
         private int GetInt(string key, int defaultValue)