//------------------------------------------------------------------------------
// <copyright file="CSSqlAggregate.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = 8000,
    IsInvariantToDuplicates = false, IsInvariantToNulls = false,
    IsInvariantToOrder = false, IsNullIfEmpty = false)]
public class concat : Microsoft.SqlServer.Server.IBinarySerialize
{
    // Trennzeichen
    private const char seperator = '.';
    // Puffer
    private string buffer;

    public void Init()
    {
        // Puffer leeren
        buffer = string.Empty;
    }

    public void Accumulate(SqlString Value)
    {
        // Nächste Zeichenkette anhängen, ggf. ein Trennzeichen einfügen
        if (!string.IsNullOrEmpty(buffer))
            buffer += seperator + Value.Value;
        else
            buffer = Value.Value;
    }

    public void Merge(concat Group)
    {
        // Den Puffer um den Inhalt des anderen Zwischenergebnisses erweitern
        buffer += seperator + Group.buffer;
    }

    public SqlString Terminate()
    {
        // Rückgabe als SqlString erzeugen
        return new SqlString(buffer);
    }

    #region IBinarySerialize Mitglieder

    public void Read(System.IO.BinaryReader r)
    {
        // Inhalt des Puffers aus dem Stream lesen
        buffer = r.ReadString();
    }

    public void Write(System.IO.BinaryWriter w)
    {
        // Inhalt des Puffers in den Stream schreiben
        w.Write(buffer);
    }

    #endregion
}