вторник, 14 июля 2009 г.

Postgres 8.4 и VC++ runtime error

Собрался я тут было перевести рабочий сервер на Postgres 8.4. Для проверки решил поставить на своей машине, а он сволочь выдает сообщение "An error occured executing the Microsoft VC++ runtime installer".
Немного покрутив пальцем у виска обнаружил, что в этом случае следует пускать инсталяху с ключом "--install_runtimes 0".

А вот полный список ключей:
  • --prefix <путь>: директория в которую инсталировать postgres (по умолчанию %PROGRAMFILES%\PostgreSQL\8.X в Windows, /opt/PostgreSQL/8.X в Linux и /Library/PostgreSQL/8.X в Mac OS X);
  • --datadir <путь к директории данных>: определеяет где создавать диретокрию для храниня данных (по умолчанию $PREFIX/data) ;
  • --superpassword <пароль>: определяет пароль суперюзера (postgres который). Для Windows заодно и пароль пользователя от которого пускается сервис;
  • --port <номер порта>: определяет номер порта, по умолчанию 5432, но если порту уже занят установленым посгрисом то 5433 и тд;
  • --locale <локаль>: локаль по умолчанию;
  • --create_shortcuts [1|0]: определяет создавать ли ярлыки в меню "Пуск". По умолчанию 1;
  • --install_plpgsql [1|0]:определяет устанавливать ли pl/pgsql в template1. По умолчанию 1;
  • --install_runtimes [1|0]: (только Windows): определяет устинавливать или нет Microsoft Visual C++ runtimes перед установкой.По умолчанию 1.
В принципе все данные по инсталции можно посмотреть на сайте EnterpriseDB

пятница, 27 марта 2009 г.

NPGSQL и Notification

Решил я прикрутить к одной проге, которая хранит данные в postgresql, систему обмена короткими сообщениями между пользователями.

Вроде бы все просто:
Делаем таблицу для хранения сообщений, пишем функции для отправки и получения, и через listen и notify организуем оповещения о поступлении сообщения. Серверная часть вроде заработала быстро, а вот с клиентом возникли затруднения.

В FormLoad написали:
NpgsqlCommand listener = new NpgsqlCommand("listen "+ username,this.npgsqlConnection1);
listener.ExecuteNonQuery();<
this.npgsqlConnection1.Notification += new NotificationEventHandler(npgsqlConnection1_Notification);


И в обработчике сообщения:
NpgsqlCommand getmes = new NpgsqlCommand("select _функция_забора_сообщения_();", this.npgsqlConnection1);
MessageBox.Show(getmes.ExecuteScalar().ToString(), "Срочное сообщение");


Сообщение получалось почему то далеко не всегда, не смотря на то, что соединение использовало SyncNotification, и при закрытии конекшена прога подвисала, при этом сам NPGSQL не вызывал никаких эксепшенов.

Немного порывшись в инете обнаружил какую то пространную фразу о thread'инге и переписал все так:
Thread thread_new = new Thread(delegate()
{
NpgsqlCommand getmes = new NpgsqlCommand("select _функция_забора_сообщения_();", this.npgsqlConnection1);
MessageBox.Show(getmes.ExecuteScalar().ToString(), "Срочное сообщение");
});
thread_new.Start();

После чего эксепшен отловлен и был.

Видимо, я снова что-то не дочитал в документации к NPGSQLю.