diff --git a/Builder/IISMainHandler/build.txt b/Builder/IISMainHandler/build.txt index 26102a7..2cc8905 100644 --- a/Builder/IISMainHandler/build.txt +++ b/Builder/IISMainHandler/build.txt @@ -1 +1 @@ -818 \ No newline at end of file +820 \ No newline at end of file diff --git a/Common/dataobjects/Account.cs b/Common/dataobjects/Account.cs index fe54d0b..97ac04b 100644 --- a/Common/dataobjects/Account.cs +++ b/Common/dataobjects/Account.cs @@ -74,22 +74,12 @@ namespace FLocal.Common.dataobjects { if(!name2id.ContainsKey(name)) { lock(name2id) { if(!name2id.ContainsKey(name)) { - List ids = Config.instance.mainConnection.LoadIdsByConditions( - TableSpec.instance, - new ComparisonCondition( + name2id[name] = int.Parse( + Config.instance.mainConnection.LoadIdByField( TableSpec.instance.getColumnSpec(TableSpec.FIELD_NAME), - ComparisonType.EQUAL, name - ), - Diapasone.unlimited + ) ); - if(ids.Count > 1) { - throw new CriticalException("not unique"); - } else if(ids.Count == 1) { - name2id[name] = int.Parse(ids[0]); - } else { - throw new NotFoundInDBException(); - } } } } @@ -101,22 +91,12 @@ namespace FLocal.Common.dataobjects { if(!userid2id.ContainsKey(user.id)) { lock(userid2id) { if(!userid2id.ContainsKey(user.id)) { - List ids = Config.instance.mainConnection.LoadIdsByConditions( - TableSpec.instance, - new ComparisonCondition( + userid2id[user.id] = int.Parse( + Config.instance.mainConnection.LoadIdByField( TableSpec.instance.getColumnSpec(TableSpec.FIELD_USERID), - ComparisonType.EQUAL, user.id.ToString() - ), - Diapasone.unlimited + ) ); - if(ids.Count > 1) { - throw new CriticalException("not unique"); - } else if(ids.Count == 1) { - userid2id[user.id] = int.Parse(ids[0]); - } else { - throw new NotFoundInDBException(); - } } } } diff --git a/Common/dataobjects/QuickLink.cs b/Common/dataobjects/QuickLink.cs index 9c40ee7..f218f76 100644 --- a/Common/dataobjects/QuickLink.cs +++ b/Common/dataobjects/QuickLink.cs @@ -45,22 +45,12 @@ namespace FLocal.Common.dataobjects { if(!name2id.ContainsKey(name)) { lock(name2id) { if(!name2id.ContainsKey(name)) { - List ids = Config.instance.mainConnection.LoadIdsByConditions( - TableSpec.instance, - new ComparisonCondition( + name2id[name] = int.Parse( + Config.instance.mainConnection.LoadIdByField( TableSpec.instance.getColumnSpec(TableSpec.FIELD_NAME), - ComparisonType.EQUAL, name - ), - Diapasone.unlimited + ) ); - if(ids.Count > 1) { - throw new CriticalException("not unique"); - } else if(ids.Count == 1) { - name2id[name] = int.Parse(ids[0]); - } else { - throw new NotFoundInDBException(); - } } } } diff --git a/Common/dataobjects/User.cs b/Common/dataobjects/User.cs index 294631b..124f58d 100644 --- a/Common/dataobjects/User.cs +++ b/Common/dataobjects/User.cs @@ -131,22 +131,12 @@ namespace FLocal.Common.dataobjects { if(!username2id.ContainsKey(name)) { lock(username2id) { if(!username2id.ContainsKey(name)) { - List ids = Config.instance.mainConnection.LoadIdsByConditions( - TableSpec.instance, - new ComparisonCondition( + username2id[name] = int.Parse( + Config.instance.mainConnection.LoadIdByField( TableSpec.instance.getColumnSpec(TableSpec.FIELD_NAME), - ComparisonType.EQUAL, name - ), - Diapasone.unlimited + ) ); - if(ids.Count > 1) { - throw new CriticalException("not unique"); - } else if(ids.Count == 1) { - username2id[name] = int.Parse(ids[0]); - } else { - throw new NotFoundInDBException(); - } } } } diff --git a/Core/DB/IDBConnection.cs b/Core/DB/IDBConnection.cs index 49c3ed7..529976f 100644 --- a/Core/DB/IDBConnection.cs +++ b/Core/DB/IDBConnection.cs @@ -2,15 +2,16 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using FLocal.Core.DB.conditions; namespace FLocal.Core.DB { public interface IDBConnection : IDisposable { List> LoadByIds(ITableSpec table, List ids); - List LoadIdsByConditions(ITableSpec table, conditions.AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts, bool allowHugeLists); + List LoadIdsByConditions(ITableSpec table, AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts, bool allowHugeLists); - long GetCountByConditions(ITableSpec table, conditions.AbstractCondition conditions, params JoinSpec[] joins); + long GetCountByConditions(ITableSpec table, AbstractCondition conditions, params JoinSpec[] joins); Transaction beginTransaction(System.Data.IsolationLevel iso); @@ -20,7 +21,7 @@ namespace FLocal.Core.DB { List> LoadByIds(Transaction transaction, ITableSpec table, List ids); - List LoadIdsByConditions(Transaction transaction, ITableSpec table, conditions.AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts, bool allowHugeLists); + List LoadIdsByConditions(Transaction transaction, ITableSpec table, AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts, bool allowHugeLists); void update(Transaction transaction, ITableSpec table, string id, Dictionary data); @@ -32,11 +33,11 @@ namespace FLocal.Core.DB { public static class IDBConnectionExtensions { - public static List LoadIdsByConditions(this IDBConnection connection, ITableSpec table, conditions.AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts) { + public static List LoadIdsByConditions(this IDBConnection connection, ITableSpec table, AbstractCondition conditions, Diapasone diapasone, JoinSpec[] joins, SortSpec[] sorts) { return connection.LoadIdsByConditions(table, conditions, diapasone, joins, sorts, false); } - public static List LoadIdsByConditions(this IDBConnection connection, ITableSpec table, conditions.AbstractCondition conditions, Diapasone diapasone, params JoinSpec[] joins) { + public static List LoadIdsByConditions(this IDBConnection connection, ITableSpec table, AbstractCondition conditions, Diapasone diapasone, params JoinSpec[] joins) { return connection.LoadIdsByConditions(table, conditions, diapasone, joins, new SortSpec[] { new SortSpec(table.getIdSpec(), true) }); } @@ -54,6 +55,25 @@ namespace FLocal.Core.DB { } return rows[0]; } + + public static string LoadIdByField(this IDBConnection connection, ColumnSpec column, string value) { + List ids = connection.LoadIdsByConditions( + column.table, + new ComparisonCondition( + column, + ComparisonType.EQUAL, + value + ), + Diapasone.unlimited + ); + if(ids.Count > 1) { + throw new CriticalException("not unique"); + } else if(ids.Count == 1) { + return ids[0]; + } else { + throw new NotFoundInDBException(column, value); + } + } } diff --git a/Core/exceptions/NotFoundInDBException.cs b/Core/exceptions/NotFoundInDBException.cs index e4d37c8..bcf161f 100644 --- a/Core/exceptions/NotFoundInDBException.cs +++ b/Core/exceptions/NotFoundInDBException.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using FLocal.Core.DB; namespace FLocal.Core { @@ -9,7 +10,9 @@ namespace FLocal.Core { public NotFoundInDBException() : base("Object not found in DB") { } - public NotFoundInDBException(DB.ITableSpec tableSpec, string id) : base("Object " + tableSpec.name + "[" + tableSpec.idName + "=" + id + "] not found in db") {} + public NotFoundInDBException(ColumnSpec columnSpec, string value) : base("Object " + columnSpec.table.name + "[" + columnSpec.name + "=" + value + "] not found in db") {} + + public NotFoundInDBException(ITableSpec tableSpec, string id) : this(tableSpec.getIdSpec(), id) {} }