agosto 2006

You are currently browsing the monthly archive for agosto 2006.

Borland Turbo ProductsBorland rilancia il classico Turboâ„¢.

Più di qualcuno ricorderà il mitico TurboPascal. Ora Borland rilancia con una linea di prodotti Turbo™ a basso costo per sviluppare in Win32 e .NET.

La linea di prodotti Turboâ„¢ include:

  • Turbo Delphi for Win32
  • Turbo Delphi for .NET
  • Turbo C++
  • Turbo C#

Ogni versione sarà disponibile in due edizioni:
Turbo Explorer, edizione free per imparare a programmare.
Turbo Professional, edizione a meno di $500.

Turbo Delphi, Turbo Delphi for .NET, Turbo C++ and Turbo C# saranno disponibile all’inizio di settembre 2006.

Sembra che gli IDE di entrambe le edizioni si avvalgono delle caratteristiche di BDS2006

  • Refactorings
  • Live Templates
  • Code Completion
  • Code Insight
  • Block Completion

Maggiori informazioni sono disponibili sul sito www.turboexplorer.com.

Interessante news, sia per il ritorno di un compilatore free, che per una alternativa economica al Borland Developer Studio.

Tags:

Qualche tempo fa, ho avuto necessità di eseguire uno script esterno legato ad un trigger di PostgreSql.
All’epoca, l’unica soluzione che ho trovato è stata di creare una funzione in C che richiamasse lo script con i dovuti parametri.

Questo il codice:
[c]
#include
#include
#include “postgres.h”
#include
#include “fmgr.h”
#include “utils/builtins.h”

#define _textout(str) DatumGetPointer(DirectFunctionCall1(textout, PointerGetDatum(str)))

PG_FUNCTION_INFO_V1(esegui);
Datum esegui(PG_FUNCTION_ARGS);

Datum esegui(PG_FUNCTION_ARGS){
int pid;

char *path, *cmd, *host, *user, *pwd, *param; //Parametri della funzione

path = _textout(PG_GETARG_TEXT_P(0));
cmd = _textout(PG_GETARG_TEXT_P(1));
host = _textout(PG_GETARG_TEXT_P(2));
user = _textout(PG_GETARG_TEXT_P(3));
pwd = _textout(PG_GETARG_TEXT_P(4));
param = _textout(PG_GETARG_TEXT_P(5));

// Eseguo un fork per evitare di rallentare le operazioni sul database
switch(pid=fork()){
case -1: //Errore. Non posso eseguire il fork.
exit(-1);
case 0 : //Fork riuscita. Eseguo il codice “figlio”
execl(path, cmd, host, user, pwd, param,0); // Questo e’ il codice “figlio”
exit(1);
default:
return pid;
exit(1);
}
}
[/c]

Per utilizzare questa funzione con postgres, sono necessari pochi semplici passi:

Per prima cosa compiliamo la nostra funzione c (nel mio caso il file era: execcmdrouter.c).

gcc -I/usr/include/postgresql/server/ -shared execcmdrouter.c -o execcmdrouter.so

Copiamo l’oggetto ottenuto in “casa” di postgres e attribuiamogliene la proprietà 😉

cp execcmdrouter.so /var/lib/postgres/
chown postgres.postgres /var/lib/postgres/execcmdrouter.so

Quindi creiamo la funzione in postgres:


CREATE FUNCTION esegui(text,text,text,text,text,text) RETURNS INTEGER
AS '/var/lib/postgres/execcmdrouter.so' LANGUAGE C;

Fatto.

Spero possa a essere utile a qualcuno.

Tags: , , ,