Archive for 23 febrero 2009

Agregar y borrar usuarios de Firebird desde C++ builder

febrero 23, 2009

Agregar usuario

En la pestaña InterBase Admin de C++ builder 6 existe el componente TIBSecurityService, este componente sirve para agregar o borrar usuarios de un servidor de base de datos Firebird, así como para mostrar o modificar su información.

Suponiendo que dejamos la contraseña por default del usuario sysdba de Firebird y tenemos en un formulario de C++ Builder 6 (llamado Form1) un componente TButton llamado Button1 y 4 componentes TEdit llamados e_usuario, e_nombre, e_apellido y e_clave respectivamente, podríamos agregar un componente TIBSecurityService llamado IBSecurityService1 y poner el siguiente código en el evento OnClick de Button1 para agregar un usuario al servidor Firebird con los datos que contengan los TEdit.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  IBSecurityService1->Params->Values["user_name"]="sysdba";
  IBSecurityService1->Params->Values["password"]="masterkey";

  IBSecurityService1->Active = true;
  try
     {
      IBSecurityService1->UserName = e_usuario->Text;
      IBSecurityService1->FirstName = e_nombre->Text;
      IBSecurityService1->LastName = e_apellido->Text;
      IBSecurityService1->Password = e_clave->Text;
      IBSecurityService1->AddUser();
     }
  __finally
           {
            IBSecurityService1->Active = false;
           }
}

Notese que para indicar el usuario y password con el que se conectará el componente TIBSecurityService se usó

IBSecurityService1->Params->Values[“user_name”]=”sysdba”;
IBSecurityService1->Params->Values[“password”]=”masterkey”;

y no:

IBSecurityService1->Params->Add(“user_name = sysdba”);
IBSecurityService1->Params->Add(“password = masterkey”);

Ya que marcaría un error como “SPB Constant Unknown

Con esto queda agregado el usuario, pero falta hacer los grants para darle permisos de consulta (grant select), inserción (grant insert), borrado (grant delete) y actualización (grant update) sobre las tablas de la base de datos deseada.

Otorgar grants al usuario

Para esto, crearemos un stored procedure (procedimiento almacenado) en la base de datos.

El stored procedure (que llamaremos sp_Grants) otorgará todos los grants a un usuario sobre una tabla determinada; recibirá como parámetros el usuario y el nombre de la tabla.


/* Este procedure otorga todos los permisos al usuario que recibe como parámetro
   sobre la tabla que recibe como parámetro */

set term !! ;
create procedure sp_Grants(s_tabla varchar(65), s_usuario varchar(8))
as
  begin
        execute statement 'grant all on ' || :s_tabla || ' to ' || :s_usuario;
  end !!
set term ; !!

Agregamos a nuestro formulario un componente TIBDatabase llamado IBDatabase1 y un componente TIBStoredProc llamado IBSP_grants. En la propiedad Database del TIBStoredProc ponemos IBDatabase1 y en la propiedad StoredProcName SP_GRANTS (que es el nombre del stored procedure que creamos en la base de datos).

Por último agregamos un componente TListBox al que llamaremos lb_tablas. Lo que haremos será conectarnos a la base de datos, obtener los nombres de todas las tablas y pasarlos al ListBox, después iremos recorriendo el ListBox para otorgar todos los grants sobre todas las tablas al usuario llamando a nuestro stored procedure.

Basta con agregar el siguiente código al final del código que pusimos anteriormente en el evento OnClick del TButton llamado Button1.

En el ejemplo nuestra base de datos se llama prueba.fdb y se encuentra en el directorio llamado prueba de la unidad c:

 // Asigna la ruta a la base de datos
 IBDatabase1->Params->Values["user_name"]="sysdba";
 IBDatabase1->Params->Values["password"]="masterkey";
 IBDatabase1->DatabaseName = "c:\\prueba\\prueba.fdb";

 // Hace la conexión a la base de datos
 IBDatabase1->Connected=true;

 // Pasa los nombres de las tablas de la base de datos al ListBox
 IBDatabase1->GetTableNames(lb_tablas->Items,False);

 // Se desconecta de la base de datos
 IBDatabase1->Connected=false;

 for (int i_x=0; i_x<lb_tablas->Items->Count; i_x++)
     {
      IBSP_grants->ParamByName("s_tabla")->AsString = Trim(lb_tablas->Items->Strings[i_x]);
      IBSP_grants->ParamByName("s_usuario")->AsString = e_usuario->Text;
      IBSP_grants->ExecProc();
      lb_tablas->ItemIndex++;
     }
 lb_tablas->Clear();

Si queremos que no se vea el ListBox sólo debemos poner false en su propiedad Visible

Borrar usuario

Agregamos un componente TButton al que llamaremos Button2 y en su evento OnClick pondremos el siguiente código


void __fastcall TForm1::Button2Click(TObject *Sender)
{
  IBSecurityService1->Params->Values["user_name"]="sysdba";
  IBSecurityService1->Params->Values["password"]="masterkey";

  IBSecurityService1->Active = true;
  try
     {
      IBSecurityService1->UserName = e_usuario->Text;     
      IBSecurityService1->DeleteUser();
     }
  __finally
           {
            IBSecurityService1->Active = false;
           }
}

Nota: En el post la macro de wordpress muestra finally, pero debe ser __finally

Anuncios

Error java.lang.NoClassDefFoundError en Debian Etch

febrero 11, 2009

En una PC con Windows instalé NetBeans 6.5 y desarrollé una aplicación GUI muy sencilla en java.

Después intenté ejecutar esta aplicación en una PC con Debian Etch escribiendo desde consola:

java -jar nombre_aplicacion.jar

y aparecia el siguiente error:

Exception in thread “main” java.lang.NoClassDefFoundError: javax/swing/GroupLayo
ut$Group

Este error se debe a que está instalada la versión 5.0 del JRE (Java Runtime Environment) de Sun que viene en el paquete sun-java5-jre de Debian Etch y NetBeans 6.5 utiliza una versión más nueva.

La version 6 del JRE viene en el paquete sun-java6-jre que se encuentra en el repositorio de backports para Debian Etch http://packages.debian.org/etch-backports/sun-java6-jre

En mi post sobre instalar firebird 2.0 en Debian Etch explico como agregar este repositorio.

Ya que tenemos agregado el repositorio a nuestro archivo de fuentes (/etc/apt/sources.list) y hecho el respectivo apt-get update procedemos a desinstalar la versión 5.o del JRE

Para ver que paquetes de java tenemos instalados ejecutamos

dpkg -l |grep sun-java

En mi caso aparecen los siguientes paquetes

ii sun-java5-bin 1.5.0-14-1etch1 Sun Java(TM) Runtime Environment (JRE) 5.0 (
ii sun-java5-demo 1.5.0-14-1etch1 Sun Java(TM) Development Kit (JDK) 5.0 demos
ii sun-java5-jdk 1.5.0-14-1etch1 Sun Java(TM) Development Kit (JDK) 5.0
ii sun-java5-jre 1.5.0-14-1etch1 Sun Java(TM) Runtime Environment (JRE) 5.0 (

Esto es porque además del JRE también tengo instalado el kit para desarolladores JDK (Java Development Kit).

Para eliminar los paquetes ejecutamos

sudo apt-get –purge remove sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre

Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Los siguientes paquetes se ELIMINARÁN:
sun-java5-bin* sun-java5-demo* sun-java5-jdk* sun-java5-jre*
0 actualizados, 0 se instalarán, 4 para eliminar y 38 no actualizados.
Necesito descargar 0B de archivos.
Se liberarán 114MB después de desempaquetar.
¿Desea continuar [S/n]?

Decimos que si y la desinstalación termina

La instalación de java en Debian normalmente crea algunos enlaces simbólicos, para ver si existen enlaces simbólicos para java ejecutamos

sudo update-alternatives –display java

En mi caso muestra
No hay alternativas para java.

Pero si se hubieran encontrado enlaces simbólicos habría que eliminarlos ejecutando

sudo update-alternatives –remove-all java

Después ejecutamos

sudo update-alternatives –display javac

En mi caso muestra
javac – el estado es manual.
el enlace apunta actualmente a /usr/lib/jvm/java-1.5.0-sun/bin/javac
No hay ninguna versión disponible.

Como en el caso anterior, para eliminar todos los enlaces simbólicos ejectuamos

sudo update-alternatives –remove-all javac

Nota: Los siguientes enlaces son útiles para conocer más sobre la administración de paquetes en Debian (instalación, desinstalación, saber el estatus de un paquete, etc.)

http://www.debian.org/doc/manuals/apt-howto/ch-search.es.html
http://www.debian.org/doc/manuals/quick-reference/ch-package.es.html

Ahora si procedemos a instalar el JRE 6 de Sun para lo cual ejecutamos

sudo apt-get install sun-java6-jre

Leyendo lista de paquetes… Hecho
Creando árbol de dependencias… Hecho
Se instalarán los siguientes paquetes extras:
sun-java6-bin
Paquetes sugeridos:
binfmt-support sun-java6-plugin ia32-sun-java6-plugin sun-java6-fonts ttf-baekmuk ttf-unfonts ttf-unfonts-core ttf-kochi-gothic ttf-sazanami-gothic
ttf-kochi-mincho ttf-sazanami-mincho ttf-arphic-uming
Paquetes recomendados
libnss-mdns gsfonts-x11
Se instalarán los siguientes paquetes NUEVOS:
sun-java6-bin sun-java6-jre
0 actualizados, 2 se instalarán, 0 para eliminar y 38 no actualizados.
Necesito descargar 33.6MB de archivos.
Se utilizarán 96.4MB de espacio de disco adicional después de desempaquetar.
¿Desea continuar [S/n]?

Decimos que si y aparece la siguiente pantalla

java6

Seleccionamos aceptar y ahora aparece la siguiente pantalla

java6_2

Después de aceptar los términos de la licencia la instalación termina

Seleccionando el paquete sun-java6-bin previamente no seleccionado.
Desempaquetando sun-java6-bin (de …/sun-java6-bin_6-07-3~bpo40+1_i386.deb) …
sun-dlj-v1-1 license has already been accepted
Configurando sun-java6-bin (6-07-3~bpo40+1) …

Configurando sun-java6-jre (6-07-3~bpo40+1) …

Si ejecutamos

dpkg -l |grep sun-java

Ahora nos muestra

ii sun-java6-bin 6-07-3~bpo40+1 Sun Java(TM) Runtime Environment (JRE) 6 (ar
ii sun-java6-jre 6-07-3~bpo40+1 Sun Java(TM) Runtime Environment (JRE) 6 (ar

Ahora ya podemos ejecutar nuestra aplicacion java que contiene una interfaz gráfica de usuario (GUI) sin problemas.

Convertir una cadena a double en c++ builder

febrero 9, 2009

La siguiente función recibe una cadena, elimina de la misma todos los caracteres que no sean números y regresa un double.

Acepta el caracter – al principio de la cadena para indicar números negativos y un punto para separar decimales (sólo se acepta el primer punto que contenga la cadena)

Ejemplo:  Si la función recibe la cadena “5-A-6200″, regresará un double cuyo valor será 56200.

Si la cadena no se puede convertir a un número, la función regresa el número cero.

double __fastcall TForm1::ConvierteANumero(String s_cadena)
{
String s_aux=””;
bool bl_negativo=false;

// Si la cadena que recibe está vacia, regresa 0
if (s_cadena==””)
s_aux=”0″;
else
{
// Checa el primer caracter para ver si es el signo menos
if (s_cadena.SubString(1,1)==”-“)
bl_negativo=true;

// Va recorriendo la cadena que recibe y pasando a s_aux sólo los números y el punto
for (int i_x=1;i_x <=s_cadena.Length();i_x++) { if (s_cadena.SubString(i_x,1)>= ‘0’ && s_cadena.SubString(i_x,1)<= '9') s_aux=s_aux+s_cadena.SubString(i_x,1); else { // Si el caracter es un punto, verifica que no exista ya un punto en la cadena if (s_cadena.SubString(i_x,1) == '.' && s_aux.Pos('.')==0) s_aux=s_aux+s_cadena.SubString(i_x,1); } } } if (bl_negativo) s_aux="-"+s_aux; // Si la cadena resultante está vacia, segnifica que s_cadena no contenía ningún número, sólo caracteres. así que se convierte a 0 if (s_aux.IsEmpty()) s_aux="0"; else if (s_aux.Length()==1 && !(s_aux >= ‘0’ && s_aux <= '9')) s_aux="0"; return s_aux.ToDouble(); } [/sourcecode]

Instalar firebird 2.0 en Debian Etch

febrero 5, 2009

En Debian Etch se encuentra el paquete firebird2-super-server pero la versión de firebird que contiene corresponde a la rama 1.5.x y no a la 2.0.x.

Para instalar la versión de firebird correspondiente a la rama 2.0.x debemos instalar el paquete firebird2.0-super que se encuentra en el repositorio de backports http://packages.debian.org/etch-backports/firebird2.0-super

Nota: La instalación fue realizada en una PC con la versión de Debian Etch en inglés, por lo que los mensajes y pantallas que se muestran contienen los textos en inglés pero el proceso que se debe seguir en la versión en español es el mismo.

Lo primero que debemos hacer es agregar el repositorio de backports al archivo de fuentes /etc/apt/sources.list para lo cual insertamos las siguientes lineas:

deb http://www.backports.org/debian etch-backports main contrib non-free
deb-src http://www.backports.org/debian etch-backports main contrib non-free

Despues hacemos sudo apt-get update
Cuando termina, al final nos muestra un mensaje como el siguiente:

Reading package lists… Done
W: GPG error: http://www.backports.org etch-backports Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY EA8E8B2116BA136C

No hay problema, el error es porque no tenemos la clave para la autenticación del repositorio backports.
Lo solucionamos instalando el paquete debian-backports-keyring:

sudo apt-get install debian-backports-keyring

Aparece el siguiente mensaje:

Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
debian-backports-keyring
0 upgraded, 1 newly installed, 0 to remove and 86 not upgraded.
Need to get 3310B of archives.
After unpacking 49.2kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
debian-backports-keyring
Install these packages without verification [y/N]?

Decimos que si y la instalación continúa

Get:1 http://www.backports.org etch-backports/main debian-backports-keyring 2007.06.10 [3310B]
Fetched 3310B in 2s (1640B/s)
Selecting previously deselected package debian-backports-keyring.
(Reading database … 43431 files and directories currently installed.)
Unpacking debian-backports-keyring (from …/debian-backports-keyring_2007.06.10_all.deb) …
Setting up debian-backports-keyring (2007.06.10) …
OK

Ahora si procedemos a instalar firebird 2.0 en su arquitectura super server

sudo apt-get install firebird2.0-super

Al final muestra este mensaje

Setting up firebird2.0-super (2.0.3.12981.ds1-14~bpo40+1) …
Created default security.fdb
Firebird 2.0 server manager not running.
* Not starting Firebird 2.0 server manager
* Use `dpkg-reconfigure firebird2.0-super’ to enable.

Ejecutamos sudo dpkg-reconfigure firebird2.0-super y en la pantalla que aparece seleccionamos Yes
config_firebird_1
En la siguiente pantalla ponemos un password para el usuario SYSDBA

config_firebird_2
y después de dar OK la instalación termina indicandonos que el servidor ya esta funcionando.

Firebird 2.0 server manager not running.
Starting Firebird 2.0 server manager…done.
GSEC> GSEC> Firebird 2.0 server manager already running.

Para verificar que está corriendo el servidor ejecutamos

top -b -n1 | grep fb

Debe aparecer un proceso llamado fbguard y uno llamado fbserver

2353 firebird  20   0  3720 1492 1240 S  0.0  0.8   0:00.00 fbguard
2354 firebird  19   0 36272 4192 3060 S  0.0  2.2   0:00.05 fbserver

Creamos un directorio en donde pondremos la base de datos que será accesible desde los clientes remotos con Windows

sudo mkdir /database

Ponemos como propietario del directorio al usuario firebird

sudo chown firebird.firebird /database

Copiamos a este directorio la base de datos, en este caso se llama baseprueba.fdb.
Ya que tenemos la base de datos en ese directorio, ponemos como propietario al usuario firebird

cd /database
sudo chown firebird.firebird baseprueba.fdb

Ahora vamos al directorio /etc/firebird/2.0 y editamos el archivo aliases.conf para crear un alias para la base de datos indicando la ruta en que se encuentra:

Agregamos la siguiente linea al final del archivo aliases.conf
baseprueba.fdb = /database/baseprueba.fdb

Eso es todo, la ruta que deben usar las maquinas cliente en windows para accesar a la base de datos es la IP del servidor, seguido de dos puntos y el alias de la base de datos.

Por ejemplo 192.168.1.10:baseprueba.fdb

Para información de firebird en español se puede consultar el siguiente enlace http://www.firebird.com.mx

Convertir archivo PostScript a PDF

febrero 2, 2009

Para convertir un archivo PostScript (ps) a formato PDF en Debian Etch podemos utilizar el script ps2pdf, que es parte del paquete gs. Para instalar el paquete gs, debemos teclear desde consola:

sudo apt-get install gs

A continuación, un ejemplo en donde convertimos un archivo PostScript llamado book.ps a formato PDF:

ps2pdf book.ps book.pdf