private void DeserializeSQLStatements()
        {
            // whooo boy
            List<string> SQLText = new List<string>();
            List<string> ContextList = new List<string>();

            /* read in all SQLText */
            var sqlTextCount = ReadUint();

            for (var x = 0; x < sqlTextCount; x++)
            {
                SQLText.Add(ReadString());
            }

            /* read in all Context List */
            var contextCount = ReadUint();

            for (var x = 0; x < contextCount; x++)
            {
                ContextList.Add(ReadString());
            }

            var totalStatements = ReadUint();

            for (var x = 0; x < totalStatements; x++)
            {
                var statementIndex = ReadUint();
                SQLStatement item = new SQLStatement(SQLText[(int)statementIndex]);
                Data.SQLStatements.Add(item);

                item.InternalID = ReadUint();
                item.LineNumber = ReadLong();
                var parentPresent = ReadBool();

                if (parentPresent)
                {
                    SQLToResolveParent.Add(item, ReadUint());
                }
                item.FetchCount = ReadInt();
                item.ExecTime = ReadDouble();
                item.FetchTime = ReadDouble();
                item.IsError = ReadBool();

                var errorPresent = ReadBool();
                if (errorPresent)
                {
                    item.ErrorInfo = new SQLError();
                    item.ErrorInfo.InternalID = ReadUint();
                    item.ErrorInfo.ErrorPosition = (int)ReadUint();
                    item.ErrorInfo.ReturnCode = (int)ReadUint();
                    item.ErrorInfo.Message = ReadString();
                }

                item.RCNumber = (int)ReadUint();

                var contextIndex = ReadUint();
                item.Context = ContextList[(int)contextIndex];

                var bindCount = ReadUint();

                for (var y = 0; y < bindCount; y++)
                {
                    SQLBindValue bind = new SQLBindValue();
                    item.BindValues.Add(bind);

                    bind.InternalID = ReadUint();
                    bind.Index = (int)ReadUint();
                    bind.Type = (int)ReadUint();
                    bind.Length = (int)ReadUint();
                    bind.Value = ReadString();
                }

            }

        }
        public void ProcessLine(string line, long lineNumber)
        {
            if (lineValid.IsMatch(line) == false)
            {
                return;
            }


            Match m = newStatement.Match(line);
            if (m.Success)
            {
                if (currentStatement != null)
                {
                    Statements.Add(currentStatement);
                }
                string context = contextMarker.Match(line).Groups[0].Value;

                currentStatement = new SQLStatement(m.Groups[3].Value);
                currentStatement.Context = context;
                currentStatement.RCNumber = int.Parse(m.Groups[1].Value);
                currentStatement.LineNumber = lineNumber;
                return;
            }

            m = execStatement.Match(line);
            if (m.Success)
            {
                currentStatement.ExecTime = double.Parse(m.Groups[2].Value);
                return;
            }

            m = fetchStatement.Match(line);
            if (m.Success)
            {
                if (int.Parse(m.Groups[1].Value) != currentStatement.RCNumber)
                {
                    return;
                }

                currentStatement.FetchCount++;
                currentStatement.FetchTime += double.Parse(m.Groups[2].Value);
                return;
            }

            m = bindStatement.Match(line);
            if (m.Success)
            {
                SQLBindValue bind = new SQLBindValue();
                bind.Index = int.Parse(m.Groups[1].Value);
                bind.Type = int.Parse(m.Groups[2].Value);
                bind.Length = int.Parse(m.Groups[3].Value);
                bind.Value = m.Groups[4].Value;
                currentStatement.BindValues.Add(bind);
                return;
            }

            m = errPosStatement.Match(line);
            if (m.Success)
            {
                /* we have an error on this SQL */
                currentStatement.IsError = true;
                currentStatement.ErrorInfo = new SQLError();

                currentStatement.ErrorInfo.ErrorPosition = Int32.Parse(m.Groups[1].Value);
                return;
            }

            m = errorLine.Match(line);
            if (m.Success)
            {
                currentStatement.ErrorInfo.ReturnCode = Int32.Parse(m.Groups[1].Value);
                currentStatement.ErrorInfo.Message = m.Groups[2].Value;
            }
        }