Ejemplo n.º 1
0
Archivo: bc.c Proyecto: dianpeng/ajj
void emitter_ensure( struct emitter* em ) {
  /* reserve size for 2 arrays */
  if( em->cd_cap < em->prg->len + 2 ) {
    size_t c = em->cd_cap;
    em->prg->codes = mem_grow( em->prg->codes ,
        sizeof(int),2,&c);
    em->prg->spos = mem_grow(em->prg->spos,
        sizeof(int),2,&(em->cd_cap));
  }
}
Ejemplo n.º 2
0
static int mem_vprintf (hpgs_mem_ostream_stream *stream, const char *fmt, va_list ap)
{
  int n;
  size_t size;

  while (1)
    {
      if (stream->errflg)
        return EOF;

      size = stream->eptr - stream->pptr;
      /* Try to print in the allocated space. */
      va_list aq;
      va_copy(aq, ap);
#ifdef WIN32
      n = _vsnprintf (stream->pptr, size, fmt, aq);
#else
      n = vsnprintf ((char*)stream->pptr, size, fmt, aq);
#endif
      va_end(aq);
      /* If that worked, return the string. */
      if (n > -1 && n < size)
	{
          stream->pptr += n;
          return n;
        }
 
      /* Else try again with more space. */
      mem_grow(stream,0);
    }

  return 0;
}
Ejemplo n.º 3
0
static int sqlite3_add_data(void *storage, struct plugin *plug,
		struct list_head *data_list)
{
	struct sqlite3_data *d = storage;
	char **stmt = &d->stmt;
	size_t *stmt_size = &d->stmt_size;
	char **buf1 = &d->buf1;
	size_t *buf1_size = &d->buf1_size;
	char **buf2 = &d->buf2;
	size_t *buf2_size = &d->buf2_size;
	int ret;
	const struct header *hdr;
	struct data *data;
	sqlite3_stmt *sqstmt;

	ret = sqlite3_exec(d->db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to begin transaction\n");
		return -1;
	}

	hdr = plugin_data_hdr(plug);
	if (!hdr) {
		printk(KERN_ERR "Failed retrieving plugin %s data header\n",
				plug->id->name);
		return -1;
	}

	ret = mem_grow((void**)buf2, buf2_size, strlen(plug->mod->name)
			+ strlen(plug->id->name) + strlen(plug->version->version) + 64);
	if (ret)
		return -1;

	sprintf(*buf2,"plugin_%s__%s__%s", plug->mod->name, plug->id->name,
			plug->version->version);

	ret = sqlite3_prepare_insert_stmt(d->db, &sqstmt, stmt, stmt_size,
			buf1, buf1_size, *buf2, hdr, "run_uuid,type_monitor", 2);
	if (ret != SQLITE_OK)
		return -1;

	list_for_each_entry(data, data_list, run_data) {

		ret = sqlite3_bind_text(sqstmt, 1, d->run_uuid, -1, SQLITE_STATIC);
		ret |= sqlite3_bind_int(sqstmt, 2, data->type == DATA_TYPE_MONITOR);
		ret |= sqlite3_bind_data(sqstmt, 3, data);
		if (ret != SQLITE_OK)
			goto error;

		ret = sqlite3_step(sqstmt);
		if (ret != SQLITE_DONE) {
			printk(KERN_ERR "Failed to insert plugin %s result into table: %s\n",
					plug->id->name, sqlite3_errmsg(d->db));
			goto error;
		}
		sqlite3_reset(sqstmt);
	}
Ejemplo n.º 4
0
const char *str_pool_finish( str_Pool pool )
{
   poolInfo   p      = (poolInfo)pool;
   const char *datum;

   mem_grow( p->string, "\0", 1 ); /* guarantee null termination */
   datum = mem_finish( p->string );
   hsh_insert( p->hash, datum, datum );

   return datum;
}
Ejemplo n.º 5
0
static size_t mem_write (void *ptr, size_t size, size_t nmemb, hpgs_mem_ostream_stream *stream)
{
  if (stream->pptr + size*nmemb > stream->eptr)
    mem_grow(stream,size*nmemb);

  if (stream->errflg)
    return 0;

  memcpy(stream->pptr,ptr,size*nmemb);
  stream->pptr += size*nmemb;

  return nmemb;
}
Ejemplo n.º 6
0
static int mem_putc (int c, hpgs_mem_ostream_stream *stream)
{
  if (stream->pptr >= stream->eptr)
    mem_grow(stream,0);

  if (stream->errflg)
    return EOF;

  *stream->pptr = c;
  ++stream->pptr;

  return c & 0xff;
}
Ejemplo n.º 7
0
static int sqlite3_prepare_insert_stmt(sqlite3 *db, sqlite3_stmt **sqstmt, char **stmt,
		size_t *stmt_len, char **buf, size_t *buf_len,
		const char *table, const struct header *hdr, const char *prefix_column,
		int add_columns)
{
	int ret;
	int written;
	int hdr_items;
	int i;

	ret = header_to_csv(hdr, buf, buf_len, QUOTE_SINGLE);
	if (ret)
		return -1;

	hdr_items = header_count_items(hdr);

	ret = mem_grow((void**)stmt, stmt_len, strlen(table) + strlen(*buf)
					+ (prefix_column ? strlen(prefix_column) : 0)
					+ (add_columns + hdr_items) * 3
					+ 128);
	if (ret)
		return -1;

	written = sprintf(*stmt, "INSERT OR IGNORE INTO \"%s\"(%s%s%s) VALUES(", table,
			(prefix_column ? prefix_column : ""),
			(prefix_column ? "," : ""),
			*buf);

	for (i = 0; i != add_columns + hdr_items; ++i) {
		if (i != 0)
			written += sprintf(*stmt + written, ",");
		written += sprintf(*stmt + written, "?");
	}

	sprintf(*stmt + written, ");");

	ret = sqlite3_prepare_v2(db, *stmt, -1, sqstmt, NULL);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to prepare sqlite statement %s %d\n", *stmt, ret);
		return -1;
	}
	return 0;
}
Ejemplo n.º 8
0
static int sqlite3_init_run(void *storage, const char *uuid, int nr_run)
{
	struct sqlite3_data *d = storage;
	char **stmt = &d->stmt;
	size_t *stmt_size = &d->stmt_size;
	int ret;
	char *errmsg;

	d->run_uuid = uuid;

	ret = mem_grow((void**)stmt, stmt_size, strlen(uuid) + strlen(d->group_sha)
				+ strlen(d->sys_sha) + 128);
	if (ret)
		return -1;
	sprintf(*stmt, "INSERT INTO unique_run("
				"run_uuid,"
				"plugin_group_sha,"
				"prev_runs,"
				"system_sha"
			") VALUES("
				"'%s','%s',%d,'%s');",
			uuid,
			d->group_sha,
			nr_run,
			d->sys_sha);

	ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to add unique run (%s): %s\n", *stmt,
				errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	return 0;
}
Ejemplo n.º 9
0
void str_pool_grow( str_Pool pool, const char *s, int length )
{
   poolInfo p = (poolInfo)pool;

   mem_grow( p->string, s, length );
}
Ejemplo n.º 10
0
static int sqlite3_init_plugin_grp(void *storage, struct list_head *plugins,
					const char *group_sha)
{
	struct sqlite3_data *d = storage;
	sqlite3_stmt *sqstmt;
	char **stmt = &d->stmt;
	size_t *stmt_size = &d->stmt_size;
	struct plugin *plug;
	int ret;
	char **buf1 = &d->buf1;
	size_t *buf1_len = &d->buf1_size;
	sha256_context ctx;
	char sha[65];
	char *errmsg;

	d->group_sha = group_sha;

	list_for_each_entry(plug, plugins, plugin_grp) {
		const struct header *hdr;
		const struct header *opts;
		char *opt_table;
		char *comp_vers_table;
		size_t written;

		sha256_starts(&ctx);
		opts = plugin_get_options(plug);
		if (opts) {
			ret = sqlite3_plugin_store_options(d, plug);
			if (ret)
				return -1;
			sha256_add_str(&ctx, plug->opt_sha256);
		}

		if (plug->version->comp_versions) {
			ret = sqlite3_plugin_store_versions(d, plug);
			if (ret)
				return -1;
			sha256_add_str(&ctx, plug->ver_sha256);
		}

		sha256_add_str(&ctx, group_sha);
		sha256_add_str(&ctx, plug->sha256);
		sha256_finish_str(&ctx, sha);

		hdr = plugin_data_hdr(plug);
		if (hdr) {
			ret = sqlite3_store_header_metadata(d, hdr, "plugin_sha",
					plug->sha256, "plugin_data_meta", "plugin_data_meta_sha", 1);
			if (ret)
				return -1;

			ret = mem_grow((void**)buf1, buf1_len, strlen(plug->mod->name)
					+ strlen(plug->id->name)
					+ strlen(plug->version->version) + 128);
			if (ret) {
				return -1;
			}

			sprintf(*buf1, "plugin_%s__%s__%s", plug->mod->name,
					plug->id->name,
					plug->version->version);
			ret = sqlite3_alter_by_hdr(*buf1, d, hdr, "run_uuid,type_monitor");
			if (ret) {
				printk(KERN_ERR "Failed to update plugin table %s\n",
						buf1);
				return -1;
			}
		}

		ret = mem_grow((void**)buf1, buf1_len, 3 * strlen(plug->mod->name)
				+ 3 * strlen(plug->version->version)
				+ 3 * strlen(plug->id->name) + 256);
		if (ret)
			return -1;

		written = sprintf(*buf1, "plugin_%s__%s__%s",
				plug->mod->name, plug->id->name, plug->version->version);

		opt_table = *buf1 + written + 1;
		written = sprintf(opt_table, "plugin_opts_%s__%s__%s",
				plug->mod->name, plug->id->name, plug->version->version);

		comp_vers_table = opt_table + written + 1;
		sprintf(comp_vers_table, "plugin_comp_vers_%s__%s__%s",
				plug->mod->name, plug->id->name, plug->version->version);

		ret = sqlite3_prepare_v2(d->db, "INSERT OR IGNORE INTO plugin("
					"plugin_sha,"
					"module,"
					"name,"
					"description,"
					"version,"
					"plugin_table,"
					"plugin_opt_table,"
					"plugin_comp_vers_table"
				") VALUES(?,?,?,?,?,?,?,?);", -1, &sqstmt, NULL);
		if (ret != SQLITE_OK) {
			printk(KERN_ERR "Failed to prepare plugin statement\n");
			return -1;
		}

		ret = sqlite3_bind_text(sqstmt, 1, plug->sha256, -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 2, plug->mod->name, -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 3, plug->id->name, -1, SQLITE_STATIC);
		if (plug->id->description)
			ret |= sqlite3_bind_text(sqstmt, 4, plug->id->description, -1, SQLITE_STATIC);
		else
			ret |= sqlite3_bind_text(sqstmt, 4, "", -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 5, plug->version->version, -1, SQLITE_STATIC);
		if (plugin_data_hdr(plug))
			ret |= sqlite3_bind_text(sqstmt, 6, *buf1, -1, SQLITE_STATIC);
		else
			ret |= sqlite3_bind_text(sqstmt, 6, "", -1, SQLITE_STATIC);
		if (plugin_get_options(plug))
			ret |= sqlite3_bind_text(sqstmt, 7, opt_table, -1, SQLITE_STATIC);
		else
			ret |= sqlite3_bind_text(sqstmt, 7, "", -1, SQLITE_STATIC);
		if (plug->version->comp_versions)
			ret |= sqlite3_bind_text(sqstmt, 8, comp_vers_table, -1, SQLITE_STATIC);
		else
			ret |= sqlite3_bind_text(sqstmt, 8, "", -1, SQLITE_STATIC);
		if (ret != SQLITE_OK) {
			printk(KERN_ERR "Failed to bind all values for plugin\n");
			sqlite3_finalize(sqstmt);
			return -1;
		}
		ret = sqlite3_step(sqstmt);
		sqlite3_finalize(sqstmt);
		if (ret != SQLITE_DONE) {
			printk(KERN_ERR "Failed to insert into plugins: %s\n",
					sqlite3_errmsg(d->db));
			return -1;
		}

		ret = mem_grow((void**)stmt, stmt_size,
				+ strlen(group_sha) + strlen(sha)
				+ strlen(plug->sha256)
				+ strlen(plug->opt_sha256)
				+ strlen(plug->ver_sha256) + 128);
		if (ret) {
			return -1;
		}

		sprintf(*stmt, "INSERT OR IGNORE INTO plugin_group("
					"sha,"
					"plugin_group_sha,"
					"plugin_sha,"
					"plugin_opts_sha,"
					"plugin_comp_vers_sha"
				") VALUES("
					"'%s','%s','%s','%s','%s');",
				sha, group_sha,
				plug->sha256,
				plug->opt_sha256,
				plug->ver_sha256);
		ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
		if (ret != SQLITE_OK) {
			printk(KERN_ERR "Failed to insert into plugin_groups (%s): %s\n",
					*stmt, errmsg);
			sqlite3_free(errmsg);
		}
	}

	return 0;
}
Ejemplo n.º 11
0
static int sqlite3_plugin_store_versions(struct sqlite3_data *d,
		struct plugin *plug)
{
	int ret;
	char **buf1 = &d->buf1;
	size_t *buf1_len = &d->buf1_size;
	char **buf2 = &d->buf2;
	size_t *buf2_len = &d->buf2_size;
	char **stmt = &d->stmt;
	size_t *stmt_size = &d->stmt_size;
	char *errmsg;
	struct comp_version *vers = plug->version->comp_versions;

	ret = comp_versions_to_csv(vers, buf1, buf1_len, QUOTE_SINGLE);
	if (ret) {
		printk(KERN_ERR "Failed to translate comp versions to csv\n");
		return -1;
	}

	ret = mem_grow((void**)stmt, stmt_size,
			strlen(plug->mod->name)
			+ strlen(plug->id->name)
			+ strlen(plug->version->version)
			+ strlen(*buf1)
			+ 160);
	if (ret)
		return -1;

	sprintf(*stmt, "CREATE TABLE IF NOT EXISTS 'plugin_comp_vers_%s__%s__%s'("
				"plugin_comp_vers_sha UNIQUE PRIMARY KEY,"
				"%s);",
			plug->mod->name,
			plug->id->name,
			plug->version->version,
			*buf1);
	ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed creating option table (%s): %s",
				*stmt, errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	ret = comp_versions_to_data_csv(vers, buf2, buf2_len, QUOTE_SINGLE);
	if (ret) {
		printk(KERN_ERR "Failed to translate version data to csv\n");
		return -1;
	}

	ret = mem_grow((void**)stmt, stmt_size,
			strlen(plug->mod->name)
			+ strlen(plug->id->name)
			+ strlen(plug->version->version)
			+ strlen(*buf1)
			+ strlen(*buf2)
			+ strlen(plug->ver_sha256)
			+ 160);
	if (ret)
		return -1;
	sprintf(*stmt, "INSERT OR IGNORE INTO \"plugin_comp_vers_%s__%s__%s\"("
				"plugin_comp_vers_sha,"
				"%s"
			") VALUES("
				"'%s',%s);",
			plug->mod->name,
			plug->id->name,
			plug->version->version,
			*buf1,
			plug->ver_sha256,
			*buf2);
	ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed inserting plugin versions (%s): %s\n",
				*stmt, errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	return 0;
}
Ejemplo n.º 12
0
static int sqlite3_plugin_store_options(struct sqlite3_data *d,
		struct plugin *plug)
{
	int ret;
	int i;
	struct header *opts = plug->options;
	sqlite3_stmt *sqstmt;
	char **buf1 = &d->buf1;
	size_t *buf1_len = &d->buf1_size;
	char **buf2 = &d->buf2;
	size_t *buf2_len = &d->buf2_size;
	char **stmt = &d->stmt;
	size_t *stmt_size = &d->stmt_size;
	char *errmsg;

	ret = sqlite3_store_header_metadata(d, opts, "plugin_sha",
			plug->sha256, "plugin_option_meta", "plugin_option_meta_sha", 0);
	if (ret)
		return -1;

	ret = option_to_hdr_csv(opts, buf1, buf1_len, QUOTE_SINGLE);
	if (ret) {
		printk(KERN_ERR "Failed to translate option header to csv\n");
		return -1;
	}

	ret = mem_grow((void**)stmt, stmt_size,
			strlen(plug->mod->name)
			+ strlen(plug->id->name)
			+ strlen(plug->version->version)
			+ strlen(*buf1)
			+ 128);
	if (ret)
		return -1;

	sprintf(*stmt, "CREATE TABLE IF NOT EXISTS 'plugin_opts_%s__%s__%s'("
				"plugin_opts_sha UNIQUE PRIMARY KEY,"
				"%s);",
			plug->mod->name,
			plug->id->name,
			plug->version->version,
			*buf1);
	ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed creating option table (%s): %s",
				*stmt, errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	ret = mem_grow((void**)buf2, buf2_len, strlen(plug->mod->name)
			+ strlen(plug->id->name) + strlen(plug->version->version)
			+ 64);
	if (ret)
		return -1;

	sprintf(*buf2, "plugin_opts_%s__%s__%s", plug->mod->name, plug->id->name,
			plug->version->version);

	ret = sqlite3_prepare_insert_stmt(d->db, &sqstmt, stmt, stmt_size, buf1,
			buf1_len, *buf2, opts, "plugin_opts_sha", 1);
	if (ret)
		return -1;

	ret = sqlite3_bind_text(sqstmt, 1, plug->opt_sha256, -1, SQLITE_STATIC);
	for (i = 0; opts[i].name != NULL; ++i) {
		ret |= sqlite3_bind_cbench_value(sqstmt, 2 + i, &opts[i].opt_val);
	}
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed binding all values for plugin_opts\n");
		goto error;
	}

	ret = sqlite3_step(sqstmt);
	if (ret != SQLITE_DONE) {
		printk(KERN_ERR "Failed inserting plugin options: %s\n",
				sqlite3_errmsg(d->db));
		goto error;
	}
	sqlite3_finalize(sqstmt);
	return 0;
error:
	sqlite3_finalize(sqstmt);
	return -1;
}
Ejemplo n.º 13
0
static void *sqlite3_init(const char *path)
{
	struct sqlite3_data *d;
	int ret;
	char *errmsg;

	d = malloc(sizeof(*d));
	if (!d)
		return NULL;

	d->stmt = NULL;
	d->buf1 = NULL;
	d->buf2 = NULL;

	ret = mem_grow((void**)&d->buf1, &d->buf1_size, strlen(path) + 64);
	if (ret) {
		goto error;
	}

	sprintf(d->buf1, "mkdir -p %s", path);
	ret = system(d->buf1);
	if (ret) {
		printk(KERN_ERR "Failed to create dir %s\n", d->buf1);
		goto error;
	}

	sprintf(d->buf1, "%s/db.sqlite", path);

	ret = sqlite3_open(d->buf1, &d->db);
	if (ret) {
		printk(KERN_ERR "Failed opening database %s: %s\n", d->buf1,
				sqlite3_errmsg(d->db));
		goto error_sqldb;
	}

	ret = sqlite3_exec(d->db, "CREATE TABLE IF NOT EXISTS plugin("
					"plugin_sha UNIQUE PRIMARY KEY,"
					"module,"
					"name,"
					"description,"
					"version,"
					"plugin_table,"
					"plugin_opt_table,"
					"plugin_comp_vers_table);",
				NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to create plugins table: %s\n",
				errmsg);
		sqlite3_free(errmsg);
		goto error_sqldb;
	}

	ret = sqlite3_exec(d->db, "CREATE TABLE IF NOT EXISTS plugin_group("
					"sha UNIQUE PRIMARY KEY,"
					"plugin_group_sha,"
					"plugin_sha,"
					"plugin_opts_sha,"
					"plugin_comp_vers_sha);",
				NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to create plugin_grp table: %s\n",
				errmsg);
		sqlite3_free(errmsg);
		goto error_sqldb;
	}

	ret = sqlite3_exec(d->db, "CREATE TABLE IF NOT EXISTS unique_run("
					"run_uuid UNIQUE PRIMARY KEY,"
					"plugin_group_sha,"
					"prev_runs,"
					"system_sha);",
				NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to create unique_runs table: %s\n",
				errmsg);
		sqlite3_free(errmsg);
		goto error_sqldb;
	}

	ret = sqlite3_exec(d->db, "CREATE TABLE IF NOT EXISTS plugin_option_meta("
					"plugin_option_meta_sha UNIQUE PRIMARY KEY,"
					"plugin_sha,"
					"name,"
					"description,"
					"unit);",
				NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to create plugin_option_meta table: %s\n",
				errmsg);
		sqlite3_free(errmsg);
		goto error_sqldb;
	}

	ret = sqlite3_exec(d->db, "CREATE TABLE IF NOT EXISTS plugin_data_meta("
					"plugin_data_meta_sha UNIQUE PRIMARY KEY,"
					"plugin_sha,"
					"name,"
					"description,"
					"unit,"
					"more_is_better);",
				NULL, NULL, &errmsg);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to create plugin_option_meta table: %s\n",
				errmsg);
		sqlite3_free(errmsg);
		goto error_sqldb;
	}

	return d;

error_sqldb:
	sqlite3_close(d->db);
error:
	if (d->buf1)
		free(d->buf1);
	free(d);
	return NULL;
}
Ejemplo n.º 14
0
static int sqlite3_store_header_metadata(struct sqlite3_data *d,
		const struct header *hdr, const char *sha_name, const char *sha,
		const char *table, const char *join_sha, int persist_data_scale)
{
	int ret;
	char **stmt = &d->stmt;
	size_t *stmt_len = &d->stmt_size;
	int i;
	sqlite3_stmt *sqstmt;

	ret = mem_grow((void**)stmt, stmt_len, strlen(table) + strlen(join_sha)
				+ strlen(sha_name) + 160);
	if (ret)
		return -1;

	sprintf(*stmt, "INSERT OR IGNORE INTO %s(%s,%s,name,description,unit%s)"
				" VALUES(?,?,?,?,?%s);",
				table, join_sha, sha_name,
				(persist_data_scale ? ",more_is_better" : ""),
				(persist_data_scale ? ",?" : ""));
	ret = sqlite3_prepare_v2(d->db, *stmt, -1, &sqstmt, NULL);
	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed to prepare statement %s\n", *stmt);
		return -1;
	}

	for (i = 0; hdr[i].name != NULL; ++i) {
		sha256_context ctx;
		char sha_meta[65];

		sha256_starts(&ctx);

		sha256_add_str(&ctx, sha);
		sha256_add_str(&ctx, hdr[i].name);
		if (hdr[i].description)
			sha256_add_str(&ctx, hdr[i].description);
		if (hdr[i].unit)
			sha256_add_str(&ctx, hdr[i].unit);

		sha256_finish_str(&ctx, sha_meta);

		ret = sqlite3_bind_text(sqstmt, 1, sha_meta, -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 2, sha, -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 3, hdr[i].name, -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 4, (hdr[i].description ? hdr[i].description : ""), -1, SQLITE_STATIC);
		ret |= sqlite3_bind_text(sqstmt, 5, (hdr[i].unit ? hdr[i].unit : ""), -1, SQLITE_STATIC);
		if (persist_data_scale)
			ret |= sqlite3_bind_int(sqstmt, 6, hdr[i].data_type == DATA_MORE_IS_BETTER);
		if (ret != SQLITE_OK) {
			printk(KERN_ERR "Failed to bind values for header metadata %s\n", table);
			goto error;
		}

		ret = sqlite3_step(sqstmt);
		if (ret != SQLITE_DONE) {
			printk(KERN_ERR "Failed to insert metadata into %s (%s)L %s\n",
					table, *stmt, sqlite3_errmsg(d->db));
			goto error;
		}

		ret = sqlite3_reset(sqstmt);
		if (ret != SQLITE_OK) {
			printk(KERN_ERR "Failed resetting metadata statement\n");
			goto error;
		}
	}
	sqlite3_finalize(sqstmt);
	return 0;
error:
	sqlite3_finalize(sqstmt);
	return -1;
}
Ejemplo n.º 15
0
/*
 * WARNING: This internal function uses buf2 and stmt buffers.
 */
static int sqlite3_alter_by_hdr(const char *table, struct sqlite3_data *d,
				const struct header *hdr, const char *additional_hdr)
{
	struct values_present vp;
	int nr_vals;
	int i;
	char **stmt = &d->stmt;
	size_t *stmt_size = &d->stmt_size;
	char **buf = &d->buf2;
	size_t *buf_len = &d->buf2_size;
	char *errmsg;
	int ret;
	int sum_found;

	for (i = 0; hdr[i].name != NULL; ++i) ;
	nr_vals = i;

	vp.vals = hdr;
	vp.present = calloc(sizeof(*vp.present), nr_vals);

	if (!vp.present)
		return -1;

	ret = mem_grow((void**)stmt, stmt_size, strlen(table) + 128);
	if (ret) {
		free(vp.present);
		return -1;
	}

	sprintf(*stmt, "PRAGMA table_info('%s');", table);

	ret = sqlite3_exec(d->db, *stmt, sqlite3_alter_by_hdr_cb, &vp, &errmsg);

	if (ret != SQLITE_OK) {
		printk(KERN_ERR "Failed getting table info (%s): %s\n", *stmt,
				errmsg);
		sqlite3_free(errmsg);
		goto error_table_info;
	}

	sum_found = 0;
	for (i = 0; i != nr_vals; ++i)
		sum_found += vp.present[i];
	if (sum_found == nr_vals)
		goto out;
	if (sum_found == 0) {

		ret = header_to_csv(hdr, buf, buf_len, QUOTE_SINGLE);
		if (ret) {
			goto error_table_info;
		}

		ret = mem_grow((void**)stmt, stmt_size, strlen(table)
				+ strlen(*buf)
				+ strlen(additional_hdr)
				+ 128);
		if (ret) {
			free(buf);
			goto error_table_info;
		}

		sprintf(*stmt, "CREATE TABLE '%s'(%s,%s);", table,
				additional_hdr, *buf);
		ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
		if (ret != SQLITE_OK) {
			printk(KERN_ERR "Failed to create table (%s): %s\n",
					*stmt, errmsg);
			sqlite3_free(errmsg);
			goto error_table_info;
		}
	} else {
		for (i = 0; vp.vals[i].name != NULL; ++i) {
			if (vp.present[i])
				continue;
			ret = mem_grow((void**)stmt, stmt_size,
					strlen(vp.vals[i].name)
					+ strlen(table) + 128);
			if (ret) {
				goto error_table_info;
			}

			sprintf(*stmt, "ALTER TABLE %s ADD COLUMN '%s';", table,
					vp.vals[i].name);
			ret = sqlite3_exec(d->db, *stmt, NULL, NULL, &errmsg);
			if (ret != SQLITE_OK) {
				printk(KERN_ERR "Failed to add column (%s): %s\n",
						*stmt, errmsg);
				sqlite3_free(errmsg);
				goto error_table_info;
			}
		}
	}

out:
	free(vp.present);
	return 0;

error_table_info:
	free(vp.present);
	return -1;
}