コード例 #1
0
/**
 * Add a new registration to the database
 *
 * @param c the db configuration
 * @param s the server
 * @param r the registration
 *
 * @return 1 on success
 */
int db_add_registration(struct config *c, struct server *s, struct registration *r)
{
	char *req = "INSERT INTO registrations (server_id, serveradmin, name, password) VALUES (%i, %i, %s, %s);";
	char *quoted_name, *quoted_pass;
	dbi_result res;
	struct channel *ch;
	struct player_channel_privilege *priv;
	size_t iter, iter2;

	dbi_conn_quote_string_copy(c->conn, r->name, &quoted_name);
	dbi_conn_quote_string_copy(c->conn, r->password, &quoted_pass);

	res = dbi_conn_queryf(c->conn, req, s->id, r->global_flags, quoted_name, quoted_pass);
	if (res == NULL) {
		logger(LOG_WARN, "db_add_registration : SQL query failed");
	} else {
		r->db_id = dbi_conn_sequence_last(c->conn, NULL);
		dbi_result_free(res);
	}
	free(quoted_pass);
	free(quoted_name);

	ar_each(struct channel *, ch, iter, s->chans)
		ar_each(struct player_channel_privilege *, priv, iter2, ch->pl_privileges)
			if (priv->reg == PL_CH_PRIV_REGISTERED && priv->pl_or_reg.reg == r) {
				logger(LOG_INFO, "db_add_registration : adding a new pl_chan_priv");
				db_add_pl_chan_priv(c, priv);
			}
		ar_end_each;
	ar_end_each;
	return 1;
}
コード例 #2
0
ファイル: dbi_main.c プロジェクト: cention-nazri/libdbi
size_t dbi_conn_quote_string(dbi_conn Conn, char **orig) {
	dbi_conn_t *conn = Conn;
	char *temp = NULL;
	char *newstr = NULL;
	size_t newlen;

	if (!conn) {
	  return 0;
	}

	_reset_conn_error(conn);

	if (!orig || !*orig) {
	  _error_handler(conn, DBI_ERROR_BADPTR);
	  return 0;
	}
	
	newlen = dbi_conn_quote_string_copy(Conn, *orig, &newstr);
	if (!newlen) {
	  /* leave original string alone in case of an error */
	  /* error number was set by called function */
	  return 0;
	}
	temp = *orig;
	*orig = newstr;
	free(temp); /* original unescaped string */

	return newlen;
}
コード例 #3
0
ファイル: db_wrap_dbi.c プロジェクト: ageric/merlin
size_t dbiw_sql_quote(db_wrap * self, char const * sql, size_t len, char ** dest)
{
	DB_DECL(0);
	if (!sql || !*sql || !len)
	{
		*dest = NULL;
		return 0;
	}
	else
	{
		return dbi_conn_quote_string_copy(conn, sql, dest);
	}
}
コード例 #4
0
ファイル: dbi_main.c プロジェクト: cention-nazri/libdbi
size_t dbi_conn_escape_string_copy(dbi_conn Conn, const char *orig, char **newquoted) {
	size_t newlen;
	
	if (!Conn) {
	  return 0;
	}

	newlen = dbi_conn_quote_string_copy(Conn, orig, newquoted);

	if (newlen) {
	  (*newquoted)[newlen-1] = '\0';
	  memmove(*newquoted, (*newquoted)+1, newlen-1);
	}

	return newlen-2;
}
コード例 #5
0
//*******************************************************************
// CREATE PR_STATUS RECORD
//*******************************************************************
static void insert_pr_status(trx *t)
{
  dbi_result result;
  char *escmsg;

  if (t->res->message) {
    dbi_conn_quote_string_copy(t->probe->db->conn, t->res->message, &escmsg);
  } else {
    escmsg = strdup("");
  }

  result = db_query(t->probe->db, 0,
                    "insert into pr_status (class, probe, stattime, expires, color, server, message, contact, hide)"
                    "            values ('%u', '%u', '%u', '%u', '%u', '%u', '%s', '%u', '%s')",
                    t->probe->class, t->def->probeid, t->res->stattime, t->res->expires, 
                    t->def->color, t->def->server, escmsg, t->def->contact, t->def->hide);
  dbi_result_free(result);
  free(escmsg);
}
コード例 #6
0
//*******************************************************************
// UPDATE PR_STATUS
//*******************************************************************
static void update_pr_status(trx *t, struct probe_result *prv)
{
  dbi_result result;
  char *qry;

  qry = g_malloc(512 + (t->res->message ? strlen(t->res->message)*2 : 0));

  sprintf(qry, "update pr_status "
               "set    stattime = '%u', expires = '%u', hide = '%s', " 
               "       contact = '%u', server = '%u'", 
               t->res->stattime, t->res->expires, t->def->hide, 
               t->def->contact, t->def->server);

  if (t->probe->fuse) {
    if (t->res->color > prv->color || prv->color == STAT_PURPLE) {
    // if this probe acts like a fuse, only update color if new color is higher then old color
    // because colors must be set to green (= fuse replaced) by a human
      sprintf(&qry[strlen(qry)], ", color = '%u'", t->res->color);
    } 
  } else {
    sprintf(&qry[strlen(qry)], ", color = '%u'", t->res->color);
  }

  if (t->res->message) {
    char *escmsg;

    dbi_conn_quote_string_copy(t->probe->db->conn, t->res->message, &escmsg);
    if (t->res->color != prv->color) {
      sprintf(&qry[strlen(qry)], ", message = '%s'", escmsg);
    } else if (t->probe->fuse) {
      sprintf(&qry[strlen(qry)], ", message = concat(message,'%s')", escmsg);
    }
    free(escmsg);
  }
  else {
    sprintf(&qry[strlen(qry)],", message = ''");
  }

  sprintf(&qry[strlen(qry)], " where probe = '%u' and class = '%u'", t->def->probeid, t->probe->class);
  result = db_rawquery(t->probe->db, 0, qry);
  dbi_result_free(result);
  g_free(qry);
}
コード例 #7
0
//*******************************************************************
// CREATE PR_HIST
//*******************************************************************
static void create_pr_hist(trx *t, struct probe_result *prv)
{
  dbi_result result;
  char *escmsg;

  if (t->res->message) {
    dbi_conn_quote_string_copy(t->probe->db->conn, t->res->message, &escmsg);
  } else {
    escmsg = strdup("");
  }

  result = db_query(t->probe->db, 0,
                    "insert into pr_hist (server, class, probe, stattime, prv_color, color, message, contact, hide, pgroup)"
                    "            values ('%u', '%u', '%u', '%u', '%d', '%d', '%s', '%u', '%s', '%u')",
                    t->def->server, t->probe->class, t->def->probeid, t->res->stattime,
                    /* (t->res->received > t->res->expires) ? STAT_PURPLE : */ prv->color, 
                    t->res->color, escmsg, t->def->contact, t->def->hide, t->def->pgroup);
  dbi_result_free(result);
  free(escmsg);
}
コード例 #8
0
//*******************************************************************
// STORE RAW RESULTS
//*******************************************************************
static gint mysqlstats_store_raw_result(trx *t)
{
  dbi_result result;
  struct mysqlstats_result *res = (struct mysqlstats_result *)t->res;
  struct probe_def *def = (struct probe_def *)t->def;
  char *escmsg;
  const char *errmsg;

  if (t->res->color == STAT_PURPLE) return 1;
  t->seen_before = FALSE;
  if (res->message) {
    dbi_conn_quote_string_copy(t->probe->db->conn, t->res->message, &escmsg);
  } else {
    escmsg = strdup("");
  }
    
  result = db_query(t->probe->db, 0,
                    "insert into pr_mysqlstats_raw (probe, yellow, red, stattime, color, selectq, insertq, "
                    "                               updateq, deleteq, message) "
                    "            values ('%u', '%f', '%f', '%u', '%u', '%u', '%u', "
                    "                    '%u', '%u', '%s')",
                    def->probeid, def->yellow, def->red, res->stattime, res->color, 
                    res->selectq, res->insertq, res->updateq, res->deleteq,escmsg);
  g_free(escmsg);
  if (result) {
    dbi_result_free(result);
    return 1; // success
  }
  if (dbi_duplicate_entry(t->probe->db->conn)) {
    t->seen_before = TRUE;
    return 1; // success
  }
  if (dbi_conn_error(t->probe->db->conn, &errmsg) == DBI_ERROR_NONE) {
    return 1; // success
  }
  LOG(LOG_ERR, "%s", errmsg);
  return 0; // Failure
}
コード例 #9
0
ファイル: bb_cpu.c プロジェクト: BackupTheBerlios/upwatch-svn
//*******************************************************************
// STORE RAW RESULTS
//*******************************************************************
static gint bb_cpu_store_raw_result(trx *t)
{
  dbi_result result;
  struct bb_cpu_result *res = (struct bb_cpu_result *)t->res;
  struct probe_def *def = (struct probe_def *)t->def;
  char *escmsg;
  const char *errmsg;

  if (t->res->color == STAT_PURPLE) return 1;
  t->seen_before = FALSE;
  if (res->message) {
    dbi_conn_quote_string_copy(t->probe->db->conn, t->res->message, &escmsg);
  } else {
    escmsg = strdup("");
  }
    
  result = db_query(t->probe->db, 0,
                    "insert into pr_bb_cpu_raw (probe, stattime, color, loadavg, user, idle, free, used, message)"
                    "            values ('%u', '%u', '%u', '%f', '%u',  '%u', '%u', '%u', '%s')",
                    def->probeid, res->stattime, res->color, res->loadavg,
                    res->user, res->idle, res->free, res->used, escmsg);
  g_free(escmsg);
  if (result) {
    dbi_result_free(result);
    return 1; // success
  }
  if (dbi_duplicate_entry(t->probe->db->conn)) {
    t->seen_before = TRUE;
    return 1; // success
  }
  if (dbi_conn_error(t->probe->db->conn, &errmsg) == DBI_ERROR_NONE) {
    return 1; // success
  }
  LOG(LOG_ERR, "%s", errmsg);
  return 0; // Failure
}
コード例 #10
0
ファイル: afsql.c プロジェクト: algernon/syslog-ng-old
static GString *
afsql_dd_build_insert_command(AFSqlDestDriver *self, LogMessage *msg, GString *table)
{
  GString *insert_command = g_string_sized_new(256);
  GString *value = g_string_sized_new(512);
  gint i, j;

  g_string_printf(insert_command, "INSERT INTO %s (", table->str);

  for (i = 0; i < self->fields_len; i++)
    {
      if ((self->fields[i].flags & AFSQL_FF_DEFAULT) == 0 && self->fields[i].value != NULL)
        {
           g_string_append(insert_command, self->fields[i].name);

           j = i + 1;
           while (j < self->fields_len && (self->fields[j].flags & AFSQL_FF_DEFAULT) == AFSQL_FF_DEFAULT)
             j++;

           if (j < self->fields_len)
             g_string_append(insert_command, ", ");
        }
    }

  g_string_append(insert_command, ") VALUES (");

  for (i = 0; i < self->fields_len; i++)
    {
      gchar *quoted;

      if ((self->fields[i].flags & AFSQL_FF_DEFAULT) == 0 && self->fields[i].value != NULL)
        {
          log_template_format(self->fields[i].value, msg, &self->template_options, LTZ_SEND, self->seq_num, NULL, value);
          if (self->null_value && strcmp(self->null_value, value->str) == 0)
            {
              g_string_append(insert_command, "NULL");
            }
          else
            {
              dbi_conn_quote_string_copy(self->dbi_ctx, value->str, &quoted);
              if (quoted)
                {
                  g_string_append(insert_command, quoted);
                  free(quoted);
                }
              else
                {
                 g_string_append(insert_command, "''");
                }
            }

          j = i + 1;
          while (j < self->fields_len && (self->fields[j].flags & AFSQL_FF_DEFAULT) == AFSQL_FF_DEFAULT)
            j++;
          if (j < self->fields_len)
            g_string_append(insert_command, ", ");
        }
    }

  g_string_append(insert_command, ")");

  g_string_free(value, TRUE);

  return insert_command;
}
コード例 #11
0
ファイル: afsql.c プロジェクト: balabit/syslog-ng-3.4
static GString *
afsql_dd_construct_query(AFSqlDestDriver *self, GString *table,
                         LogMessage *msg)
{
  GString *value;
  GString *query_string;
  gint i;

  value = g_string_sized_new(256);
  query_string = g_string_sized_new(512);

  g_string_printf(query_string, "INSERT INTO %s (", table->str);
  for (i = 0; i < self->fields_len; i++)
    {
      g_string_append(query_string, self->fields[i].name);
      if (i != self->fields_len - 1)
        g_string_append(query_string, ", ");
    }
  g_string_append(query_string, ") VALUES (");

  for (i = 0; i < self->fields_len; i++)
    {
      gchar *quoted;

      if (self->fields[i].value == NULL)
        {
          /* the config used the 'default' value for this column -> the fields[i].value is NULL, use SQL default */
          g_string_append(query_string, "DEFAULT");
        }
      else
        {
          log_template_format(self->fields[i].value, msg, &self->template_options, LTZ_SEND, self->seq_num, NULL, value);

          if (self->null_value && strcmp(self->null_value, value->str) == 0)
            {
              g_string_append(query_string, "NULL");
            }
          else
            {
              dbi_conn_quote_string_copy(self->dbi_ctx, value->str, &quoted);
              if (quoted)
                {
                  g_string_append(query_string, quoted);
                  free(quoted);
                }
              else
                {
                  g_string_append(query_string, "''");
                }
            }
        }

      if (i != self->fields_len - 1)
        g_string_append(query_string, ", ");
    }
  g_string_append(query_string, ")");

  g_string_free(value, TRUE);

  return query_string;
}
コード例 #12
0
ファイル: cache.c プロジェクト: hhetter/smbtad
char *cache_create_database_string(TALLOC_CTX *ctx,struct cache_entry *entry,
		struct configuration_data *conf)
{
	/*
	 * create a database string from the given metadata in a cache entry
	 */
	char *retstr=NULL;

	/**
	 * qoute required strings, that need potientially be qouted
	 * .. allocate other quote in the specific functions
	 * We are bound to not use talloc here.
	 */
	char *username;
	char *share;
	char *domain;
	char *timestamp;
	char *usersid;
	/* fn depending strings */
	char *source, *destination, *result, *filename, *mode;

	dbi_conn_quote_string_copy( conf->DBIconn, entry->username, &username);
	dbi_conn_quote_string_copy( conf->DBIconn, entry->share, &share);
	dbi_conn_quote_string_copy( conf->DBIconn, entry->domain, &domain);
	dbi_conn_quote_string_copy( conf->DBIconn, entry->timestamp, &timestamp);
	dbi_conn_quote_string_copy( conf->DBIconn, entry->usersid, &usersid);
	switch( entry->op_id ) {
        case vfs_id_rename: ;
		dbi_conn_quote_string_copy( conf->DBIconn, entry->source,
				&source);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->destination,
				&destination);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->result,
				&result);

                retstr = talloc_asprintf(ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, string2, result) VALUES ("
                        "%i, %s,%s,%s,%s,"
                        "%s,%s,%s,%s);",
                        entry->op_id,username,usersid,share,domain,timestamp,
                        source,destination,result);
		free(source);
		free(destination);
		free(result);
		break;
        case vfs_id_close: ;
		dbi_conn_quote_string_copy( conf->DBIconn, entry->filename, &filename);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->result, &result);

                retstr = talloc_asprintf(ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, result) VALUES ("
                        "%i,%s,%s,%s,%s,"
                        "%s,%s,%s);",
                        entry->op_id,username,usersid,share,domain,timestamp,
                        filename,result);
		free(result);
		free(filename);
                break;
        case vfs_id_open: ;
		dbi_conn_quote_string_copy( conf->DBIconn, entry->filename, &filename);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->mode, &mode);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->result, &result);
                retstr = talloc_asprintf(ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, string2, result) VALUES ("
                        "%i,%s,%s,%s,%s,"
                        "%s,%s,%s,%s);",
                        entry->op_id,username,usersid,share,domain,timestamp,
                        filename,mode,result);
		free(mode);
		free(result);
		free(filename);
                break;
        case vfs_id_chdir: ;
		char *path;
		dbi_conn_quote_string_copy( conf->DBIconn, entry->path, &path);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->result, &result);
                retstr = talloc_asprintf( ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, result) VALUES ("
                        "%i,%s,%s,%s,%s,"
                        "%s,%s,%s);",
                        entry->op_id,username,usersid,share,domain,timestamp,
                        path,result);
		free(path);
		free(result);
                break;
        case vfs_id_mkdir: ;
		dbi_conn_quote_string_copy( conf->DBIconn, entry->path, &path);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->mode, &mode);
		dbi_conn_quote_string_copy( conf->DBIconn, entry->result, &result);
                retstr = talloc_asprintf(ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, string2, result) VALUES ("
                        "%i,%s,%s,%s,%s,"
                        "%s,%s,%s,%s);",
                        entry->op_id,username,usersid,share,domain,timestamp,
                        path, mode, result);
		free(mode);
		free(result);
		free(path);
                break;
        case vfs_id_write:
        case vfs_id_pwrite: ;
                if (entry->len == 0) {
                        retstr=NULL;
                        break;
                }
		dbi_conn_quote_string_copy( conf->DBIconn, entry->filename, &filename);
                retstr = talloc_asprintf(ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, length) VALUES ("
                        "%i,%s,%s,%s,%s,%s,"
                        "%s,%lu);",
                        vfs_id_write,username,usersid,share,domain,timestamp,
                        filename,entry->len);
		free(filename);
                break;	
        case vfs_id_read:
        case vfs_id_pread: ;
                if (entry->len == 0) {
                        retstr=NULL;
                        break;
                }
		dbi_conn_quote_string_copy( conf->DBIconn, entry->filename, &filename);
                retstr = talloc_asprintf(ctx, "INSERT INTO data ("
                        "vfs_id, username, usersid, share, domain, timestamp,"
                        "string1, length) VALUES ("
                        "%i,%s,%s,%s,%s,%s,"
                        "%s,%lu);",
                        vfs_id_read,username,usersid,share,domain,timestamp,
                        filename,entry->len);
		free(filename);
                break;
	default: ;
	}

	free(username);
	free(share);
	free(domain);
	free(timestamp);
	free(usersid);
	return retstr;
}
コード例 #13
0
ファイル: db_channel.c プロジェクト: 3050860/soliloque-server
/**
 * Make a channel persistent by inserting it into the database
 *
 * @param c the db config
 * @param ch the channel to register
 *
 * @return 0 on failure, 1 on success
 */
int db_register_channel(struct config *c, struct channel *ch)
{
	char *q = "INSERT INTO channels \
		   (server_id, name, topic, description, \
		    codec, maxusers, ordr, \
		    flag_default, flag_hierarchical, flag_moderated, \
		    parent_id, password) \
		   VALUES \
		   (%i, %s, %s, %s, \
		    %i, %i, %i, \
		    %i, %i, %i, \
		    %i, %s);";
	char *name_clean, *topic_clean, *desc_clean, *pass_clean;
	int flag_default, flag_hierar, flag_mod;
	int insert_id, parent_id;
	size_t iter;
	struct channel *tmp_ch;
	struct player_channel_privilege *priv;
	dbi_result res;

	if (ch->db_id != 0) /* already exists in the db */
		return 0;

	/* Secure the input before inserting */
	dbi_conn_quote_string_copy(c->conn, ch->name, &name_clean);
	dbi_conn_quote_string_copy(c->conn, ch->topic, &topic_clean);
	dbi_conn_quote_string_copy(c->conn, ch->desc, &desc_clean);
	dbi_conn_quote_string_copy(c->conn, ch->password, &pass_clean);

	/* better here than in the query function */
	flag_default = (ch->flags & CHANNEL_FLAG_DEFAULT);
	flag_hierar = (ch->flags & CHANNEL_FLAG_SUBCHANNELS);
	flag_mod = (ch->flags & CHANNEL_FLAG_MODERATED);
	
	/* Add the ID of the parent or -1 */
	if (ch->parent == NULL)
		parent_id = 0xFFFFFFFF;
	else
		parent_id = ch->parent->db_id;

	res = dbi_conn_queryf(c->conn, q,
			ch->in_server->id, name_clean, topic_clean, desc_clean,
			ch->codec, ch->players->max_slots, ch->sort_order,
			flag_default, flag_hierar, flag_mod,
			parent_id, pass_clean);
	if (res == NULL) {
		logger(LOG_ERR, "Insertion request failed : ");
		logger(LOG_ERR, q, ch->in_server->id, name_clean, topic_clean, desc_clean,
			ch->codec, ch->players->max_slots, ch->sort_order,
			flag_default, flag_hierar, flag_mod,
			parent_id, pass_clean);
	}

	insert_id = dbi_conn_sequence_last(c->conn, NULL);
	ch->db_id = insert_id;

	/* Register all the subchannels */
	if (ch_getflags(ch) & CHANNEL_FLAG_SUBCHANNELS) {
		ar_each(struct channel *, tmp_ch, iter, ch->subchannels)
			db_register_channel(c, tmp_ch);
		ar_end_each;	
	}
コード例 #14
0
ファイル: dbi.c プロジェクト: Bradan/gammu
/* quote strings */
char * SMSDDBI_QuoteString(GSM_SMSDConfig * Config, const char *string)
{
	char *encoded_text = NULL;
	dbi_conn_quote_string_copy(Config->conn.dbi, string, &encoded_text);
	return encoded_text;
}