Click here to Skip to main content
15,886,199 members
Articles / Desktop Programming / WPF

DBTool for Oracle - Part 1

Rate me:
Please Sign up or sign in to vote.
4.92/5 (45 votes)
13 Apr 2014CPOL18 min read 136.2K   5.1K   88  
Enhance productivity and reliability, write your own tools.
using System;
using System.Collections.Generic;
using System.Text;
using Harlinn.DBTool.CodeGenerators.Utils;
using Harlinn.DBTool.Projects;

namespace Harlinn.DBTool.CodeGenerators.Client
{
    public class ClientGenerator : GeneratorBase
    {
        private Project project;
        private string className = "DataClient";
        SortedSet<string> methodNames = new SortedSet<string>();


        public ClientGenerator(Project project)
        {
            this.project = project;    
        }

        public override string GetFilename()
        {
            
            string directory = GetDirectory();

            string result = directory + "\\" + className + ".cs";
            return result;
        }

        public override string GetDirectory()
        {
            string namespace_ = project.ClientNamespace;
            string directory = project.NamespaceToDirectory(namespace_);
            return directory;
        }

        public void Generate()
        {
            string commonNamespace = project.CommonNamespace;
            string dataNamespace = project.DataNamespace;
            string implementationNamespace = project.ServiceImplementationNamespace;
            string clientNamespace = project.ClientNamespace;

            WriteLine("using System;");
            WriteLine("using System.Text;");
            WriteLine("using System.ComponentModel;");
            WriteLine("using System.Collections.Generic;");
            WriteLine("using System.ServiceModel;");
            WriteLine("using System.Reflection;");
            WriteLine();
            WriteLine("using " + commonNamespace + ";");
            WriteLine("using " + implementationNamespace + ";");
            WriteLine("using " + dataNamespace + ";");
            WriteLine("using " + dataNamespace + ".Operations;");
            WriteLine("using "+clientNamespace+";");
            WriteLine();

            WriteLine("namespace " + clientNamespace);
            WriteLine("{");
            WriteLine();
            WriteLine();
            WriteLine("    public partial class " + className + " : IDataContextProvider");
            WriteLine("    {");

            WriteLine("        private static readonly log4net.ILog sfLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);");
            WriteLine();
            WriteLine("        private static void LogException(Exception exc, MethodBase method)");
            WriteLine("        {");
            WriteLine("            Logger.LogException(sfLog, exc, method);");
            WriteLine("        }");
            WriteLine();
            WriteLine("        static void Entering( MethodBase method )");
            WriteLine("        {");
            WriteLine("            Logger.Entering(sfLog, method);");
            WriteLine("        }");
            WriteLine();
            WriteLine("        static void Leaving( MethodBase method )");
            WriteLine("        {");
            WriteLine("            Logger.Leaving(sfLog, method);");
            WriteLine("        }");
            WriteLine();
            WriteLine("        private void LogDebug(string message)");
            WriteLine("        {");
            WriteLine("            sfLog.Debug(message);");
            WriteLine("        }");
            WriteLine();
            WriteLine("        private void LogMessage(string message)");
            WriteLine("        {");
            WriteLine("            sfLog.Info(message);");
            WriteLine("        }");
            WriteLine();
            WriteLine("        private void LogError(string message)");
            WriteLine("        {");
            WriteLine("            sfLog.Error(message);");
            WriteLine("        }");
            WriteLine();
            WriteLine("        private static readonly string ENDPOINT_CONFIGURATION_NAME = \"DataService\";");
            WriteLine();
            CreateEvents();
            WriteLine();

            WriteLine("        private static object commonSynchObject = new object();");
            WriteLine("        private static DataClient instance;");
            WriteLine();
            WriteLine("        public static DataClient Instance");
            WriteLine("        {");
            WriteLine("            get");
            WriteLine("            {");
            WriteLine("                if (instance == null)");
            WriteLine("                {");
            WriteLine("                    lock (commonSynchObject)");
            WriteLine("                    {");
            WriteLine("                        if (instance == null)");
            WriteLine("                        {");
            WriteLine("                            instance = new DataClient();");
            WriteLine("                        }");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                return instance;");
            WriteLine("            }");
            WriteLine("        }");

            WriteLine("        DateTime faultTime;");
            WriteLine("        DataServiceClient dataServiceClient;");

            WriteLine("        private void CreateDataServiceClient()");
            WriteLine("        {");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                InstanceContext instanceContext = new InstanceContext(this);");

            WriteLine("                dataServiceClient = new DataServiceClient(ENDPOINT_CONFIGURATION_NAME);");

            WriteLine("                dataServiceClient.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;");

            WriteLine("                dataServiceClient.InnerChannel.Faulted += InnerChannel_Faulted;");
            WriteLine("                dataServiceClient.InnerChannel.Closing += InnerChannel_Closing;");

            WriteLine("            }");
            WriteLine("            catch (Exception exc)");
            WriteLine("            {");
            WriteLine("                LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("                throw;");
            WriteLine("            }");
            WriteLine("        }");

            WriteLine("        private void InnerChannel_Closing(object sender, EventArgs e)");
            WriteLine("        {");
            WriteLine("            LogMessage(\"Server channel closed.\");");
            WriteLine("            if (dataServiceClient != null)");
            WriteLine("            {");
            WriteLine("                dataServiceClient.InnerChannel.Faulted -= InnerChannel_Faulted;");
            WriteLine("                dataServiceClient.InnerChannel.Closing -= InnerChannel_Closing;");

            WriteLine("                dataServiceClient = null;");
            WriteLine("                OnChannelClosed( );");
            WriteLine("            }");
            WriteLine("        }");

            WriteLine("        private void InnerChannel_Faulted(object sender, EventArgs e)");
            WriteLine("        {");
            WriteLine("            LogError(\"Server channel faulted.\");");
            WriteLine("            faultTime = DateTime.Now;");

            WriteLine("            if (dataServiceClient != null)");
            WriteLine("            {");
            WriteLine("                dataServiceClient.InnerChannel.Faulted -= InnerChannel_Faulted;");
            WriteLine("                dataServiceClient.InnerChannel.Closing -= InnerChannel_Closing;");

            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    dataServiceClient.Abort();");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("                }");

            WriteLine("                dataServiceClient = null;");
            WriteLine("                OnChannelFaulted( );");
            WriteLine("            }");
            WriteLine("        }");

            WriteLine("        private void CloseConnection()");
            WriteLine("        {");
            WriteLine("            if (dataServiceClient != null)");
            WriteLine("            {");
            WriteLine("                dataServiceClient.InnerChannel.Faulted -= InnerChannel_Faulted;");
            WriteLine("                dataServiceClient.InnerChannel.Closing -= InnerChannel_Closing;");

            WriteLine("                dataServiceClient.Close();");

            WriteLine("                dataServiceClient = null;");
            WriteLine("                OnChannelClosed( );");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            WriteLine("        private bool isDisconnected;");
            WriteLine("        private Guid clientId;");
            WriteLine("        private object synchObject = new object();");
            WriteLine("        private DateTime serverCallStarted = DateTime.MinValue;");
            WriteLine("        private DateTime serverCallCompleted = DateTime.MinValue;");
            WriteLine();
            WriteLine();
            WriteLine("        public bool Connect()");
            WriteLine("        {");
            WriteLine("            bool result = false;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    bool connected = false;");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        isDisconnected = false;");
            WriteLine("                        if (dataServiceClient == null)");
            WriteLine("                        {");
            WriteLine("                            CreateDataServiceClient();");
            WriteLine();
            WriteLine("                            serverCallStarted = DateTime.UtcNow;");
            WriteLine("                            try");
            WriteLine("                            {");
            WriteLine("                                clientId = dataServiceClient.Connect( );");
            WriteLine("                            }");
            WriteLine("                            finally");
            WriteLine("                            {");
            WriteLine("                                serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                            }");
            WriteLine("#if DEBUG");
            WriteLine("                            TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                            LogDebug(string.Format(\"Executed Connect in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine();
            WriteLine("                            result = true;");
            WriteLine("                            connected = true;");
            WriteLine("                        }");
            WriteLine("                        else");
            WriteLine("                        {");
            WriteLine("                            result = true;");
            WriteLine("                        }");
            WriteLine("                    }");
            WriteLine("                    if( connected )");
            WriteLine("                    {");
            WriteLine("                        LogMessage(\"Connected to Server\");");
            WriteLine("                        OnConnected( );");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod);");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            WriteLine("        public void Disconnect()");
            WriteLine("        {");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    bool disconnected = false;");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        isDisconnected = true;");
            WriteLine("                        if (dataServiceClient != null)");
            WriteLine("                        {");
            WriteLine("                            serverCallStarted = DateTime.UtcNow;");
            WriteLine("                            try");
            WriteLine("                            {");
            WriteLine("                                dataServiceClient.Disconnect( );");
            WriteLine("                            }");
            WriteLine("                            finally");
            WriteLine("                            {");
            WriteLine("                                serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                            }");
            WriteLine("#if DEBUG");
            WriteLine("                            TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                            LogDebug(string.Format(\"Executed Disconnect in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                            CloseConnection();");
            WriteLine("                            disconnected = true;");
            WriteLine("                        }");
            WriteLine("                    }");
            WriteLine("                    if( disconnected )");
            WriteLine("                    {");
            WriteLine("                        LogMessage(\"Disconnected\");");
            WriteLine("                        OnDisconnected( );");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod);");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine("        private void EnsureConnected( )");
            WriteLine("        {");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                if (isDisconnected == true)");
            WriteLine("                {");
            WriteLine("                    throw new Exception(\"Client is disconnected.\");");
            WriteLine("                }");
            WriteLine("                if (dataServiceClient == null)");
            WriteLine("                {");
            WriteLine("                    Connect();");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            catch (Exception exc)");
            WriteLine("            {");
            WriteLine("                LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("                throw;");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            WriteLine("        public event EventHandler OnConnectedEvent;");
            WriteLine("        public event EventHandler OnDisconnectedEvent;");
            WriteLine("        public event EventHandler OnChannelFaultedEvent;");
            WriteLine("        public event EventHandler OnChannelClosedEvent;");
            WriteLine();
            WriteLine();

            WriteLine("        protected virtual void OnConnected()");
            WriteLine("        {");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                if (OnConnectedEvent != null)");
            WriteLine("                {");
            WriteLine("                    EventArgs eventArgs = new EventArgs();");
            WriteLine("                    OnConnectedEvent(this, eventArgs);");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            catch (Exception exc)");
            WriteLine("            {");
            WriteLine("                LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            WriteLine("        protected virtual void OnDisconnected()");
            WriteLine("        {");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                if (OnDisconnectedEvent != null)");
            WriteLine("                {");
            WriteLine("                    EventArgs eventArgs = new EventArgs();");
            WriteLine("                    OnDisconnectedEvent(this, eventArgs);");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            catch (Exception exc)");
            WriteLine("            {");
            WriteLine("                LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            WriteLine("        protected virtual void OnChannelFaulted()");
            WriteLine("        {");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                if (OnChannelFaultedEvent != null)");
            WriteLine("                {");
            WriteLine("                    EventArgs eventArgs = new EventArgs();");
            WriteLine("                    OnChannelFaultedEvent(this, eventArgs);");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            catch (Exception exc)");
            WriteLine("            {");
            WriteLine("                LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            WriteLine("        protected virtual void OnChannelClosed()");
            WriteLine("        {");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                if (OnChannelClosedEvent != null)");
            WriteLine("                {");
            WriteLine("                    EventArgs eventArgs = new EventArgs();");
            WriteLine("                    OnChannelClosedEvent(this, eventArgs);");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            catch (Exception exc)");
            WriteLine("            {");
            WriteLine("                LogException(exc, System.Reflection.MethodBase.GetCurrentMethod());");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine("        public Guid ClientId");
            WriteLine("        {");
            WriteLine("            get");
            WriteLine("            {");
            WriteLine("                return clientId;");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            ProcessNotofications( );
            WriteLine();
            WriteLine();
            Process( );
            WriteLine();
            WriteLine();
            WriteLine("    }");
            WriteLine();
            WriteLine();
            WriteLine("}");
        }


        private void CreateEvents()
        {
            WriteLine();
            CreateEvents(project.GetProjectTables());
        }



        private void CreateEvents(ProjectTables projectTables)
        {
            foreach (ProjectTable projectTable in projectTables.Children)
            {
                CreateEvents(projectTable);
            }
        }


        private void CreateEvents(ProjectTable projectTable)
        {
            string baseName = projectTable.BaseName;
            WriteLine("        public event On" + baseName + "InsertedDelegate On" + baseName + "InsertedEvent;");
            WriteLine("        public event On" + baseName + "ChangedDelegate On" + baseName + "ChangedEvent;");
            WriteLine("        public event On" + baseName + "DeletedDelegate On" + baseName + "DeletedEvent;");
            WriteLine();
        }


        private void ProcessNotofications()
        {
            ProjectTables projectTables = project.GetProjectTables();
            

            WriteLine("        public void HandleNotification( OperationNotification operationNotification )");
            WriteLine("        {");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    if ( operationNotification == null )");
            WriteLine("                    {");
            WriteLine("                        throw new ArgumentNullException(\"operationNotification\");");
            WriteLine("                    }");
            WriteLine("                    ServiceOperation serviceOperation = operationNotification.ServiceOperation;");
            WriteLine("                    switch (serviceOperation)");
            WriteLine("                    {");
            foreach (ProjectTable projectTable in projectTables.Children)
            {
                string baseName = projectTable.BaseName;
                WriteLine("                        case ServiceOperation.Insert" + baseName + ":");
                WriteLine("                            HandleInsert" + baseName + "Notification((Insert" + baseName + "Notification)operationNotification);");
                WriteLine("                            break;");
                WriteLine("                        case ServiceOperation.Update" + baseName + ":");
                WriteLine("                            HandleUpdate" + baseName + "Notification((Update" + baseName + "Notification)operationNotification);");
                WriteLine("                            break;");
                WriteLine("                        case ServiceOperation.Delete" + baseName + ":");
                WriteLine("                            HandleDelete" + baseName + "Notification((Delete" + baseName + "Notification)operationNotification);");
                WriteLine("                            break;");
            }
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod);");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
            WriteLine();
            foreach (ProjectTable projectTable in projectTables.Children)
            {
                ProcessNotofications(projectTable);
            }
            WriteLine();
            WriteLine();
        }


        private void ProcessNotofications(ProjectTable projectTable)
        {
            ProcessInsertNotofication(projectTable);
            ProcessUpdateNotofication(projectTable);
            ProcessDeleteNotofication(projectTable);
        }


        private void ProcessInsertNotofication(ProjectTable projectTable)
        {
            string baseName = projectTable.BaseName;
            string dataClassName = projectTable.DataClassName;
            List<ProjectTabularField> fields = projectTable.GetFieldList();

            WriteLine("        public void HandleInsert" + baseName + "Notification( Insert" + baseName + "Notification operationNotification )");
            WriteLine("        {");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    if ( operationNotification == null )");
            WriteLine("                    {");
            WriteLine("                        throw new ArgumentNullException(\"operationNotification\");");
            WriteLine("                    }");
            WriteLine("                    if (On" + baseName + "InsertedEvent != null)");
            WriteLine("                    {");
            
            if (projectTable.IsTagTable)
            {
                string arguments = ColumnHelper.GetCommaSeparatedPropertyNameList("operationNotification",fields);
                WriteLine("                        TagElementData elementData = TagElementData.Create(" + arguments + ");");
            }
            else
            {
                WriteLine("                        " + dataClassName + " elementData = new " + dataClassName + "();");
                WriteLine();
                if (projectTable.IsTagValue)
                {
                    WriteLine("                        elementData.Tag = operationNotification.Tag;");
                }
                ProjectTabularField concurrencyField = projectTable.GetConcurrencyField();
                if (concurrencyField != null)
                {
                    WriteLine("                        elementData." + projectTable.ElementStatePropertyName + " = operationNotification." + projectTable.ElementStatePropertyName + ";");
                }
                for (int i = 0; i < fields.Count; i++)
                {
                    ProjectTabularField field = fields[i];

                    WriteLine("                        elementData." + field.PropertyName + " = operationNotification." + field.PropertyName + ";");
                }
            }
            WriteLine();
            WriteLine("                        On" + baseName + "InsertedEventArgs eventArgs = new On" + baseName + "InsertedEventArgs(operationNotification.ClientId, elementData);");
            WriteLine("                        On" + baseName + "InsertedEvent( this, eventArgs );");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod);");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
        }

        private void ProcessUpdateNotofication(ProjectTable projectTable)
        {
            string baseName = projectTable.BaseName;
            string dataClassName = projectTable.DataClassName;
            List<ProjectTabularField> fields = projectTable.GetFieldList();

            
            WriteLine("        public void HandleUpdate" + baseName + "Notification( Update" + baseName + "Notification operationNotification )");
            WriteLine("        {");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    if ( operationNotification == null )");
            WriteLine("                    {");
            WriteLine("                        throw new ArgumentNullException(\"operationNotification\");");
            WriteLine("                    }");
            WriteLine("                    if (On" + baseName + "ChangedEvent != null)");
            WriteLine("                    {");

            if (projectTable.IsTagTable)
            {
                string arguments = ColumnHelper.GetCommaSeparatedPropertyNameList("operationNotification", fields);
                WriteLine("                        TagElementData elementData = TagElementData.Create(" + arguments + ");");
            }
            else
            {
                WriteLine("                        " + dataClassName + " elementData = new " + dataClassName + "();");
                WriteLine();
                if (projectTable.IsTagValue)
                {
                    WriteLine("                        elementData.Tag = operationNotification.Tag;");
                }
                ProjectTabularField concurrencyField = projectTable.GetConcurrencyField();
                if (concurrencyField != null)
                {
                    WriteLine("                        elementData." + projectTable.ElementStatePropertyName + " = operationNotification." + projectTable.ElementStatePropertyName + ";");
                }
                for (int i = 0; i < fields.Count; i++)
                {
                    ProjectTabularField field = fields[i];

                    WriteLine("                        elementData." + field.PropertyName + " = operationNotification." + field.PropertyName + ";");
                }
            }
            WriteLine();
            WriteLine("                        On" + baseName + "ChangedEventArgs eventArgs = new On" + baseName + "ChangedEventArgs(operationNotification.ClientId, elementData);");
            WriteLine("                        On" + baseName + "ChangedEvent( this, eventArgs );");
            WriteLine("                    }");

            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod);");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
        }

        private void ProcessDeleteNotofication(ProjectTable projectTable)
        {
            string baseName = projectTable.BaseName;
            WriteLine("        public void HandleDelete" + baseName + "Notification( Delete" + baseName + "Notification operationNotification )");
            WriteLine("        {");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");

            WriteLine("                    if ( operationNotification == null )");
            WriteLine("                    {");
            WriteLine("                        throw new ArgumentNullException(\"operationNotification\");");
            WriteLine("                    }");

            WriteLine("                    if (On" + baseName + "DeletedEvent != null)");
            WriteLine("                    {");
            if (projectTable.IsTagValue)
            {
                WriteLine("                        On" + baseName + "DeletedEventArgs eventArgs = new On" + baseName + "DeletedEventArgs(operationNotification.ClientId, operationNotification.Tag, operationNotification.TimeStamp);");
            }
            else
            {
                WriteLine("                        On" + baseName + "DeletedEventArgs eventArgs = new On" + baseName + "DeletedEventArgs(operationNotification.ClientId, operationNotification.Id);");
            }
            WriteLine("                        On" + baseName + "DeletedEvent(this, eventArgs);");
            WriteLine("                    }");

            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod);");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
        }




        private void Process()
        {
            WriteLine();
            Process(project.GetProjectTables());
            WriteLine();
            WriteLine("        public Interval GetTagValueInterval( long tag )");
            WriteLine("        {");
            WriteLine("            Interval result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    if ( tag == 0 )");
            WriteLine("                    {");
            WriteLine("                        throw new ArgumentException(\"Invalid tag:0\");");
            WriteLine("                    }");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient.GetTagValueInterval( tag );");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed GetTagValueInterval in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException( exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();


        }


        private void Process(ProjectTables projectTables)
        {
            foreach (ProjectTable projectTable in projectTables.Children)
            {
                Process(projectTable);
                WriteLine();
            }
        }

        private void Process(ProjectTable projectTable)
        {
            GenerateGetMethods(projectTable);

            GenerateSaveMethod(projectTable);
            GenerateInsertMethod(projectTable);
            GenerateUpdateMethod(projectTable);
            GenerateDeleteMethod(projectTable);

        }


        public void GenerateGetMethods(ProjectTable projectTable)
        {
            GenerateGetAllMethod(projectTable);

            GenerateGetByPrimaryKeyMethod(projectTable);

            ProjectTabularIndexes indexes = projectTable.GetIndexes();
            foreach (ProjectTabularIndex index in indexes.Children)
            {
                GenerateGetByIndexMethod(projectTable, index);
            }


            ProjectTabularReferences references = projectTable.GetReferences();
            foreach (ProjectTabularReference reference in references.Children)
            {
                GenerateGetByReferenceMethod(projectTable, reference);
            }

            GenerateTagValueGetMethods(projectTable);

        }

        private void GenerateGetAllMethod(ProjectTable projectTable)
        {
            string tagArgDecl = "";
            string tagArg = "";
            if (projectTable.IsTagValue)
            {
                tagArgDecl = " long tag ";
                tagArg = " tag ";
            }
            string baseName = projectTable.GetBaseName();
            string dataClassName = projectTable.GetDataTypeClassName();
            string methodName = "GetAll" + baseName + "s";

            WriteLine("        public List<" + dataClassName + "> " + methodName + "(" + tagArgDecl + ")");
            WriteLine("        {");
            WriteLine("            List<" + dataClassName + "> result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            if (projectTable.IsTagValue)
            {
                WriteLine("                    if ( tag == 0 )");
                WriteLine("                    {");
                WriteLine("                        throw new ArgumentException(\"Invalid tag:0\");");
                WriteLine("                    }");
            }
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "(" + tagArg + ");");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
        }
        private void GenerateGetByPrimaryKeyMethod(ProjectTable projectTable)
        {
            string tagArgDecl = "";
            string tagArg = "";
            if (projectTable.IsTagValue)
            {
                tagArgDecl = " long tag,";
                tagArg = " tag,";
            }
            string dataClassName = projectTable.GetDataTypeClassName();
            ProjectTabularPrimaryKey primaryKey = projectTable.GetPrimaryKey();
            List<ProjectTabularField> fields = primaryKey.GetFieldList();
            string methodName = MethodNamesHelper.GetServiceGetByMethodName(primaryKey);
            string argDecl = ColumnHelper.GetArgumentDeclarationList(fields);
            string args = ColumnHelper.GetCommaSeparatedPropertyFieldNameList(fields);

            WriteLine("        public " + dataClassName + " " + methodName + "(" + tagArgDecl + argDecl + " )");
            WriteLine("        {");
            WriteLine("            " + dataClassName + " result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            if (projectTable.IsTagValue)
            {
                WriteLine("                    if ( tag == 0 )");
                WriteLine("                    {");
                WriteLine("                        throw new ArgumentException(\"Invalid tag:0\");");
                WriteLine("                    }");
            }
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "(" + tagArg + args + ");");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
        }

        private void GenerateGetByIndexMethod(ProjectTable projectTable, ProjectTabularIndex index)
        {
            string tagArgDecl = "";
            string tagArg = "";
            if (projectTable.IsTagValue)
            {
                tagArgDecl = " long tag,";
                tagArg = " tag,";
            }
            string dataClassName = projectTable.GetDataTypeClassName();

            List<ProjectTabularField> fields = index.GetFieldList();
            string argDecl = ColumnHelper.GetArgumentDeclarationList(fields);
            string args = ColumnHelper.GetCommaSeparatedPropertyFieldNameList(fields);
            string methodName = MethodNamesHelper.GetServiceGetByMethodName(index);

            WriteLine("        public " + dataClassName + " " + methodName + "(" + tagArgDecl + argDecl + " )");
            WriteLine("        {");
            WriteLine("            " + dataClassName + " result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "(" + tagArg + args + ");");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
            if ((projectTable.IsTimeSeries) && (projectTable.IsTagValue == false))
            {
                methodName = MethodNamesHelper.GetServiceGetByForTimeStampMethodName(index);
                WriteLine("        public " + dataClassName + " " + methodName + "(" + tagArgDecl + argDecl + " )");
                WriteLine("        {");
                WriteLine("            " + dataClassName + " result = null;");
                WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
                WriteLine("            Entering(currentMethod);");
                WriteLine("            try");
                WriteLine("            {");
                WriteLine("                try");
                WriteLine("                {");
                WriteLine("                    lock(synchObject)");
                WriteLine("                    {");
                WriteLine("                        EnsureConnected();");
                WriteLine("                        serverCallStarted = DateTime.UtcNow;");
                WriteLine("                        try");
                WriteLine("                        {");
                WriteLine("                            result = dataServiceClient." + methodName + "(" + tagArg + args + ");");
                WriteLine("                        }");
                WriteLine("                        finally");
                WriteLine("                        {");
                WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
                WriteLine("                        }");
                WriteLine("#if DEBUG");
                WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
                WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
                WriteLine("#endif");
                WriteLine("                    }");
                WriteLine("                }");
                WriteLine("                catch (Exception exc)");
                WriteLine("                {");
                WriteLine("                    LogException(exc, currentMethod );");
                WriteLine("                    throw;");
                WriteLine("                }");
                WriteLine("            }");
                WriteLine("            finally");
                WriteLine("            {");
                WriteLine("                Leaving(currentMethod);");
                WriteLine("            }");
                WriteLine("            return result;");
                WriteLine("        }");
                WriteLine();
            }

        }
        private void GenerateGetByReferenceMethod(ProjectTable projectTable, ProjectTabularReference reference)
        {
            string tagArgDecl = "";
            string tagArg = "";
            if (projectTable.IsTagValue)
            {
                tagArgDecl = " long tag,";
                tagArg = " tag,";
            }
            string baseName = projectTable.GetBaseName();
            string accessorClassName = projectTable.GetDataAccessClassName();
            string dataClassName = projectTable.GetDataTypeClassName();
            string readerClassName = projectTable.GetReaderClassName();

            List<ProjectTabularField> fields = reference.GetFieldList();
            string argDecl = ColumnHelper.GetArgumentDeclarationList(fields);
            string args = ColumnHelper.GetCommaSeparatedPropertyFieldNameList(fields);
            string methodName = MethodNamesHelper.GetServiceGetByMethodName(reference);
            string accessorMethodName = MethodNamesHelper.GetManagerGetByMethodName(reference);

            WriteLine("        public List<" + dataClassName + "> " + methodName + "(" + tagArgDecl + argDecl + " )");
            WriteLine("        {");
            WriteLine("            List<" + dataClassName + "> result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "(" + tagArg + args + ");");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();

        }


        private void GenerateTagValueGetMethods(ProjectTabular tabular)
        {
            if (tabular is ProjectTable)
            {
                ProjectTable projectTable = (ProjectTable)tabular;

                if (projectTable.IsTagValue)
                {
                    string baseName = projectTable.GetBaseName();
                    string dataClassName = projectTable.GetDataTypeClassName();

                    string methodName = "Get" + baseName + "ForTimeStamp";

                    WriteLine("        public " + dataClassName + " " + methodName + "( long tag, DateTime ts )");
                    WriteLine("        {");
                    WriteLine("            " + dataClassName + " result = null;");
                    WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
                    WriteLine("            Entering(currentMethod);");
                    WriteLine("            try");
                    WriteLine("            {");
                    WriteLine("                try");
                    WriteLine("                {");
                    WriteLine("                    lock(synchObject)");
                    WriteLine("                    {");
                    WriteLine("                        EnsureConnected();");
                    WriteLine("                        serverCallStarted = DateTime.UtcNow;");
                    WriteLine("                        try");
                    WriteLine("                        {");
                    WriteLine("                            result = dataServiceClient." + methodName + "( tag, ts);");
                    WriteLine("                        }");
                    WriteLine("                        finally");
                    WriteLine("                        {");
                    WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
                    WriteLine("                        }");
                    WriteLine("#if DEBUG");
                    WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
                    WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
                    WriteLine("#endif");
                    WriteLine("                    }");
                    WriteLine("                }");
                    WriteLine("                catch (Exception exc)");
                    WriteLine("                {");
                    WriteLine("                    LogException(exc, currentMethod );");
                    WriteLine("                    throw;");
                    WriteLine("                }");
                    WriteLine("                return result;");
                    WriteLine("            }");
                    WriteLine("            finally");
                    WriteLine("            {");
                    WriteLine("                Leaving(currentMethod);");
                    WriteLine("            }");
                    WriteLine("        }");
                    WriteLine();


                    methodName = "Get" + baseName + "ForLastTimeStamp";

                    WriteLine("        public " + dataClassName + " " + methodName + "( long tag )");
                    WriteLine("        {");
                    WriteLine("            " + dataClassName + " result = null;");
                    WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
                    WriteLine("            Entering(currentMethod);");
                    WriteLine("            try");
                    WriteLine("            {");
                    WriteLine("                try");
                    WriteLine("                {");
                    WriteLine("                    lock(synchObject)");
                    WriteLine("                    {");
                    WriteLine("                        EnsureConnected();");
                    WriteLine("                        serverCallStarted = DateTime.UtcNow;");
                    WriteLine("                        try");
                    WriteLine("                        {");
                    WriteLine("                            result = dataServiceClient." + methodName + "( tag );");
                    WriteLine("                        }");
                    WriteLine("                        finally");
                    WriteLine("                        {");
                    WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
                    WriteLine("                        }");
                    WriteLine("#if DEBUG");
                    WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
                    WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
                    WriteLine("#endif");
                    WriteLine("                    }");
                    WriteLine("                }");
                    WriteLine("                catch (Exception exc)");
                    WriteLine("                {");
                    WriteLine("                    LogException(exc, currentMethod );");
                    WriteLine("                    throw;");
                    WriteLine("                }");
                    WriteLine("                return result;");
                    WriteLine("            }");
                    WriteLine("            finally");
                    WriteLine("            {");
                    WriteLine("                Leaving(currentMethod);");
                    WriteLine("            }");
                    WriteLine("        }");
                    WriteLine();


                    methodName = "Get" + baseName + "ForInterval";

                    WriteLine("        public List<" + dataClassName + "> " + methodName + "( long tag, DateTime startOfInterval, DateTime endOfInterval )");
                    WriteLine("        {");
                    WriteLine("            List<" + dataClassName + "> result = null;");
                    WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
                    WriteLine("            Entering(currentMethod);");
                    WriteLine("            try");
                    WriteLine("            {");
                    WriteLine("                try");
                    WriteLine("                {");
                    WriteLine("                    lock(synchObject)");
                    WriteLine("                    {");
                    WriteLine("                        EnsureConnected();");
                    WriteLine("                        serverCallStarted = DateTime.UtcNow;");
                    WriteLine("                        try");
                    WriteLine("                        {");
                    WriteLine("                            result = dataServiceClient." + methodName + "( tag, startOfInterval, endOfInterval );");
                    WriteLine("                        }");
                    WriteLine("                        finally");
                    WriteLine("                        {");
                    WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
                    WriteLine("                        }");
                    WriteLine("#if DEBUG");
                    WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
                    WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
                    WriteLine("#endif");
                    WriteLine("                    }");
                    WriteLine("                }");
                    WriteLine("                catch (Exception exc)");
                    WriteLine("                {");
                    WriteLine("                    LogException(exc, currentMethod );");
                    WriteLine("                    throw;");
                    WriteLine("                }");
                    WriteLine("            }");
                    WriteLine("            finally");
                    WriteLine("            {");
                    WriteLine("                Leaving(currentMethod);");
                    WriteLine("            }");
                    WriteLine("            return result;");
                    WriteLine("        }");
                    WriteLine();
                }
            }

        }


        private void GenerateSaveMethod(ProjectTable projectTable)
        {
            ProjectTabularField concurrencyField = projectTable.GetConcurrencyField();
            if (concurrencyField == null)
            {
                return;
            }
            string baseName = projectTable.GetBaseName();
            string accessorClassName = projectTable.GetDataAccessClassName();
            string dataClassName = projectTable.GetDataTypeClassName();
            string readerClassName = projectTable.GetReaderClassName();

            string methodName = "Save" + baseName;

            WriteLine("        public " + dataClassName + " " + methodName + "(Guid clientId, " + dataClassName + " element )");
            WriteLine("        {");
            WriteLine("            " + dataClassName + " result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "( clientId, element );");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
        }

        private void GenerateInsertMethod(ProjectTable projectTable)
        {
            string baseName = projectTable.GetBaseName();
            string accessorClassName = projectTable.GetDataAccessClassName();
            string dataClassName = projectTable.GetDataTypeClassName();
            string readerClassName = projectTable.GetReaderClassName();

            string methodName = "Insert" + baseName;

            WriteLine("        public " + dataClassName + " " + methodName + "(Guid clientId, " + dataClassName + " element )");
            WriteLine("        {");
            WriteLine("            " + dataClassName + " result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "( clientId, element );");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();

            WriteLine("        public void " + methodName + "List(Guid clientId, List<" + dataClassName + "> elements )");
            WriteLine("        {");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            dataServiceClient." + methodName + "List( clientId, elements );");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("        }");
            WriteLine();
        }

        private void GenerateUpdateMethod(ProjectTable projectTable)
        {
            string baseName = projectTable.GetBaseName();
            string accessorClassName = projectTable.GetDataAccessClassName();
            string dataClassName = projectTable.GetDataTypeClassName();
            string readerClassName = projectTable.GetReaderClassName();

            string methodName = "Update" + baseName;

            WriteLine("        public " + dataClassName + " " + methodName + "( Guid clientId, " + dataClassName + " element )");
            WriteLine("        {");
            WriteLine("            " + dataClassName + " result = null;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "( clientId, element );");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
        }


        private void GenerateDeleteMethod(ProjectTable projectTable)
        {
            string tagArgDecl = "";
            string tagArg = "";
            if (projectTable.IsTagValue)
            {
                tagArgDecl = " long tag,";
                tagArg = " tag,";
            }
            string baseName = projectTable.GetBaseName();
            List<ProjectTabularField> fields = projectTable.GetPrimaryKeyFieldList();
            ProjectTabularField concurrencyField = projectTable.GetConcurrencyField();
            if (concurrencyField != null)
            {
                fields.Add(concurrencyField);
            }

            string argDecl = ColumnHelper.GetArgumentDeclarationList(fields);
            string args = ColumnHelper.GetCommaSeparatedPropertyFieldNameList(fields);
            string methodName = "Delete" + baseName;

            WriteLine("        public int " + methodName + "( Guid clientId, " + tagArgDecl + argDecl + " )");
            WriteLine("        {");
            WriteLine("            int result = 0;");
            WriteLine("            MethodBase currentMethod = MethodBase.GetCurrentMethod();");
            WriteLine("            Entering(currentMethod);");
            WriteLine("            try");
            WriteLine("            {");
            WriteLine("                try");
            WriteLine("                {");
            WriteLine("                    lock(synchObject)");
            WriteLine("                    {");
            WriteLine("                        EnsureConnected();");
            WriteLine("                        serverCallStarted = DateTime.UtcNow;");
            WriteLine("                        try");
            WriteLine("                        {");
            WriteLine("                            result = dataServiceClient." + methodName + "( clientId, " + tagArg + args + " );");
            WriteLine("                        }");
            WriteLine("                        finally");
            WriteLine("                        {");
            WriteLine("                            serverCallCompleted = DateTime.UtcNow;");
            WriteLine("                        }");
            WriteLine("#if DEBUG");
            WriteLine("                        TimeSpan serverCallTimeSpan = serverCallCompleted - serverCallStarted;");
            WriteLine("                        LogDebug(string.Format(\"Executed " + methodName + " in {0}\",serverCallTimeSpan));");
            WriteLine("#endif");
            WriteLine("                    }");
            WriteLine("                }");
            WriteLine("                catch (Exception exc)");
            WriteLine("                {");
            WriteLine("                    LogException(exc, currentMethod );");
            WriteLine("                    throw;");
            WriteLine("                }");
            WriteLine("            }");
            WriteLine("            finally");
            WriteLine("            {");
            WriteLine("                Leaving(currentMethod);");
            WriteLine("            }");
            WriteLine("            return result;");
            WriteLine("        }");
            WriteLine();
        }




    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect Sea Surveillance AS
Norway Norway
Chief Architect - Sea Surveillance AS.

Specializing in integrated operations and high performance computing solutions.

I’ve been fooling around with computers since the early eighties, I’ve even done work on CP/M and MP/M.

Wrote my first “real” program on a BBC micro model B based on a series in a magazine at that time. It was fun and I got hooked on this thing called programming ...

A few Highlights:

  • High performance application server development
  • Model Driven Architecture and Code generators
  • Real-Time Distributed Solutions
  • C, C++, C#, Java, TSQL, PL/SQL, Delphi, ActionScript, Perl, Rexx
  • Microsoft SQL Server, Oracle RDBMS, IBM DB2, PostGreSQL
  • AMQP, Apache qpid, RabbitMQ, Microsoft Message Queuing, IBM WebSphereMQ, Oracle TuxidoMQ
  • Oracle WebLogic, IBM WebSphere
  • Corba, COM, DCE, WCF
  • AspenTech InfoPlus.21(IP21), OsiSoft PI


More information about what I do for a living can be found at: harlinn.com or LinkedIn

You can contact me at espen@harlinn.no

Comments and Discussions