public static IQuery GetGetRevisionQuery(IRevisionKey revisionKey) { ArgumentUtility.CheckNotNull("revisionKey", revisionKey); var storageProviderDefinition = GetStorageProviderDefinition(); var sqlDialect = storageProviderDefinition.Factory.CreateSqlDialect(storageProviderDefinition); var parameters = new QueryParameterCollection(); var statement = new StringBuilder(); statement.Append("SELECT "); statement.Append(GetRevisionValueColumnIdentifier(sqlDialect)); statement.Append(" FROM "); statement.Append(GetRevisionTableIdentifier(sqlDialect)); statement.Append(" WHERE ("); AppendKeyClause(statement, parameters, revisionKey, sqlDialect); statement.Append(")"); statement.Append(sqlDialect.StatementDelimiter); return(QueryFactory.CreateQuery( new QueryDefinition( typeof(Revision) + "." + MethodBase.GetCurrentMethod().Name, storageProviderDefinition, statement.ToString(), QueryType.Scalar), parameters)); }
private void IncrementRevision(IDbConnection connection, IDbTransaction transaction, IRevisionKey revisionKey) { var query = Revision.GetIncrementRevisionQuery(revisionKey); Assertion.IsTrue(query.QueryType == QueryType.Scalar); using (var command = CreateCommandFromQuery(connection, transaction, query)) { command.ExecuteNonQuery(); } }
public static IQuery GetIncrementRevisionQuery(IRevisionKey revisionKey) { ArgumentUtility.CheckNotNull("revisionKey", revisionKey); var storageProviderDefinition = GetStorageProviderDefinition(); var sqlDialect = storageProviderDefinition.Factory.CreateSqlDialect(storageProviderDefinition); const string incrementrevision = "IncrementRevision"; string revisionTable = GetRevisionTableIdentifier(sqlDialect); string revisionValueColumn = GetRevisionValueColumnIdentifier(sqlDialect); string revisionValueParameter = sqlDialect.GetParameterName("value"); string revisionGlobalKeyParameter = sqlDialect.GetParameterName("globalKey"); string revisionLocalKeyParameter = sqlDialect.GetParameterName("localKey"); var parameters = new QueryParameterCollection(); var statement = new StringBuilder(); statement.Append("BEGIN TRANSACTION " + incrementrevision); statement.Append(sqlDialect.StatementDelimiter); statement.AppendLine(); statement.Append("IF EXISTS (SELECT 0 FROM "); statement.Append(revisionTable); statement.Append(" WHERE ("); AppendKeyClause(statement, parameters, revisionKey, sqlDialect); statement.Append(")"); statement.Append(")"); statement.AppendLine(); statement.Append("UPDATE "); statement.Append(revisionTable); statement.Append(" SET "); statement.Append(revisionValueColumn); statement.Append(" = "); statement.Append(revisionValueParameter); statement.Append(" WHERE ("); AppendKeyClause(statement, parameters, revisionKey, sqlDialect); statement.Append(")"); statement.AppendLine(); statement.Append("ELSE"); statement.AppendLine(); statement.Append("INSERT INTO "); statement.Append(revisionTable); statement.Append("("); statement.Append(GetRevisionGlobalKeyColumnIdentifier(sqlDialect)); statement.Append(","); statement.Append(GetRevisionLocalKeyColumnIdentifier(sqlDialect)); statement.Append(","); statement.Append(revisionValueColumn); statement.Append(") VALUES ("); statement.Append(parameters[revisionGlobalKeyParameter].Name); statement.Append(","); statement.Append(parameters[revisionLocalKeyParameter].Name); statement.Append(","); statement.Append(revisionValueParameter); statement.Append(")"); statement.Append(sqlDialect.StatementDelimiter); statement.AppendLine(); statement.Append("COMMIT TRANSACTION " + incrementrevision); statement.Append(sqlDialect.StatementDelimiter); statement.AppendLine(); parameters.Add(revisionValueParameter, Guid.NewGuid()); return(QueryFactory.CreateQuery( new QueryDefinition( typeof(Revision) + "." + MethodBase.GetCurrentMethod().Name, storageProviderDefinition, statement.ToString(), QueryType.Scalar), parameters)); }
private static void AppendKeyClause(StringBuilder statement, QueryParameterCollection parameters, IRevisionKey key, ISqlDialect sqlDialect) { string revisionGlobalKeyColumn = GetRevisionGlobalKeyColumnIdentifier(sqlDialect); string revisionLocalKeyColumn = GetRevisionLocalKeyColumnIdentifier(sqlDialect); string revisionGlobalKeyParameter = sqlDialect.GetParameterName("globalKey"); string revisionLocalKeyParameter = sqlDialect.GetParameterName("localKey"); statement.Append(revisionGlobalKeyColumn); statement.Append(" = "); statement.Append(revisionGlobalKeyParameter); if (!parameters.Contains(revisionGlobalKeyParameter)) { parameters.Add(new QueryParameter(revisionGlobalKeyParameter, key.GlobalKey)); } statement.Append(" AND "); statement.Append(revisionLocalKeyColumn); if (string.IsNullOrEmpty(key.LocalKey)) { statement.Append(" IS NULL"); if (!parameters.Contains(revisionLocalKeyParameter)) { parameters.Add(new QueryParameter(revisionLocalKeyParameter, null)); } } else { statement.Append(" = "); statement.Append(revisionLocalKeyParameter); if (!parameters.Contains(revisionLocalKeyParameter)) { parameters.Add(new QueryParameter(revisionLocalKeyParameter, key.LocalKey)); } } }