[AsteriskBrasil] RES: RES: ENC: queue_log -> PostgreSQL rotina em C...sugestao.

j u n i o u junior em dssnet.com.br
Sexta Outubro 27 12:04:50 BRT 2006


Segue a rotina funcionando:

- não ficou assim uma brastemp.. mas..
- Carrega o arquivo /var/log/queue_log em uma tabela PostgreSQL..
- É necessário criar a tabela no BD
- Alterar o logger.c para informar data e hora do evento no primeiro campo |
- Obrigado a Cláudio Polegato.. 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libpq-fe.h>
#include <time.h>

/*###########################################################*/
/* Conversor do queue_log para PostgreSQL                    */
/* Data: 20-10-2006                                          */
/* Porto Velho - RO  junior em dssnet.com.br                    */
/*###########################################################*/


#define MAX_CAMPOS 11
#define DELIMITADOR '|'
char* campos[MAX_CAMPOS];

int Preencher_Campos(char *linha)
{
    char *inicio, *delimitador;
    int campo_atual = 0;
    inicio = linha;
    delimitador = strchr(inicio, DELIMITADOR);
       while (delimitador && campo_atual < MAX_CAMPOS-1)
        {
          *delimitador = '\0';
          campos[campo_atual++] = inicio;
          inicio = delimitador + 1;
          delimitador = strchr(inicio, DELIMITADOR);
        }
    campos[campo_atual++] = inicio;
    return campo_atual;
 }

/*Objeto de conexão*/
PGconn *conn = NULL;
/*Ponteiro de resultado*/
PGresult *result;

int main()
{
/*realiza a conexão*/
conn = PQconnectdb("host=localhost user=asterisk password=asterisk
dbname=asterisk");

if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com o banco efetuada com sucesso. ");
}
else
{
printf("Falha na conexão. Erro: %s", PQerrorMessage(conn));
PQfinish(conn);
return -1;
}


//Delete lixo da tabela...
           result = PQexec(conn, "DELETE FROM queue_log WHERE evento =
'CONFIGRELOAD'");

           if(!result)
            { printf("Erro executando query."); }
            else
             { switch(PQresultStatus(result)) 
               {
                 case PGRES_EMPTY_QUERY:
                  printf("Nenhuma alteracao.");
                  break;
                 case PGRES_FATAL_ERROR:
                  printf("Erro na query: %s ",
PQresultErrorMessage(result));
                  break;
                 case PGRES_COMMAND_OK:
                  printf("%s linhas afetadas. ", PQcmdTuples(result));
                  break;
                 default:
                  printf("Query executada sem retorno.");
                  break;
               }
             }


FILE *arquivo;
char consulta[1024];
char string[1024]; //string onde ficara a linha
int x = 0;
int campos_lidos;
char *delimitador, *inicio;
int aux1;

//#define DATE_FORMAT "%Y-%m-%d %T"
//time_t t;
//struct tm tm;
//char date[256];
//time(&t);
//localtime_r(&t, &tm);
//strftime(date, sizeof(date), DATE_FORMAT, &tm);

arquivo = fopen("/var/log/asterisk/queue_log", "rt");
while (! feof(arquivo))  
{
while(fgets(string, sizeof(string), arquivo)) //le arquivo
   {  
     delimitador = strchr(string, '\n');
      while (delimitador)
        {
            *delimitador = '\0';
             printf("\n\n\nLinha: %s\n\n", string);
             campos_lidos = Preencher_Campos(string);
             //printf("Campos LIDOS: %d\n Data: %s ", campos_lidos, date);
             printf("Campos LIDOS: %d\n ", campos_lidos);
             int i;
             for (i=0; i<campos_lidos-1; i++)
             printf("Campo %2i: %s\n", i, campos[i]);
           //getchar();
            strcpy(consulta,"");
           strcat(consulta,"INSERT INTO queue_log  values ('");
           for (i=0; i< campos_lidos-1; i++)
            {
               strcat(consulta,campos[i]);
               strcat(consulta, "','");
               aux1 = i+1;      
            }
            strcat(consulta,campos[aux1]);
            strcat(consulta, "')");
          result = PQexec(conn, consulta);
           if(!result)
            { printf("Erro executando query."); }
            else
             { switch(PQresultStatus(result)) 
               {
                 case PGRES_EMPTY_QUERY:
                  printf("Nenhuma alteracao.");
                  break;
                 case PGRES_FATAL_ERROR:
                  printf("Erro na query: %s ",
PQresultErrorMessage(result));
                  break;
                 case PGRES_COMMAND_OK:
                  printf("%s linhas afetadas. ", PQcmdTuples(result));
                  break;
                 default:
                  printf("Query executada sem retorno.");
                  break;
               }
           inicio = delimitador + 1;
           delimitador = strchr(inicio, '\n');
        }
    x = x+1;
   }
}
fclose(arquivo); //fecha arquivo
/*Libera objeto da query*/
PQclear(result);
}
/*Verifica se a conexão está aberta e a encerra*/
if(conn != NULL)
PQfinish(conn);
}



-----Mensagem original-----
De: asteriskbrasil-bounces em listas.asteriskbrasil.org
[mailto:asteriskbrasil-bounces em listas.asteriskbrasil.org] Em nome de j u n i
o u
Enviada em: quarta-feira, 25 de outubro de 2006 18:41
Para: asteriskbrasil em listas.asteriskbrasil.org
Assunto: [AsteriskBrasil] RES: ENC: queue_log -> PostgreSQL rotina em
C...sugestao.

Polegato..
Consegui fazer a rotina funcionar direito
Obrigado pela ajuda.

Att;
Jr.

-----Mensagem original-----
De: asteriskbrasil-bounces em listas.asteriskbrasil.org
[mailto:asteriskbrasil-bounces em listas.asteriskbrasil.org] Em nome de j u n i
o u
Enviada em: terça-feira, 24 de outubro de 2006 14:58
Para: asteriskbrasil em listas.asteriskbrasil.org
Assunto: [AsteriskBrasil] ENC: queue_log -> PostgreSQL rotina em
C...sugestao.


Reenvio..

-----Mensagem original-----
De: j u n i o u [mailto:junior em dssnet.com.br] 
Enviada em: terça-feira, 24 de outubro de 2006 14:55
Para: 'asteriskbrasil em listas.asteriskbrasil.org'
Assunto: RES: [AsteriskBrasil] queue_log -> PostgreSQL rotina em
C...sugestao.

Polegato..
Esta ai o bicho funcionando... mas esta parando na primeira linha e so
insere o primeiro registro na tabela.
Ele não entra no loop por causa do " result = PQexec(conn, consulta); "
...??? é isso?
Valeu pela força apesar da dúvida agora ser meio "off". 

Att:.
Jr.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libpq-fe.h>

#define MAX_CAMPOS 10
#define DELIMITADOR '|'
char* campos[MAX_CAMPOS];

int Preencher_Campos(char *linha)
{
    char *inicio, *delimitador;
    int campo_atual = 0;
    inicio = linha;
    delimitador = strchr(inicio, DELIMITADOR);
       while (delimitador && campo_atual < MAX_CAMPOS-1)
        {
          *delimitador = '\0';
          campos[campo_atual++] = inicio;
          inicio = delimitador + 1;
          delimitador = strchr(inicio, DELIMITADOR);
        }
    campos[campo_atual++] = inicio;
    return campo_atual;
 }

/*Objeto de conexão*/
PGconn *conn = NULL;
/*Ponteiro de resultado*/
PGresult *result;

int main()
{
/*realiza a conexão*/
conn = PQconnectdb("host=localhost user=asterisk password=asterisk
dbname=asterisk");

if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com o banco efetuada com sucesso. ");
}
else
{
printf("Falha na conexão. Erro: %s", PQerrorMessage(conn));
PQfinish(conn);
return -1;
}
FILE *arquivo;
char consulta[1024];
char string[1024]; //string onde ficara a linha
int x = 0;
int campos_lidos;
char *delimitador, *inicio;
int cons;
arquivo = fopen("/var/log/asterisk/queue_log", "rt");
while(fgets(string, sizeof(string), arquivo)) //le arquivo
   {  
     delimitador = strchr(string, '\n');
      while (delimitador)
        {
            *delimitador = '\0';
             printf("\n\n\nLinha: %s\n\n", string);
             campos_lidos = Preencher_Campos(string);
             printf("Campos Lidos: %d\n", campos_lidos);
             int i;
             for (i=0; i<campos_lidos; i++)
             printf("Campo %2i: %s\n", i, campos[i]);
           //getchar();

           // Sendo a variável "campos_lidos" especificando quantos campos
           // foram encontrados
           // E o vetor "campos" apontando para o início de cada campo
           // desta linha na memória terminados por '\0'

           // Aqui é contigo! ;-)
           
           strcpy(consulta,"");
           strcat(consulta,"INSERT INTO queue_log  values ('");
           for (i=0; i<campos_lidos; i++)
            {
               strcat(consulta,campos[i]);
               strcat(consulta, "','");      
            }
          
            strcat(consulta, "')");

           result = PQexec(conn, consulta);

           if(!cons)
            { printf("Erro executando query."); }
            else
             { switch(PQresultStatus(result)) 
               {
                 case PGRES_EMPTY_QUERY:
                  printf("Nenhuma alteracao.");
                  break;
                 case PGRES_FATAL_ERROR:
                  printf("Erro na query: %s ",
PQresultErrorMessage(result));
                  break;
                 case PGRES_COMMAND_OK:
                  printf("%s linhas afetadas. ", PQcmdTuples(result));
                  break;
                 default:
                  printf("Query executada sem retorno.");
                  break;
               }
           inicio = delimitador + 1;
           delimitador = strchr(inicio, '\n');
        }
     x = x+1;
     //printf("Linha:%d : %s",x, string); //imprime na tela as linhas
   }
fclose(arquivo); //fecha arquivo

/*Libera objeto da query*/
PQclear(result);
}

/*Verifica se a conexão está aberta e a encerra*/
if(conn != NULL)
PQfinish(conn);
}



----------------------------------------
Estação VoIP 2006
5 e 6 Dezembro
Curitiba PR
http://www.estacaovoip.com.br

_______________________________________________
LIsta de discussões AsteriskBrasil.org
AsteriskBrasil em listas.asteriskbrasil.org
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil

_______________________________________________
Acesse o  wiki AsteriskBrasil.org:
http://www.asteriskbrasil.org


__________ Informação do NOD32 IMON 1.1831 (20061024) __________

Esta mensagem foi verificada pelo NOD32 sistema antivírus
http://www.eset.com.br


----------------------------------------
Estação VoIP 2006
5 e 6 Dezembro
Curitiba PR
http://www.estacaovoip.com.br

_______________________________________________
LIsta de discussões AsteriskBrasil.org
AsteriskBrasil em listas.asteriskbrasil.org
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil

_______________________________________________
Acesse o  wiki AsteriskBrasil.org:
http://www.asteriskbrasil.org


__________ Informação do NOD32 IMON 1.1831 (20061024) __________

Esta mensagem foi verificada pelo NOD32 sistema antivírus
http://www.eset.com.br




Mais detalhes sobre a lista de discussão AsteriskBrasil