Changeset 247177137e6b22bd81c65d1120e06c4d14962d46

Show
Ignore:
Timestamp:
03/04/08 04:20:40 (6 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1204604440 +0000
git-parent:

[175b2609d0516d8ff9f0ffadfa78e3ff98d9ea83]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1204604440 +0000
Message:

move SQL statements to the conf file

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/stratcon.conf

    rdf5d455 r2471771  
    2020      <reconnect_maximum_interval>900000</reconnect_maximum_interval> 
    2121    </config> 
    22     <dbconfig> 
    23       <host>localhost</host> 
    24       <dbname>reconnoiter</dbname> 
    25       <user>reconnoiter</user> 
    26       <password>reconnoiter</password> 
    27     </dbconfig> 
    2822    <sslconfig> 
    2923      <key_file>test-strat.key</key_file> 
     
    3327    <noit address="127.0.0.1" port="34332" /> 
    3428  </noits> 
     29 
     30  <database> 
     31    <dbconfig> 
     32      <host>localhost</host> 
     33      <dbname>reconnoiter</dbname> 
     34      <user>reconnoiter</user> 
     35      <password>reconnoiter</password> 
     36    </dbconfig> 
     37    <statements> 
     38      <check><![CDATA[ 
     39        INSERT INTO stratcon.loading_dock_check 
     40                    (remote_address, whence, id, target, module, name) 
     41             VALUES ($1, 'epoch'::timestamptz + ($2 || ' seconds')::interval, 
     42                     $3, $4, $5, $6) 
     43      ]]></check> 
     44      <status><![CDATA[ 
     45        INSERT INTO stratcon.loading_dock_status 
     46                    (remote_address, whence, id, state, availability, 
     47                     duration, status) 
     48             VALUES ($1, 'epoch'::timestamptz + ($2 || ' seconds')::interval, 
     49                     $3, $4, $5, $6, $7) 
     50      ]]></status> 
     51      <metric_numeric><![CDATA[ 
     52        INSERT INTO stratcon.loading_dock_metric_numeric 
     53                    (remote_address, whence, id, name, type, value) 
     54             VALUES ($1, 'epoch'::timestamptz + ($2 || ' seconds')::interval, 
     55                     $3, $4, $5, $6) 
     56      ]]></metric_numeric> 
     57      <metric_text><![CDATA[ 
     58        INSERT INTO stratcon.loading_dock_metric_text 
     59                    (remote_address, whence, id, name, type, value) 
     60             VALUES ($1, 'epoch'::timestamptz + ($2 || ' seconds')::interval, 
     61                     $3, $4, $5, $6) 
     62      ]]></metric_text> 
     63    </statements> 
     64  </database> 
    3565 
    3666  <listeners> 
  • src/stratcon_datastore.c

    rdf5d455 r2471771  
    99#include "stratcon_datastore.h" 
    1010#include "noit_conf.h" 
     11#include "noit_check.h" 
    1112#include <unistd.h> 
     13#include <netinet/in.h> 
     14#include <arpa/inet.h> 
    1215#include <libpq-fe.h> 
    1316 
     17static char *check_insert = NULL; 
     18static const char *check_insert_conf = "/stratcon/database/statements/check"; 
     19static char *status_insert = NULL; 
     20static const char *status_insert_conf = "/stratcon/database/statements/status"; 
     21static char *metric_insert_numeric = NULL; 
     22static const char *metric_insert_numeric_conf = "/stratcon/database/statements/metric_numeric"; 
     23static char *metric_insert_text = NULL; 
     24static const char *metric_insert_text_conf = "/stratcon/database/statements/metric_text"; 
     25 
     26#define GET_QUERY(a) do { \ 
     27  if(a == NULL) \ 
     28    if(!noit_conf_get_string(NULL, a ## _conf, &(a))) \ 
     29      goto bad_row; \ 
     30} while(0) 
     31 
     32#define MAX_PARAMS 8 
    1433typedef struct ds_job_detail { 
    1534  char *data;  /* The raw string, NULL means the stream is done -- commit. */ 
     
    1736  eventer_t completion_event; /* This event should be registered if non NULL */ 
    1837  struct ds_job_detail *next; 
     38 
     39  /* Postgres specific stuff */ 
     40  int nparams; 
     41  char *paramValues[MAX_PARAMS]; 
     42  int paramLengths[MAX_PARAMS]; 
     43  int paramFormats[MAX_PARAMS]; 
     44  int paramAllocd[MAX_PARAMS]; 
    1945} ds_job_detail; 
    2046 
     
    2248  struct sockaddr *remote; 
    2349  eventer_jobq_t  *jobq; 
     50  /* Postgres specific stuff */ 
    2451  PGconn          *dbh; 
    2552  ds_job_detail   *head; 
     
    7299} execute_outcome_t; 
    73100 
     101static char * 
     102__strndup(const char *src, int len) { 
     103  char *dst; 
     104  dst = malloc(len + 1); 
     105  strlcpy(dst, src, len+1); 
     106  return dst; 
     107} 
     108#define DECLARE_PARAM_STR(str, len) do { \ 
     109  d->paramValues[d->nparams] = __strndup(str, len); \ 
     110  d->paramLengths[d->nparams] = len; \ 
     111  d->paramFormats[d->nparams] = 0; \ 
     112  d->paramAllocd[d->nparams] = 1; \ 
     113  if(!strcmp(d->paramValues[d->nparams], "[[null]]")) { \ 
     114    free(d->paramValues[d->nparams]); \ 
     115    d->paramLengths[d->nparams] = 0; \ 
     116    d->paramAllocd[d->nparams] = 0; \ 
     117  } \ 
     118  d->nparams++; \ 
     119} while(0) 
     120 
    74121execute_outcome_t 
    75 stratcon_datastore_execute(conn_q *cq, struct sockaddr *r, const char *data) { 
    76    
     122stratcon_datastore_execute(conn_q *cq, struct sockaddr *r, ds_job_detail *d) { 
     123  int i, type; 
     124 
     125  type = d->data[0]; 
     126 
     127  /* Parse the log line, but only if we haven't already */ 
     128  if(!d->nparams) { 
     129    struct sockaddr_in6 *rin6 = (struct sockaddr_in6 *)r; 
     130    char raddr[128]; 
     131    char *scp, *ecp; 
     132    int fields; 
     133    if(inet_ntop(rin6->sin6_family, &rin6->sin6_addr, 
     134                 raddr, sizeof(raddr)) == NULL) 
     135      raddr[0] = '\0'; 
     136  
     137    d->paramValues[0] = strdup(raddr); 
     138    d->paramLengths[0] = strlen(raddr); 
     139    d->paramFormats[0] = 0; 
     140    d->paramAllocd[0] = 1; 
     141    d->nparams = 1;  
     142 
     143    switch(type) { 
     144      /* See noit_check_log.c for log description */ 
     145      case 'C': 
     146      case 'M': 
     147        fields = 6; break; 
     148      case 'S': 
     149        fields = 7; break; 
     150      default: 
     151        goto bad_row; 
     152    } 
     153 
     154    scp = d->data; 
     155    for(i=0;i<fields-1;i++) { /* fields-1 b/c the last field is open-ended */ 
     156      if(!*scp) goto bad_row; 
     157      ecp = strchr(scp, '\t'); 
     158      if(!ecp) goto bad_row; 
     159      if(i > 0) /* We skip the type for now */ 
     160        DECLARE_PARAM_STR(scp, ecp-scp); 
     161      scp = ecp + 1; 
     162    } 
     163    /* Now to the last field */ 
     164    if(!*scp) ecp = scp; 
     165    else { 
     166      ecp = scp + strlen(scp); /* Puts us at the '\0' */ 
     167      if(*(ecp-1) == '\n') ecp--; /* We back up on letter if we ended in \n */ 
     168    } 
     169    DECLARE_PARAM_STR(scp, ecp-scp); 
     170  } 
     171 
     172#define PG_EXEC(cmd) do { \ 
     173  PGresult *res; \ 
     174  int rv; \ 
     175  res = PQexecParams(cq->dbh, cmd, d->nparams, NULL, \ 
     176                     (const char * const *)d->paramValues, \ 
     177                     d->paramLengths, d->paramFormats, 0); \ 
     178  rv = PQresultStatus(res); \ 
     179  if(rv != PGRES_COMMAND_OK) { \ 
     180    noitL(noit_error, "stratcon datasource bad row: %s\n", \ 
     181          PQresultErrorMessage(res)); \ 
     182    PQclear(res); \ 
     183    goto bad_row; \ 
     184  } \ 
     185  PQclear(res); \ 
     186} while(0) 
     187 
     188  /* Now execute the query */ 
     189  switch(type) { 
     190    case 'C': 
     191      GET_QUERY(check_insert); 
     192      PG_EXEC(check_insert); 
     193      break; 
     194    case 'S': 
     195      GET_QUERY(status_insert); 
     196      PG_EXEC(status_insert); 
     197      break; 
     198    case 'M': 
     199      /* The fifth (idx: 4) bind variable is the type */ 
     200      switch(d->paramValues[4][0]) { 
     201        case METRIC_INT32: 
     202        case METRIC_UINT32: 
     203        case METRIC_INT64: 
     204        case METRIC_UINT64: 
     205        case METRIC_DOUBLE: 
     206          GET_QUERY(metric_insert_numeric); 
     207          PG_EXEC(metric_insert_numeric); 
     208          break; 
     209        case METRIC_STRING: 
     210          GET_QUERY(metric_insert_text); 
     211          PG_EXEC(metric_insert_text); 
     212          break; 
     213        default: 
     214          goto bad_row; 
     215      } 
     216      break; 
     217    default: 
     218      /* should never get here */ 
     219      goto bad_row; 
     220  } 
     221  return DS_EXEC_SUCCESS; 
     222 bad_row: 
    77223  return DS_EXEC_ROW_FAILED; 
    78224} 
     
    95241 
    96242  dsn[0] = '\0'; 
    97   t = noit_conf_get_hash(NULL, "/stratcon/noits/dbconfig"); 
     243  t = noit_conf_get_hash(NULL, "/stratcon/database/dbconfig"); 
    98244  while(noit_hash_next(t, &iter, &k, &klen, (void **)&v)) { 
    99245    if(dsn[0]) strlcat(dsn, " ", sizeof(dsn)); 
     
    180326        continue; 
    181327      }  
    182       rv = stratcon_datastore_execute(cq, cq->remote, current->data); 
     328      rv = stratcon_datastore_execute(cq, cq->remote, current); 
    183329      switch(rv) { 
    184330        case DS_EXEC_SUCCESS: