com.backnd.database
Advanced tools
@@ -253,3 +253,3 @@ using System; | ||
| /// <summary> | ||
| /// SetClause 목록 기반 UPDATE 쿼리 생성 (Inc/Dec용) | ||
| /// SetClause 목록 기반 UPDATE 쿼리 생성 (Set/Inc/Dec용) | ||
| /// </summary> | ||
@@ -262,4 +262,10 @@ public static string BuildUpdateQueryFromSetClauses(string tableName, List<SetClause> setClauses, string whereClause) | ||
| var setStatements = setClauses.Select(clause => | ||
| $"{clause.ColumnName} = {clause.ColumnName} {clause.Operator} {ValueFormatter.FormatValueForQuery(clause.Value)}" | ||
| ); | ||
| { | ||
| var formattedValue = ValueFormatter.FormatValueForQuery(clause.Value); | ||
| // Operator가 null이면 직접 값 설정 (Set), 아니면 산술 연산 (Inc/Dec) | ||
| if (string.IsNullOrEmpty(clause.Operator)) | ||
| return $"{clause.ColumnName} = {formattedValue}"; | ||
| else | ||
| return $"{clause.ColumnName} = {clause.ColumnName} {clause.Operator} {formattedValue}"; | ||
| }); | ||
@@ -266,0 +272,0 @@ return $"UPDATE {tableName} SET {string.Join(", ", setStatements)} WHERE {whereClause}"; |
@@ -15,7 +15,7 @@ using System; | ||
| { | ||
| //private static readonly string SERVER_URL = "http://localhost:10002"; | ||
| private static readonly string SERVER_URL = "http://localhost:10002"; | ||
| //private static readonly string SERVER_URL = "https://api.alpha.thebackend.io"; | ||
| //private static readonly string SERVER_URL = "https://api.beta.thebackend.io"; | ||
| private static readonly string SERVER_URL = "https://api.thebackend.io"; | ||
| //private static readonly string SERVER_URL = "https://api.thebackend.io"; | ||
| private static readonly string ENDPOINT = "/v1/database/store"; | ||
@@ -22,0 +22,0 @@ private static readonly int MAX_RETRIES = 3; |
+1
-1
| { | ||
| "name": "com.backnd.database", | ||
| "version": "0.0.7", | ||
| "version": "0.0.8", | ||
| "displayName": "BACKND Database", | ||
@@ -5,0 +5,0 @@ "description": "BACKND Database is a Unity SDK for seamless integration with BACKND cloud database services.\n\nEasily manage and synchronize game data such as player profiles, game states, and leaderboards across multiple platforms.\nIdeal for Unity developers looking to implement robust database solutions without complex backend setups.", |
+24
-5
@@ -245,2 +245,15 @@ using System; | ||
| public QueryBuilder<T> Set<TField>(Expression<Func<T, TField>> selector, TField value) | ||
| { | ||
| var columnName = GetColumnNameFromExpression(selector); | ||
| ValidateNoDuplicateSetClause(columnName); | ||
| setClauses.Add(new SetClause | ||
| { | ||
| ColumnName = columnName, | ||
| Operator = null, | ||
| Value = value | ||
| }); | ||
| return this; | ||
| } | ||
| private void ValidateNoDuplicateSetClause(string columnName) | ||
@@ -252,9 +265,9 @@ { | ||
| public async BTask<MutationResult> Exec() | ||
| public async BTask<MutationResult> Update() | ||
| { | ||
| if (setClauses.Count == 0) | ||
| throw new InvalidOperationException("No modifications specified. Use Inc() or Dec() before Exec()"); | ||
| throw new InvalidOperationException("No modifications specified. Use Set(), Inc() or Dec() before Update()"); | ||
| if (whereConditions.Count == 0) | ||
| throw new InvalidOperationException("Exec requires a Where() condition"); | ||
| throw new InvalidOperationException("Update requires a Where() condition"); | ||
@@ -281,4 +294,10 @@ var whereClause = BuildWhereClause(); | ||
| var setStatements = setClauses.Select(clause => | ||
| $"{clause.ColumnName} = {clause.ColumnName} {clause.Operator} {FormatValueForQuery(clause.Value)}" | ||
| ); | ||
| { | ||
| var formattedValue = FormatValueForQuery(clause.Value); | ||
| // Operator가 null이면 직접 값 설정 (Set), 아니면 산술 연산 (Inc/Dec) | ||
| if (string.IsNullOrEmpty(clause.Operator)) | ||
| return $"{clause.ColumnName} = {formattedValue}"; | ||
| else | ||
| return $"{clause.ColumnName} = {clause.ColumnName} {clause.Operator} {formattedValue}"; | ||
| }); | ||
@@ -285,0 +304,0 @@ return $"UPDATE {modelInstance.GetTableName()} SET {string.Join(", ", setStatements)} WHERE {whereClause}"; |
@@ -40,3 +40,3 @@ using System; | ||
| if (whereConditions.Count == 0) | ||
| throw new InvalidOperationException("Inc/Dec requires a WHERE clause"); | ||
| throw new InvalidOperationException("Set/Inc/Dec requires a WHERE clause"); | ||
@@ -112,2 +112,18 @@ var whereClause = SqlBuilder.BuildWhereClause( | ||
| /// <summary> | ||
| /// 필드 값 직접 설정 | ||
| /// </summary> | ||
| public TransactionQueryBuilder<T> Set<TField>(Expression<Func<T, TField>> selector, TField value) | ||
| { | ||
| var columnName = expressionAnalyzer.GetColumnNameFromKeySelector(selector); | ||
| ValidateNoDuplicateSetClause(columnName); | ||
| setClauses.Add(new SetClause | ||
| { | ||
| ColumnName = columnName, | ||
| Operator = null, | ||
| Value = value | ||
| }); | ||
| return this; | ||
| } | ||
| private void ValidateNoDuplicateSetClause(string columnName) | ||
@@ -167,2 +183,30 @@ { | ||
| /// <summary> | ||
| /// Set/Inc/Dec로 지정한 필드만 UPDATE 작업 추가 | ||
| /// </summary> | ||
| public TransactionBuilder Update() | ||
| { | ||
| if (setClauses.Count == 0) | ||
| throw new InvalidOperationException("No modifications specified. Use Set(), Inc() or Dec() before Update()"); | ||
| if (whereConditions.Count == 0) | ||
| throw new InvalidOperationException("Update requires a WHERE clause"); | ||
| var whereClause = SqlBuilder.BuildWhereClause( | ||
| whereConditions, | ||
| isOfCurrentUser, | ||
| modelInstance.GetTableType()); | ||
| var sql = SqlBuilder.BuildUpdateQueryFromSetClauses( | ||
| modelInstance.GetTableName(), | ||
| setClauses, | ||
| whereClause); | ||
| transaction.AddStatement(sql); | ||
| setClauses.Clear(); | ||
| // 활성 QueryBuilder 해제 | ||
| transaction.activeQueryBuilder = null; | ||
| return transaction; | ||
| } | ||
| /// <summary> | ||
| /// DELETE 작업 추가 | ||
@@ -169,0 +213,0 @@ /// </summary> |
1098607
0.25%