sábado, 19 de octubre de 2013

A bash script for replacing a string in every file of a directory

It replaces all occurrences of the search string with the replacement string in every file of a specified directory:
#!/bin/bash

string1='abc';
string2='123';
directory='test_directory';
for file in $(grep -lr $string1 $directory); do
  echo $file;
  cp $file /tmp/temporal_file;
  sed s/${string1}/${string2}/ /tmp/temporal_file > $file;
  rm -rf /tmp/temporal_file;
done;

domingo, 5 de febrero de 2012

¿Problemas con la codificación de caracteres en PostgreSQL + PHP?

Hola a todos,

Solo quería recordarles que PostgreSQL tiene funciones integradas para convertir entre distintos tipos de codificaciones de caracteres.

Hace unos meses tuve que realizar un desarrollo sobre una base de datos PostgreSQL con codificación ASCII y, debo decir, que me estaba generando dolores de cabeza el consultar datos con tildes desde PHP.

¿La solución? Convertir internamente los caracteres antes de ser retornados por el motor de base datos.

De esta forma, los datos llegan codificados en UTF-8 limpio y puro para ser post-procesados en nuestros scripts de PHP.

En mi caso particular, utilicé la función "convert using iso_8859_16_to_utf_8".

Un ejemplo de uso:
SELECT convert(nombre using iso_8859_16_to_utf_8)
FROM persona;



domingo, 29 de enero de 2012

Eliminar todas las llaves foráneas de un usuario en Oracle

El siguiente es el código de un procedimiento Oracle que elimina todas las llaves foráneas de un usuario:

DECLARE

cadena VARCHAR(30000);

BEGIN

FOR registro IN (SELECT DISTINCT LOWER(A.TABLE_NAME) AS TABLE_NAME, LOWER(A.CONSTRAINT_NAME) AS CONSTRAINT_NAME

FROM ALL_CONSTRAINTS A, ALL_CONS_COLUMNS C

WHERE A.CONSTRAINT_TYPE = 'R'

AND A.OWNER = 'USUARIO'

AND A.CONSTRAINT_NAME = C.CONSTRAINT_NAME

ORDER BY 1,2)

LOOP

IF SUBSTR(registro.CONSTRAINT_NAME,0,1)='$' THEN

cadena := 'ALTER TABLE ' || registro.TABLE_NAME || ' DROP CONSTRAINT "' || registro.CONSTRAINT_NAME || '"';

ELSE

cadena := 'ALTER TABLE ' || registro.TABLE_NAME || ' DROP CONSTRAINT ' || registro.CONSTRAINT_NAME;

END IF;

DBMS_OUTPUT.PUT_LINE(cadena);

EXECUTE IMMEDIATE cadena;

END LOOP;

END;

Nota: es necesario reemplazar la palabra 'USUARIO' por el nombre del usuario.


domingo, 15 de enero de 2012

Eliminar todas las tablas de una base de datos PostgreSQL

Procedimiento:

1- Utilizamos el siguiente comando para generar automáticamente un script SQL con todos los DROPs:
~$ psql -h <hostname> -t -d <database> -U <username> -c "SELECT
'DROP TABLE ' || n.nspname || '.' || c.relname || ' CASCADE;'
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1;" > droptables
Donde:
  • <hostname> = Nombre de la máquina donde reside la base de datos
  • <database> = Nombre de la base de datos
  • <username> = Nombre de usuario
2- Ejecutamos el script generado en el paso anterior:
~$ psql -h <hostname> -d <database> -U <username> -f droptables



Consultar todos los índices en PostgreSQL y Oracle

PostgreSQL (hasta 14 índices por tabla):
SELECT
UPPER(t.relname) as table_name
UPPER(a.attname) as column_name
FROM
pg_class t,
pg_class i,
pg_index ix,
pg_attribute a,
pg_namespace
WHERE
t.oid = ix.indrelid
AND i.oid = ix.indexrelid
AND a.attrelid = t.oid
AND (
a.attnum = ix.indkey[0]
OR a.attnum = ix.indkey[1]
OR a.attnum = ix.indkey[2]
OR a.attnum = ix.indkey[3]
OR a.attnum = ix.indkey[5]
OR a.attnum = ix.indkey[6]
OR a.attnum = ix.indkey[7]
OR a.attnum = ix.indkey[8]
OR a.attnum = ix.indkey[9]
OR a.attnum = ix.indkey[10]
OR a.attnum = ix.indkey[11]
OR a.attnum = ix.indkey[12]
OR a.attnum = ix.indkey[13]
OR a.attnum = ix.indkey[14]
)
AND t.relkind = 'r'
AND t.relnamespace = pg_namespace.oid
AND pg_namespace.nspname = 'public'
ORDER BY
t.relname,
a.attname;

Oracle:
SELECT table_name, column_name
FROM user_ind_columns
ORDER BY table_name, column_name


lunes, 9 de enero de 2012

Limpiar/vaciar/eliminar un tablespace del tipo UNDO en Oracle

1-
CREATE UNDO TABLESPACE nuevo DATAFILE '/media/sdb1/nuevo.dbf' SIZE 1M AUTOEXTEND ON MAXSIZE 10M;

Donde:
  • SIZE -> Tamaño inicial en Megabytes.
  • AUTOEXTEND ON MAXSIZE -> Tamaño máximo en Megabytes.

2- 
ALTER SYSTEM SET UNDO_TABLESPACE = nuevo;

3-
DROP TABLESPACE UNDO;
Nota: reemplazar UNDO por el nombre del tablespace UNDO que quieres limpiar/vaciar/eliminar.


Como pudieron darse cuenta, la solución para limpiar/vaciar un tablespace tipo UNDO es sustituirlo por uno nuevo.

Saludos.