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

Claudio Polegato Junior cpolegatojr.asterisk em gmail.com
Terça Outubro 24 14:23:41 BRT 2006


Olá,

   Esqueci de um detalhe, troque o nome de arquivo "/var/log/kdm.log" por "/var/log/asterisk/queue_log".


   Abraços.






#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// Número máximo de campos
#define MAX_CAMPOS 10
// Separador entre cada campo
#define DELIMITADOR '|'
// Tamanho máximo da cláusulo SQL Insert (100 kB)
#define MAX_INSERT 102400

// Variáveis para controle de Conexão com o BD
static PGconn *conn;
static PGresult *result;

// Variável que aponta para cada campo encontrada em uma linha
static char* campos[MAX_CAMPOS];
static int campos_lidos;

// Função que faz com que a variável acima tenha os apontamentos corretos
int Apontar_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;
}

// Lê um arquivo e o coloca na memória
int Por_Arquivo_Memoria(char **memoria){
   FILE *arquivo;
   int tamanho;

   if ((arquivo = fopen("/var/log/asterisk/queue_log", "rt")) == NULL){
     perror("Erro");
     return 0;
   }
   fseek(arquivo, 0, SEEK_END);
   tamanho = ftell(arquivo);
   rewind(arquivo);
   *memoria = (char*)malloc(tamanho + 1);
   fread(*memoria, tamanho, 1, arquivo);
   fclose(arquivo);
   (*memoria)[tamanho] = '\0';
   return 1;
}

// Realiza a conexão com o BD
int Conectar(){
   conn = PQconnectdb("host=localhost "
                      "user=asterisk "
                      "password=asterisk "
                      "dbname=asterisk"
                     );
   if(PQstatus(conn) != CONNECTION_OK) {
     printf("Falha na conexão. Erro: %s", PQerrorMessage(conn));
     PQfinish(conn);
     return 0;
   }
   printf("Conexão com o banco efetuada com sucesso. ");
   return 1;
}

// Insere um registro, com os campos detectados, no DB
int Inserir(int campos_lidos){
   char inserir[MAX_INSERT], *c;
   strncpy(inserir, "Insert Into Queue_Log Values ('", 31);
   c = inserir + 31;
   for (i=0; i<campos_lidos-1; i++){
     printf("Campo %2i: %s\n", i, campos[i]);
     strncpy(c, campos[i], campos[i+1]-campos[i]-1);
     c += campos[i+1]-campos[i]-1;
     strncpy(c, "', '", 4);
   }
   printf("Campo %2i: %s\n", i, campos[i]);
   strcat(c, campos[i]);
   strcat(c, "')");

   printf("\nSQL: %s\n", inserir);
   result = PQexec(conn, inserir);

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

int main(int argc, char* argv[]){
   char *memoria, *inicio, *delimitador;

   // Se tiver problemas com o arquivo ou com a conexão, termina.
   if (!Por_Arquivo_Memoria(&memoria) || !Conectar())
     return -1;

   inicio = memoria;
   delimitador = strchr(inicio, '\n');
   while (delimitador){
     *delimitador = '\0';
     printf("\n*******************\nLinha: %s\n\n", inicio);
     campos_lidos = Preencher_Campos(inicio);
     // Insere os dados no BD
     Inserir();

     inicio = delimitador + 1;
     delimitador = strchr(inicio, '\n');
   }
   return 0;
}

-- 
Atenciosamente

            Claudio Polegato Junior

            Engenheiro Autônomo - Ribeirão Preto e Região
            Mestre em Física Aplicada à Medicina e Biologia - USP
            Engenheiro Computacional - USP
            Engenheiro Eletrônico - USP

Um peregrino de problemas; Um pergaminho de soluções!


-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : teste_campos.c
Tipo  : text/x-c++src
Tam   : 3419 bytes
Descr.: não disponível
Url   : http://listas.asteriskbrasil.org/pipermail/asteriskbrasil/attachments/20061024/a0bd317b/teste_campos.bin


Mais detalhes sobre a lista de discussão AsteriskBrasil