// created on 12/5/2002 at 23:10 // Npgsql.NpgsqlException.cs // // Author: // Francisco Jr. (fxjrlists@yahoo.com.br) // // Copyright (C) 2002 The Npgsql Development Team // npgsql-general@gborg.postgresql.org // http://gborg.postgresql.org/project/npgsql/projdisplay.php // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either // version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA using System; using System.Resources; using System.IO; using System.Text; using System.Collections; using System.Runtime.Serialization; namespace Npgsql { /// /// The exception that is thrown when the PostgreSQL backend reports errors. /// [Serializable] public sealed class NpgsqlException : ApplicationException { private IList errors; // Logging related values private static readonly String CLASSNAME = "NpgsqlException"; private static ResourceManager resman = new ResourceManager(typeof(NpgsqlException)); // To allow deserialization. private NpgsqlException(SerializationInfo info, StreamingContext context) : base(info, context) { errors = (IList)info.GetValue("errors", typeof(IList)); } /// /// Construct a backend error exception based on a list of one or more /// backend errors. The basic Exception.Message will be built from the /// first (usually the only) error in the list. /// internal NpgsqlException(IList errors) : base(((NpgsqlError)errors[0]).ToString()) { NpgsqlEventLog.LogMsg(resman, "Log_ExceptionOccured", LogLevel.Normal, Message); this.errors = new ArrayList(errors); } internal NpgsqlException(String message) : this (message, null) {} internal NpgsqlException(String message, Exception innerException) : base (message, innerException) { errors = new ArrayList(); errors.Add(new NpgsqlError(ProtocolVersion.Unknown, message)); } override public void GetObjectData(SerializationInfo info,StreamingContext context) { base.GetObjectData(info, context); // Add custom data, in this case the list of errors when serializing. // Thanks Robert Chartier for info: http://www.15seconds.com/issue/020903.htm //use the info object to add the items you want serialized info.AddValue("errors", errors, typeof(IList)); } /// /// Provide access to the entire list of errors provided by the PostgreSQL backend. /// public NpgsqlError this[Int32 Index] { get { return (NpgsqlError)errors[Index]; } } /// /// Severity code. All versions. /// public String Severity { get { return this[0].Severity; } } /// /// Error code. PostgreSQL 7.4 and up. /// public String Code { get { return this[0].Code; } } /// /// Basic error message. All versions. /// public String BaseMessage { get { return this[0].Message; } } /// /// Detailed error message. PostgreSQL 7.4 and up. /// public String Detail { get { return this[0].Detail; } } /// /// Suggestion to help resolve the error. PostgreSQL 7.4 and up. /// public String Hint { get { return this[0].Hint; } } /// /// Position (one based) within the query string where the error was encounterd. PostgreSQL 7.4 and up. /// public String Position { get { return this[0].Position; } } /// /// Trace back information. PostgreSQL 7.4 and up. /// public String Where { get { return this[0].Where; } } /// /// Source file (in backend) reporting the error. PostgreSQL 7.4 and up. /// public String File { get { return this[0].File; } } /// /// Source file line number (in backend) reporting the error. PostgreSQL 7.4 and up. /// public String Line { get { return this[0].Line; } } /// /// Source routine (in backend) reporting the error. PostgreSQL 7.4 and up. /// public String Routine { get { return this[0].Routine; } } /// /// String containing the sql sent which produced this error. /// public String ErrorSql { get { return this[0].ErrorSql; } } /// /// Returns the entire list of errors provided by the PostgreSQL backend. /// public IList Errors { get { return errors; } } /// /// Format a .NET style exception string. /// Include all errors in the list, including any hints. /// public override String ToString() { if (Errors != null) { StringWriter S = new StringWriter(); S.WriteLine("{0}:", this.GetType().FullName); foreach (NpgsqlError PgError in Errors) { AppendString(S, "{0}", PgError.Message); AppendString(S, "Severity: {0}", PgError.Severity); AppendString(S, "Code: {0}", PgError.Code); AppendString(S, "Hint: {0}", PgError.Hint); } S.Write(StackTrace); return S.ToString(); } return base.ToString(); } /// /// Append a line to the given Stream, first checking for zero-length. /// private static void AppendString(StringWriter Stream, string Format, string Str) { if (Str.Length > 0) { Stream.WriteLine(Format, Str); } } } }