[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: очень хочется squirrelsh



Hello!

On Wednesday 20 January 2010 08:45:09 Denis Feklushkin wrote:
> On Tue, 19 Jan 2010 03:20:31 +0300
> Stanislav Maslovski <stanislav.maslovski@gmail.com> wrote:
> > Зачем тебе оно? Что ты им хочешь заменить? И для каких задач?
> 
> конкретно сейчас мне нужно написать простой демон (или аналогичную программу для вызова из inittab), которая бы:
> постоянно была подключена к postgres
> ловила там NOTIFY
> делала запрос в базу
> в зависимости от ответа либо запускала (exec) программу либо отправляла е-майл в почту админу
> 
> Все действия она должна сопровождать подробной записью в stdout/stderr для последующего разбора полётов если что
> 
> написал пока что на половину этого питоне, питон ужасен (не тролль, но форматирование отступами это такой маразм что просто я не знаю какую вирмешель в голове надо было иметь чтобы такое придумать)
> 

Ну так это решается много проще. Пример trigger-based репликации постгреса в эскулайт:

==========================
CREATE OR REPLACE FUNCTION offline.files_sqlite3()
  RETURNS "trigger" AS
$BODY$

  set t1 [clock clicks]
  load /usr/lib/tcltk/sqlite3/libtclsqlite3.so sqlite3
  set db_file /var/www/offline1/res/dataset/work.db
  sqlite3 db $db_file
  db timeout 4000
#  db eval {PRAGMA journal_mode = PERSIST} 
  if { $TG_op eq "INSERT" } {
    set save_date [string range $NEW(save_date) 0 18]
    db eval {insert into document_file (id,save_date,document_id,user_id,name,size,checksum)
             values ($NEW(id),julianday($save_date,'-3 hour'),$NEW(document_id),$NEW(user_id),$NEW(name),$NEW(size),$NEW(checksum))}
  } elseif { $TG_op eq "UPDATE"} {

  } elseif { $TG_op eq "DELETE"} {
    db eval {update document_file set delete_date=julianday('now') where id=$OLD(id)}
  }
  db close
  set t2 [clock clicks]
  set t [expr ($t2-$t1)/1000]
  elog NOTICE "SQLITE trigger document_file: $t ms"
  return OK

$BODY$
  LANGUAGE 'pltclu' VOLATILE SECURITY DEFINER;
ALTER FUNCTION offline.files_sqlite3() OWNER TO offline;

CREATE TRIGGER trigger_files_sqlite3
  AFTER INSERT OR UPDATE OR DELETE
  ON offline.files
  FOR EACH ROW
  EXECUTE PROCEDURE offline.files_sqlite3();
==========================

Более того, можно на шелле триггеры писать:

$ aptitude show postgresql-8.3-plsh
Package: postgresql-8.3-plsh
Depends: libc6 (>= 2.7-1), postgresql-8.3
Description: PL/sh procedural language for PostgreSQL 8.3
 PL/sh enables an SQL developer to write procedural language functions for PostgreSQL 8.3 in a shell of his choice.  You need this package if you have any PostgreSQL 8.3 functions that use
 the language plsh. 


Best regards, Alexey Pechnikov.
http://pechnikov.tel/

Reply to: