viernes, 19 de junio de 2009

IE 8 mejor que Firefox???

Recién vi que Microsoft publico una campaña en donde compara IE 8, Firefox y Chrome (claro que el ganador es IE 8). En la página se despliegan una serie de características como privacidad, compatibilidad, personalización entre otras.
Les dejo el link a la pagina de IE 8.
Le creeremos a Microsoft?

sábado, 13 de junio de 2009

Notificaciones con Npgsql y PostgreSQL 8.3

Hola que tal buen rato ya sin escribir, últimamente estuve muy ocupado con el trabajo, ya saben que hay momentos en los que todo falla al mismo tiempo. Esta vez me toco estar trabajando en una aplicación ASP.Net en la que ya llevo algunas semanas desarrollando, pero pues como siempre, los altos mandos no quieren gastar mas dinero en el desarrollo ya que nuestro servidor de Oracle esta limitado de licencias, es por esto que se decidió buscar una alternativa de DBMS gratuita (PostgreSQL). ¿Por que no MySql? preguntaran; bueno se decido utilizar un servidor Postgre por su poder y su gran capacidad de desarrollo a travez de su lenguaje PL/PgSQL. Bueno el caso no es eso lo que vamos a discutir hoy. Durante el desarrollo me encontré con la necesidad de realizar varias funciones no muy complejas, pero llegue a una en la que era necesario comunicarse con el mundo exterior para reportar sus resultados. Existen metodos muy sencillos: ejecuta la funcion y si algo sale mal arroja una excepcion y aborta:

begin
--Haz algo
if algo_malo then
RAISE EXCEPTION 'Mensaje algo salio mal';
end if;
end;

Una excepcion es un nivel de mensajes dentro de PostgreSQL y significa que algo fuera de lo común ha ocurrido, pero existen veces en las que nada grave ha salido mal y solo necesitamos enviar un mensaje. O de algun batch de instrucciones solo algunas salieron mal y no podemos abortar la ejecusion ya que las instrucciones que si se procesaron correctamente se cancelarian. Para esto exiten varios niveles en los cuales nosotros podemos colocar un mensaje sin necesidad de abortar la ejecusion de nuestra funcion PL/pgSql el que nos interesa en este post es el nivel de notificacion o NOTICE (Lista Completa).

Bueno primero lo primero para lanzar una notificacion en el sitema de postgre solo hay que invocar RAISE NOTICE. Un ejemplo seria:

RAISE NOTICE 'Mensaje de Notificacion';

Las notificaciones quedaran registradas en el sistema dependiendo de la configuración del servidor postgre, pero como hacemos que Npgsql reciba estas notificaciones que surgen en el servidor, como primer paso tenemos que configurar PostgreSQL para que los mensajes NOTICE sean enviados a los clientes; para hacer esto tenemos que cambiar la variable de entorno "client_min_messages". Esto lo podemos hacer cambiando su valor dentro del archivo "postgresql.conf" localizado dentro del directorio de instalación de Postgre y haciendo que el servidor recargue la configuración del archivo; los valores posibles para esta variable son cualquiera de los listados en los niveles mensajes arriba direccionados. Establecemos esta variable a "notice", para que todos los mensajes generados con este nivel o niveles siguientes sean enviados al cliente y así poderlos capturar con npgsql en nuestro programa.
Las lineas de configuración quedarían mas o menos as
í: (Nota: Esto es en Postgre 8.3, no lo probé para otra versión).

client_min_messages = 'notice' # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# log
# notice
# warning
# error


Una vez que el servidor esta configurado para enviar los mensajes de notificación, solo necesitamos hacer que nuestro NpgsqlConnection maneje los mensajes que el servidor nos enviara. Así que en el código de nuestra aplicación solo tenemos que agregar una función que actuara como manejador de los mensajes.

Para hacer esto necesitamos establecer cual método sera el encargado de procesar los mensajes que lleguen al cliente. En nuestra conexión necesitamos agregar una función en la propiedad Notice que se llamara una vez que se reciban las mensajes provenientes del servidor. Quedaría mas o menos así:

NpgsqlConnection conn = new NpgsqlConnection('CADENA DE CONEXION');
conn.Notice += MetodoManejador;

public void MetodoManejador(object sender, Npgsql.NpgsqlNoticeEventArgs e)
{
//Procesar el mensaje
}

Y eso seria todo, cabe mencionar que el objeto NpgsqlNoticeEventArgs contiene el mensaje proveniente del servidor. Un punto extra, a partir de la versión 1.0 de Npgsql existe soporte para notificaciones sinctronas, esto quiere decir que Npgsql puede recibir las notificaciones del servidor sin una interacción extra que saque las notificaciones generadas. Para habilitar esta opción es necesario agregar en la cadena de conexión el parametro
"SyncNotification = true".

A continuación les dejo un pequeño ejemplo que realice.

string conString = "CADENA DE CONEXION";
Npgsql.NpgsqlConnection con = Utilities.GetNpsqlConnection(conString);
Npgsql.NpgsqlCommand com = new Npgsql.NpgsqlCommand("sp_raise_notice", con);
com.CommandType = CommandType.StoredProcedure;
com.Connection.Notice += new Npgsql.NoticeEventHandler(Connection_Notice);
com.Connection.Open();
try
{
com.ExecuteNonQuery();
}
catch (Exception e)
{
writeMessage(e.Message);
}
finally
{
com.Connection.Close();
}

//Metodo Manejador
void Connection_Notice(object sender, Npgsql.NpgsqlNoticeEventArgs e)
{
writeMessage(e.Notice.Message);
}


Nota por razones de seguridad no pongo mi cadena de conexión pero en ella esta habilitada la opción SyncNotification. Si tienen alguna duda de como formar su cadena de conexión para postgre pueden visitar la pagina:
http://www.connectionstrings.com/postgre-sql
O si quieren pueden visitar el manual completo de NpgSQL (muy completo) en:
http://npgsql.projects.postgresql.org/docs/manual/UserManual.html

Saludos a Todos!!!.