sexta-feira, 22 de novembro de 2013

Descompactar Arquivos TAR com GZ

Super dica enviada pelo Jorge :-)

Recebi alguns pacotes de arquivos compactados (TAR). Dentro deles uma série de arquivos GZ.

Dado o volume, eu não posso simplesmente descompactar tudo para depois aplicar meu filtro. Preciso ir descompactando tudo pra saída padrão e filtrando.

Pra isso:

for i in $(tar -tf ARQ.tar ; do tar -xOf ARQ.tar $i | gzip -dc | ./meufiltro; done | gzip > filtrado.txt.gz


quarta-feira, 4 de setembro de 2013

Mac OS X - Apache e PHP

Em ambientes que utilizem Mac OS X:

Apache

Programa apachectl (rodado em modo super usuário / root) controla o serviço do Apache:
apachectl start - Inicia o serviço
apachectl stop - Para o serviço
apachectl restart - Para e inicia o serviço

Diretório de instalação (normalmente):

/etc/apache2

Diretório de páginas:

/Library/WebServer/Documents - Páginas
/Library/CGI-Executables - Scripts CGI

Arquivo de Configuração:

/etc/apache2/httpd.conf

Atenção: Qualquer alteração feita no arquivo de configuração do Apache (como  por exemplo, ativação do PHP) requer que o serviço Apache seja restartado (sudo apachectl restart)

Acesso ao servidor

http://localhost

Criação de VirtualHosts (Servidores Virtuais)

1) Alterar o arquivo de configuração do Apache (sudo vi /etc/apache2/httpd.conf), retirando o comentário da linha Include /private/etc/apache2/extra/httpd-vhosts.conf

2) Editar o arquivo de VirtualHosts (sudo vi /etc/apache2/extra/httpd-vhosts.conf), incluindo a configuração do novo servidor. 

<VirtualHost *:80>
    DocumentRoot "<caminho/para/o/site>" 
    ServerName <nome do site> 
    ErrorLog "<caminho/arquivo/log/erro>" 
    CustomLog "<caminho/arquivo/log/acesso>" common 
    <Directory "<caminho/para/o/site>" >
        AllowOverride All 
        Order allow,deny 
        Allow from all
    </Directory>
</VirtualHost>


Exemplo:

<VirtualHost *:80>
    DocumentRoot "/Users/eu/Documents/workspace/dev" 
    ServerName eu.local 
    ErrorLog "/private/var/log/apache2/eu.local-error_log" 
    CustomLog "/private/var/log/apache2/eu.local-access_log" common 
    <Directory "/Users/eu/Documents/workspaces/dev">
        AllowOverride All 
        Order allow,deny 
        Allow from all
    </Directory>
</VirtualHost>

3) Incluir a seguinte linha ao arquivo de hosts (sudo vi /etc/hosts):

127.0.0.1     <server_name>

Exemplo:

127.0.0.1     eu.local

4) Restartar o apache e limpar o cache:
sudo apachectl restart
sudo dscacheutil -flushcache

Observação sobre permissão: O usuário do apache (normalmente _www) deve ter permissão no diretório onde se encontram as páginas.

PHP

1) Alterar o arquivo de configuração do Apache (sudo vi /etc/apache2/httpd.conf), retirando o comentário da linha LoadModule php5_module libexec/apache2/libphp5.so

2) Restartar o apache:
sudo apachectl restart


Fonte: http://jason.pureconcepts.net/2012/10/install-apache-php-mysql-mac-os-x/

terça-feira, 27 de agosto de 2013

Linux - Acesso remoto a Filesystem - SSHFS

Segundo o Wikipedia: " SSHFS (SSH Filesystem) is a filesystem client to mount and interact with directories and files located on a remote server or workstation. The client interacts with the remote file system via the SSH File Transfer Protocol (SFTP), a network protocol providing file access, file transfer, and file management functionality over any reliable data stream that was designed as an extension of the Secure Shell protocol (SSH) version 2.0." 

Ou seja, para acessar um FileSystem remoto em ambiente Linux, pode-se usar o SSHFS, com a implementação do FUSE (Filesystem in Userspace).

Para habilitar o FUSE, deve-se instalá-lo via YUM (ou outro mecanismo de instalação) ou ainda via download no site (Fuse).

Deve-se também instalar o aplicativo para acesso (SSHFS) que também pode ser inatalado via YUM (ou novamente através de outro mecanismo de instalação) ou também diretamente do site - Fuse/SSHFS.

Exemplo
sudo yum install fuse sshfs

Deve-se então habilitar o FUSE ao Kernel, usando o comando modprobe;

Exemplo
sudo modprobe fuse

A partir deste momento, para acessar o filesystem de outro servidor, basta usar o comando ssfhs conforme abaixo:

sshfs <usuário> @<ip remote>:<path/to/filesystem> <path/to/mount>

onde:
<usuário> - Usuário de acesso ao servidor
<ip remote> - Endereço IP do servidor
<path/to/filesystem> - Caminho (path) do diretório comartilhado
<path/to/mount> - Caminho (path) onde o FileSystem será montado



Linux - Criação de usuários / Grupos - Via Prompt

A criação de usuários e grupos, bem como a alteração de usuários, via prompt, pode ser feita com os seguintes comandos:

Criação de Grupo
groupadd <grupo>

Criação de Usuário em um grupo
useradd -g <grupo> <usuário>

Alteração de senha do usuário
passwd <usuário>

Adicionar usuário a outro grupo
usermod -a -G <grupo> <usuário>




quarta-feira, 14 de agosto de 2013

CentOS - EPEL

Para uma instalação de distribuição baseada em Red Hat Enterprise Linux (RHEL), como CentOS,  é sempre legal instalar o acesso ao repositório Extra Packages for Enterprise Linux (EPEL), que contém uma série de pacotes que não fazem parte da distribuição original mas que facilitam (e muito) a vida dos usuários.

Para instalar: Obter e instalar o arquivo RPM com o repsoitório referente a versão do Server usada. Por exemplo, para versões 6.* usar o arquivo EPEL Release 6

Para maiores informações visite: http://fedoraproject.org/wiki/EPEL

CentOS - Habilitar NTFS

Para habilitar o uso de filesystems do tipo NTFS no CentOS é necessário a instalação de um repositório alternativo (EPEL - Extra Packages for Enterprise Linux) e depois fazer o download do pacote ntfs-3g. Veja o passo-a-passo:

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh epel-release-6-8.noarch.rpm
# yum install ntfs-3g


quinta-feira, 8 de agosto de 2013

Linux - Geração de Chaves (keys) para SSH

Para acessar uma máquina (servidor) linux sem precisar informar senha, pode-se criar um 'par' de chaves ssa-ssh para efetuar o acesso. Vamos ao passo-a-passo simples:

1) Na máquina de origem deve ser criado o 'par' de chaves, para tanto usar o comando ssh-keygen (para maiores informações do mesmo, acesse man ssh-keygen)
$ ssh-keygen

As chaves serão geradas no diretório /home/<user>/.ssh (Arquivos id_rsa e id_rsa.pub)

2) Copiar (transferir) o arquivo id_rsa_pub para a máquina de destino (ftp, scp, rsync)

Exemplo:
$ rsync -av /home/usuario/.ssh/id_rsa.pub usuario@meu.servidor:/home/usuario/.ssh/ 

3) Na máquina (servidor) de destino, incluir as informações do arquivo transferio (id_rsa.pub) ao arquivo /home/<user>/.ssh/authorized_keys . Se o arquivo não existir, criar um arquivo com o conteúdo do arquivo transferido. Caso o arquivo já exista, apendar ao mesmo o conteúdo do arquivo.

Exemplo:
$ cp /home/usuario/.ssh/id_rsa.pub /home/usuario/.ssh/authorized_keys

4) Se necessário, ao iniciar a conexão a partir da máquina (servidor) origem, incluir ao programa de conexão (ssh, scp, rsync) a opção -i <caminho_para_o_arquivo_com_a _chave_privada>. Exemplo:

$ scp -i /home/usuario/.ssh/id_rsa teste.txt usuario@meu.servidor:/meu_diretorio/

segunda-feira, 5 de agosto de 2013

Bios Asus / Aptio

Sufoco, alterar a BIOS do meu novo notebook Asus K45VM para poder fazer o boot pelo CD. Para acessar a BIOS (Software Aptio) precisava pressionar F2 no momento certo do boot da máquina, senão o Windows carregava automaticamente. Bom passado este sufoco, basta ir na aba BOOT e alterar os parâmetros:

Launch CSM Enabled
Launch PXE OpRom Enabled

Na pasta Security, alterar o Secure Boot Control para Disabled

A propósito, os valores DEFAULT são:

[Boot]
Fast Boot Enabled
Launch CSM Disabled

[Security]
Secure Boot Control Enabled

segunda-feira, 22 de julho de 2013

Linux - Tratamento de Exit Status / Return Code

O bash guarda a informação a respeito da execução de um programa na variável de ambiente $? logo após a execução da mesma. Avaliando o conteúdo da mesma é possível verificar se uma determinada execução terminou com sucesso ou não.

Exemplo:

somecommand  argument1 argument2
RETVAL=$?
[ $RETVAL -eq 0 ] && echo Success
[ $RETVAL -ne 0 ] && echo Failure

Linux - Listar Arquivos de um Diretório

Alguns exemplos para listar nomes de arquivos, com e sem path

$ ls workspace/*.c
workspace/teste_ponteiro_array.c  workspace/teste_ponteiro.c
$ ls -1 workspace/*.c
workspace/teste_ponteiro_array.c
workspace/teste_ponteiro.c
$ find workspace/*.c -type f -printf '%f\n'
teste_ponteiro_array.c
teste_ponteiro.c

quarta-feira, 26 de junho de 2013

Validar Quantidade de Campos(Colunas) em Arquivo Delimitado

Script AWK para verificar se um determinado arquivo possui a quantidade de colunas esperada

cat <arquivo> | awk 'BEGIN{FS="<separador>"};NF!=<nro_colunas> {print NF , $0}' 

onde:
<arquivo> - Arquivo que deverá ser validado
<separador> - Separador (delimitador) de campos (colunas) do <arquivo>
<nro_colunas> - Número de campos (colunas) esperado no arquivo

Exemplo;

cat teste.csv |  awk 'BEGIN{FS=";"};NF!=10 {print "linha", NR, "colunas", NF , $0}' 

No exemplo acima, será (ão) direcionadas a saída padrão (tela)  a(s) linha(s) que não tiver(em) 10 colunas, informando a quantidade de colunas encontrada.

Para arquivos posicionais (sem delimitadores), a sintaxe fica:

cat <arquivo> | awk 'BEGIN{FS=""};NF!=<tam_reg> {print NF , $0}' 

onde:
<arquivo> - Arquivo que deverá ser validado
<tam_reg> - Tamanho da Linha

terça-feira, 25 de junho de 2013

Executar Processos em Paralelo com termino Sincrono

Situação 1
Para executar vários processos em paralelo e ao final de todos executar um processo final, pode-se utilizar a instrução bash wait

Sintaxe
wait

Exemplo:
#!/bin/sh
./pgm1 &
echo "Pgm1 em execucao"
./pgm2 &
echo "Pgm2 em execucao"
wait
echo "Termino de ambos os processos"



Situação 2
Executar em paralelo vários processos, com base em um diretório de entrada e ao final de todos os processos, executar um novo processo. Para esta situação, pode-se recorrer a utilização de um pequeno script awk, além de um artifício de criar um arquivo ao final de todos os processos com a instrução bash wait.

Exemplo de script:

#!/bin/sh
DIR_ENTRADA=${1}
rm -fr "processo.ok"
ARQ_LOG_PROGRAMA="${PWD}/script.log"
DATA_EXEC=$(date "+%x-%X")
echo " " > ${ARQ_LOG_PROGRAMA}
echo "1) ${DATA_EXEC} -> Inicio da execucao" >> ${ARQ_LOG_PROGRAMA}

ls ${DIR_ENTRADA} | awk -v e=${DIR_ENTRADA} -v l=${ARQ_LOG_PROGRAMA} '{print ".programa " e "/" $0 ".txt >> " l " & "} END { print "wait;echo ok > processo.ok"}' | bash

while [ ! -f "processo.ok" ]; do
echo "Processando..." >> ${ARQ_LOG_PROGRAMA}
sleep 10
done

DATA_EXEC=$(date "+%x-%X")
echo "2) ${DATA_EXEC} -> Processamento em paralelo encerrado. Início do processo consolidador." >> ${ARQ_LOG_PROGRAMA}
./consolidador.sh

DATA_EXEC=$(date "+%x-%X")
echo "3) ${DATA_EXEC} -> Termino do Processamento" >> ${ARQ_LOG_PROGRAMA}

Agradecimentos a: Jorge Amorim e Leonardo Rombesso !

Remoção de NEWLINE no meio de arquivo

Script AWK para remover caracteres 'newline' do meio de uma linha, a partir de um arquivo compactado e gerando um novo arquivo compactado:

gzip -dc arquivo.Z | awk -F'^' 'BEGIN{c=1}$0!=""{printf("%s",$0); if(NF+c>=243){printf("\n");c=1}else{c=NF}}' | gzip > arquivosaida.txt.gz

Versão em Perl

gzip -dc arquivo.Z | perl -e '$c=1;while(<STDIN>){$_=~s/\r|\n//g; if($_!=""){ @a = split("\\^", $_); print $_; if(($#a)+$c>=243){print "\n";$c=1}else{$c=$#a+1} }}' | gzip > arquivosaida.txt.gz


Agradecimentos ao sempre presente (nerd) Jorge Amorim !!

quinta-feira, 20 de junho de 2013

MySQl - Sessões

Para visualizar as sessões no MySQL, usar o comando SHOW PROCESSLIST

Sintaxe;

SHOW [FULL] PROCESSLIST

Para deletar algum processo, usar o comando KILL

Sintaxe:

kill <nro_processo>;

Exemplo:

kill 1;

sexta-feira, 14 de junho de 2013

Oracle - SQL Plus - Tabs

A ferramenta SQL*Plus da Oracle tem por default, substituir diversos espaços/brancos (spaces) de um resultado de uma query por tabs (\t) vide http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm#i2683445

"SET TAB {ON | OFF}
Determines how SQL*Plus formats white space in terminal output. OFF uses spaces to format white space in the output. ON uses the TAB character. TAB settings are every eight characters. The default value for TAB is system dependent."

Para desativar isto, deve-se colocar antes da execução do SELECT a opção SET TAB OFF

Para outros parâmetros do SQL*Plus, consulte  SET System Variable Summary (http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12040.htm)

AWK - Checa tamanho de linha

Utilitário AWK para verificar o tamanho das linhas de um arquivo, imprimindo o número da linha(registro) e o tamanho, toda vez que ocorre uma mudança:

awk '{ if (length($0) != max) {max=length($0); print "Linha " NR " " max; }}' <arquivo>

Exemplos:

awk '{ if (length($0) != max) {max=length($0); print "Linha " NR " " max; }}' teste.txt

cat teste.txt | awk '{ if (length($0) != max) {max=length($0); print "Linha " NR " " max; }}' 

Programa C - Compilação de Programas via prompt

Para compilar programas 'C' em distribuições Fedora/CentOs (ou outras) usando o compilador/linkeditor gcc (GNU Compiler Collection, http://gcc.gnu.org/) utilizar, preferencialmente, a seguinte sintaxe:

gcc -Wall -o <executavel> <fonte.c>

Exemplo:

gcc -Wall -o teste teste.c

Caso o programa use a biblioteca Math.h, incluir o parâmetro -lm para linkeditar com esta biblioteca:

gcc -Wall -lm -o <executavel> <fonte.c>

Exemplo:

gcc -Wall -lm -o teste teste.c

Outros parâmetros comuns:
-c : Apenas compila o programa, mas não faz a linkedição. Para linkeditar então deve-se chamar novamente o gcc, passando com a seguinte sintaxe:
gcc -o <executavel> <objeto>

exemplo:
1) Compilação
gcc -c -o teste.o teste.c

2) Linkedição
gcc -o teste teste.o

-glevel (normalmente -g3): Inclui informação completa de Debug, para uso com o GDB (GNU Debugger (http://www.gnu.org/software/gdb/)




Programa C - Utilização da Biblioteca Math

Em distribuições Fedora/CentOs, quando se quer utilizar a biblioteca MATH (math.h / libm) em programas "C", por algum motivo o linkeditor normalmente não encontra esta biblioteca por default. Neste caso, é necessário informar ao compilador no momento da compilação para utilizá-la:

gcc -o <executavel> -lm <fonte>

Exemplo:

gcc -o teste -lm teste.c

Quando usando a IDE do Eclipse, deve-se entrar nas propriedades do projeto (ALT-ENTER), ir na opção C/C++ Build, seção Settings, GCC C Linker, Libraries, incluir a Library (-l) m.


segunda-feira, 20 de maio de 2013

Execução de Programas JAVA JAR

Para executar programas java cm extensão jar (arquivo compactado) usar o comando java com o parâmetro -jar.

Sintaxe:

java -jar <arquivo.jar>

sexta-feira, 17 de maio de 2013

Oracle - Sessions

Para visualizar as sessões do Oracle, podemos utilizar a view V$SESSION.

Exemplo:

select sid, status from V$SESSION;

Para mais informações:

http://docs.oracle.com/cd/B19306_01/server.102/b14237/dynviews_2088.htm

quarta-feira, 15 de maio de 2013

Linux - Medição de Tempo e Consumo de Execução

No ambiente Linux, para fazer a medição de tempo e consumo de uma aplicação, pode usar o comando time antes da chamada do aplicativo.

Sintaxe:

time <aplicativo>

Exemplo:

time ./meu_programa

O output deste comando também pode ser formatado utilizando o parâmetro TIMEFORMAT.

Sintaxe:

TIMEFORMAT="" time <aplicativo>

Exemplo:

TIMEFORMAT="" time ./meu_programa

segunda-feira, 13 de maio de 2013

C - Suporte a Arquivos com mais de 4Gbytes

Quando se utiliza programas "C", compilados com GCC,  para leitura de arquivos com mais de 4 Gigabytes deve-se utilizar os parâmetros :

-D_LARGEFILE_SOURCE=1 -D_FILE_OFFSET_BITS=64


segunda-feira, 29 de abril de 2013

"C" - Conexão MySQL

Pré-requisitos
mysql (client)
mysql-devel

A compilação de programas com acesso a bibliotecas do MySQL necessitam de alguns parâmetros especiais. Estes parâmetros podem ser obtidos através da execução do script 'mysql_config' que faz parte do pacote mysql-devel. Para compilar o programa, usar a seguinte sintaxe:
gcc -o <output> $(mysql_config --cflags) <fonte.c> $(mysql_config --libs)

exemplo:
gcc -o consulta_mysql $(mysql_config --cflags) consulta_mysql.c $(mysql_config --libs)

Exemplo de programa para conexão ao MySQL

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   MYSQL *conexao;
   MYSQL_RES *res;
   MYSQL_ROW linhas;
   MYSQL_FIELD *campos;
   char query[]="select * from <tabela>;";
   int i;

   char *server = "<servidor>";
   char *user = "<usuario>";
   char *password = "<senha>";
   char *database = "<banco>";
   unsigned int port = <porta>;

   conexao = mysql_init(NULL);

   /* Connect to database */
   if (!mysql_real_connect(conexao, server,
         user, password, database, port, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conexao));
      exit(EXIT_FAILURE);
   }

   /* send SQL query */
   if (mysql_query(conexao, query)) {
      fprintf(stderr, "%s\n", mysql_error(conexao));
      exit(EXIT_FAILURE);
   }

   res = mysql_store_result(conexao);
   
   if (res)
   {
     campos = mysql_fetch_fields(res);
     for (i=0; i < mysql_num_fields(res); i++)
     {
       printf("%s", (campos[i]).name);
       if (mysql_num_fields(res) > 1)
          printf("\t");
     }
     
     printf("\n");
     
     while ((linhas = mysql_fetch_row(res)) != NULL)
     {
       for (i=0; i < mysql_num_fields(res); i++)
         printf("%s\t", linhas[i]);
       printf("\n");
     }
   }

   /* close connection */
   mysql_free_result(res);
   mysql_close(conexao);
}

quarta-feira, 24 de abril de 2013

Programas C : Acessar banco de dados Oracle - Linux

Pré-requisitos:
* Obrigatórios (x86 - http://www.oracle.com/technetwork/topics/linuxsoft-082809.html e x86_64 - http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html)
  • Oracle Instant Client Package - Basic (All files required to run OCI, OCCI, and JDBC-OCI applications) - Bibliotecas que permitem o acesso ao banco oracle
  • Oracle Instant Client Package - SDK (Additional header files and an example makefile for developing Oracle applications with Instant Client) - Arquivos source/headers para usar nos programas "C"
* Opcionais
  • Oracle Instant Client Package - SQL*Plus(Additional libraries and executable for running SQL*Plus with Instant Client) - Possibilita a conexão ao Oracle através do SQL *PLUS
TNSNAME
Deve existir o arquivo TNSNAME com as conexões que serão utilizadas. Este arquivo normalmente deverá ficar em /etc/tnsnames.ora


Conector C - Oracle

Ocilib - http://orclib.sourceforge.net/
Após efetuar o download e descompactar o arquivo, use esta dica importante para a instalação:
sudo ./configure --with-oracle-headers-path=<caminho para onde estão os includes do sdk oracle> --with-oracle-home=<caminho do oracle home/instant client onde estão as bibliotecas do oracle>

Exemplo:
sudo ./configure --with-oracle-headers-path=/usr/lib/instantclient_10_2/sdk/include --with-oracle-home=/usr/lib/instantclient_10_2/

Depois:
sudo make
sudo make install

Importante: as variáveis de ambiente ORACLE_HOME e LD_LIBRARY_PATH devem estar setadas !
ORACLE_HOME=<caminho do oracle home/instant client onde estão as bibliotecas do oracle>
LD_LIBRARY_PATH=<caminho do oracle home/instant client onde estão as bibliotecas do oracle>:<caminho onde foram instaladas as bibliotecas do ocilib)
USER_LIBS=<caminho onde está instalado o ocilib>


Exemplos:
(32 bits)
ORACLE_HOME=/usr/lib/instantclient_10_2
LD_LIBRARY_PATH=/usr/lib/instantclient_10_2:/usr/local/lib

(64 bits)
ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client64
LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.4/client64/lib:/usr/local/lib:/usr/local/lib64
USER_LIBS=/usr/local
Para compilar/linkeditar programas

Os seguintes parâmetros deverão ser usados
Compilação:
(32 bits)
-I$USER_LIBS/include 
Linkedição
-L/$ORACLE_HOME -lclntsh -L$USER_LIBS/lib -locilib

Exemplo via linha de comando:
gcc conecta_oracle.c -o conecta_oracle -I$USER_LIBS/include -L/$ORACLE_HOME -lclntsh -L$USER_LIBS/lib -locilib


(64 bits)
Os seguintes parâmetros deverão ser usados
Compilação:
-I$USER_LIBS/include 
Linkedição
-L$ORACLE_HOME/lib -lclntsh -L$USER_LIBS/lib -locilib

Exemplo via linha de comando:
(32 bits)
gcc conecta_oracle.c -o conecta_oracle -I$USER_LIBS/include -L$ORACLE_HOME -lclntsh -L$USER_LIBS/lib -locilib

(64 bits)

gcc conecta_oracle.c -o conecta_oracle -I$USER_LIBS/include -L$ORACLE_HOME/lib -lclntsh -L$USER_LIBS/lib -locilib

Exemplo de programa "C" para acessar banco de dados oracle:

#include "ocilib.h"

int main(void)
{
    OCI_Connection *cn;
    OCI_Statement* st;
    OCI_Resultset* rs;

    if (!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT))
        return EXIT_FAILURE;

    cn = OCI_ConnectionCreate("VEDBD02_205", "usr_r2s2", "r2s2", OCI_SESSION_DEFAULT);

    printf("Server major    version : %i\n",   OCI_GetServerMajorVersion(cn));
    printf("Server minor    version : %i\n",   OCI_GetServerMinorVersion(cn));
    printf("Server revision version : %i\n\n", OCI_GetServerRevisionVersion(cn));
    printf("Connection      version : %i\n\n", OCI_GetVersionConnection(cn));

    st = OCI_StatementCreate(cn);

    OCI_ExecuteStmt(st, "select id_sdr, dat_ini_vig, dat_fim_vig, vlr_sdr, dat_sdr from tb_groa_valor_sdr order by 1");

    rs = OCI_GetResultset(st);

    while (OCI_FetchNext(rs))
    {
        printf("%i - %s - %s - %s - %s\n", OCI_GetInt(rs, 1), 
            OCI_GetString(rs,2), OCI_GetString(rs,3),
            OCI_GetString(rs,4), OCI_GetString(rs,5));
    }

    OCI_Cleanup();

    return EXIT_SUCCESS;
}

terça-feira, 26 de março de 2013

Uso de Funções UDF no MySQL

Arquivos ou bibliotecas UDF - DLL em ambiente Windows e SO em ambiente Unix/Linux - contém funções, normalmente escritas em linguagem 'C' e que podem ser usadas em queries no MySQL.

O link http://dev.mysql.com/doc/refman/5.0/en/adding-functions.html fala a respeito das UDFs e o link  http://dev.mysql.com/doc/refman/5.1/en/udf-compiling.html explica como compilar uma biblioteca UDF nos ambientes Unix/Linux e Windows usando usando o make/cmake.

Para criar estes arquivos no Windows usando o Visual Studio, cabem algumas dicas:
1) Pré-requisitos:

  • Source do Mysql (diretório include);
  • SDK do Microsoft

2) Criar uma nova solução/projeto vazia (empty projetct)
3) Em propriedades do projeto (verificar se a configuração está habilitada em 'all configurations'):

  •  Project Defaults/Configuration type - Dynamic Library (.dll)
  • C/C++/General/Aditional Include Directories - Incluir os diretórios do include do MySQL e do include do Microsoft SDK
  • C/C++/Preprocessor/Preprocessor Definitions - Incluir a diretiva HAVE_DLOPEN
  • Linker/General/Additional library Directories - Incluir o diretório lib do Microsoft SDK
  • Linker/Input/Module Definition File - Referenciar o arquivo com as definições da biblioteca (arquivo .def)

Ao instalar a biblioteca criada em um servidor Windows não esquecer:
1) Colocar a DLL no diretório indicado pelo parâmetro plugin_dir (comando show variables like 'plug%')
2) Instalar o runtime do Visual C/C++ referente a versão em que foi compilado o arquivo DLL

Algumas dicas podem ser vistas - http://rpbouman.blogspot.com.br/2007/09/creating-mysql-udfs-with-microsoft.html

segunda-feira, 25 de março de 2013

Funções UDF no MySQL compiladas em Visual C/C++

Para usar funções UDF no MySQL geradas a partir de compilações Visual Studio (C/C++) é necessário que seja instalado no servidor MySQL o arquivo runtime (Redistributable Package ) respectivo a versão do Visual Studio utilizado na geração da dll.

Alguns comuns:
Visual Studio 2005 - http://www.microsoft.com/en-us/download/details.aspx?id=3387
Visual Studio 2008 - http://www.microsoft.com/en-us/download/details.aspx?id=29
Visual Studio 2010 - http://www.microsoft.com/en-us/download/details.aspx?id=5555

A inexistência do arquivo runtime não permite a instalação (criação) das funções, gerando o erro MySQL 1126.