Exemple #1
0
static int compat_checkpoint_read( struct deltadb *db, const char *filename )
{
	FILE * file = fopen(filename,"r");
	if(!file) return 0;

	while(1) {
		struct nvpair *nv = nvpair_create();
		if(nvpair_parse_stream(nv,file)) {
			const char *key = nvpair_lookup_string(nv,"key");
			if(key) {
				nvpair_delete(hash_table_remove(db->table,key));
				struct jx *j = nvpair_to_jx(nv);
				/* skip objects that don't match the filter */
				if(deltadb_boolean_expr(db->filter_expr,j)) {
					hash_table_insert(db->table,key,j);
				} else {
					jx_delete(j);
				}
			}
			nvpair_delete(nv);
		} else {
			nvpair_delete(nv);
			break;
		}
	}

	fclose(file);

	return 1;
}
Exemple #2
0
static int compat_checkpoint_read( struct jx_database *db, const char *filename )
{
	FILE * file = fopen(filename,"r");
	if(!file) return 0;

	while(1) {
		struct nvpair *nv = nvpair_create();
		if(nvpair_parse_stream(nv,file)) {
			const char *key = nvpair_lookup_string(nv,"key");
			if(key) {
				nvpair_delete(hash_table_remove(db->table,key));
				struct jx *j = nvpair_to_jx(nv);
				hash_table_insert(db->table,key,j);
			}
			nvpair_delete(nv);
		} else {
			nvpair_delete(nv);
			break;
		}
	}

	fclose(file);

	return 1;
}
static int log_replay( struct nvpair_database *db, const char *filename, time_t snapshot)
{
	FILE *file = fopen(filename,"r");
	if(!file) return 0;
	
	time_t current = 0;
	struct nvpair *nv;

	char line[NVPAIR_LINE_MAX];
	char key[NVPAIR_LINE_MAX];
	char name[NVPAIR_LINE_MAX];
	char value[NVPAIR_LINE_MAX];
	char oper;
	
	while(fgets(line,sizeof(line),file)) {

		int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value);
		if(n<1) continue;

		switch(oper) {
			case 'C':
				nv = nvpair_create();
				nvpair_parse_stream(nv,file);
				nvpair_delete(hash_table_remove(db->table,name));
				hash_table_insert(db->table,key,nv);
				break;
			case 'D':
				nv = hash_table_remove(db->table,key);
				if(nv) nvpair_delete(nv);
				break;
			case 'U':
				nv = hash_table_lookup(db->table,key);
				if(nv) nvpair_insert_string(nv,name,value);
				break;
			case 'R':
				nv = hash_table_lookup(db->table,key);
				if(nv) nvpair_remove(nv,name);
				break;
			case 'T':
				current = atol(key);
				if(current>snapshot) break;
				break;
			default:
				debug(D_NOTICE,"corrupt log data in %s: %s",filename,line);
				break;
		}
	}
	
	fclose(file);

	return 1;
}
static int checkpoint_read( struct deltadb *db )
{
	FILE * file = stdin;
	if(!file) return 0;

	char firstline[NVPAIR_LINE_MAX];
	fgets(firstline, sizeof(firstline), file);
	printf("%s",firstline);

	while(1) {
		int keep = 0;
		struct nvpair *nv = nvpair_create();
		int num_pairs = nvpair_parse_stream(nv,file);
		if(num_pairs>0) {
			const char *key = nvpair_lookup_string(nv,"key");
			if(key) {
				keep = 1;
				struct argument *arg = db->args;
				while (arg!=NULL){
					const char *var = nvpair_lookup_string(nv,arg->param);
					if ( var!=NULL && keep_object(arg,var)==0 ){
						keep = 0;
						break;
					}
					arg = arg->next;
				}

				nvpair_delete(hash_table_remove(db->table,key));
				if (keep==1){
					nvpair_print_text(nv,stdout);
					hash_table_insert(db->table,key,nv);
				}
				
			} else debug(D_NOTICE,"no key in object create.");
		} else if (num_pairs == -1) {
			return 1;
		} else {

			break;
		}
		if (!keep)
			nvpair_delete(nv);

	}
	return 1;
}
Exemple #5
0
int main( int argc, char *argv[] )
{
	int count =0;
	int first = 0;

	printf("{\n");

	while(1) {
		struct nvpair *nv = nvpair_create();
		int r = nvpair_parse_stream(nv,stdin);
		if(r) {
			struct jx *j = nvpair_to_jx(nv);
			const char *name = jx_lookup_string(j,"name");
			const char *host = jx_lookup_string(j,"host");
			int port = jx_lookup_integer(j,"port");

			if(first) {
				first = 0;
			} else {
				printf(",\n");
			}
			printf("\"%s:%s:%d\":",name,host,port);

			jx_print_stream(j,stdout);
			count++;
		} else if(r<0) {
			fprintf(stderr,"nvpair conversion error!\n");
		} else {
			break;
		}

	}

	printf("\n}\n");

	fprintf(stderr,"%d records converted.\n",count);
	return 0;
}
Exemple #6
0
static int log_replay( struct jx_database *db, const char *filename, time_t snapshot)
{
	char line[LOG_LINE_MAX];
	char value[LOG_LINE_MAX];
	char name[LOG_LINE_MAX];
	char key[LOG_LINE_MAX];
	int n;
	struct jx *jvalue, *jobject;

	long long current = 0;

	FILE *file = fopen(filename,"r");
	if(!file) return 0;

	while(fgets(line,sizeof(line),file)) {
		if(line[0]=='C') {
			n = sscanf(line,"C %s %[^\n]",key,value);
			if(n==1) {
				struct nvpair *nv = nvpair_create();
				nvpair_parse_stream(nv,file);
				jvalue = nvpair_to_jx(nv);
				hash_table_insert(db->table,key,jvalue);
			} else if(n==2) {
				jvalue = jx_parse_string(value);
				if(jvalue) {
					hash_table_insert(db->table,key,jvalue);
				} else {
					corrupt_data(filename,line);
				}
			} else {
				corrupt_data(filename,line);
				continue;
			}
		} else if(line[0]=='D') {
			n = sscanf(line,"D %s\n",key);
			if(n!=1) {
				corrupt_data(filename,line);
				continue;
			}
			jx_delete(hash_table_remove(db->table,key));
		} else if(line[0]=='U') {
			n=sscanf(line,"U %s %s %[^\n],",key,name,value);
			if(n!=3) {
				corrupt_data(filename,line);
				continue;
			}
			jobject = hash_table_lookup(db->table,key);
			if(!jobject) {
				corrupt_data(filename,line);
				continue;
			}
			jvalue = jx_parse_string(value);
			if(!jvalue) jvalue = jx_string(value);

			struct jx *jname = jx_string(name);
			jx_delete(jx_remove(jobject,jname));
			jx_insert(jobject,jname,jvalue);
		} else if(line[0]=='R') {
			n=sscanf(line,"R %s %s",key,name);
			if(n!=2) {
				corrupt_data(filename,line);
				continue;
			}
			jobject = hash_table_lookup(db->table,key);
			if(!jobject) {
				corrupt_data(filename,line);
				continue;
			}
			struct jx *jname = jx_string(name);
			jx_delete(jx_remove(jobject,jname));
			jx_delete(jname);
		} else if(line[0]=='T') {
			n = sscanf(line,"T %lld",&current);
			if(n!=1) {
				corrupt_data(filename,line);
				continue;
			}
			if(current>snapshot) break;
		} else if(line[0]=='\n') {
			continue;
		} else {
			corrupt_data(filename,line);
		}

	}

	fclose(file);
	return 1;
}
Exemple #7
0
static int log_play( struct deltadb *db, FILE *stream )
{
	time_t current = 0;
	time_t previous_time = 0;
	int line_number = 0;

	char line[NVPAIR_LINE_MAX];
	char key[NVPAIR_LINE_MAX];
	char name[NVPAIR_LINE_MAX];
	char value[NVPAIR_LINE_MAX];
	char oper;
	
	while(fgets(line,sizeof(line),stream)) {
		//debug(D_NOTICE,"Processed line: %s",line);
		line_number += 1;
		
		if (line[0]=='\n') break;
		
		int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value);
		if(n<1) continue;
		
		struct nvpair *nv;
		
		switch(oper) {
			case 'C':
				nv = nvpair_create();
				int num_pairs = nvpair_parse_stream(nv,stream);
				if(num_pairs>0) {
					nvpair_delete(hash_table_remove(db->table,key));
					hash_table_insert(db->table,key,nv);
				} else if (num_pairs == -1) {
					nvpair_delete(nv);
					break;
				} else {
					nvpair_delete(nv);
				}


				break;
			case 'D':
				nv = hash_table_remove(db->table,key);
				if(nv) nvpair_delete(nv);
				break;
			case 'U':
				nv = hash_table_lookup(db->table,key);
				if(nv) nvpair_insert_string(nv,name,value);
				break;
			case 'R':
				nv = hash_table_lookup(db->table,key);
				if(nv) nvpair_remove(nv,name);
				break;
			case 'T':
				previous_time = current;
				current = atol(key);
				emit_table_values(db,previous_time);
				break;
			default:
				debug(D_NOTICE,"corrupt log data[%i]: %s",line_number,line);
				fflush(stderr);
				break;
		}
	}
	emit_table_values(db,current);
	return 1;
}
static int log_play( struct deltadb *db )
{
	FILE *stream = stdin;
	time_t current = 0;
	struct nvpair *nv;
	int line_number = 0;
	struct hash_table *table = db->table;

	char line[NVPAIR_LINE_MAX];
	char key[NVPAIR_LINE_MAX];
	char name[NVPAIR_LINE_MAX];
	char value[NVPAIR_LINE_MAX];
	char oper;
	
	int notime = 1;
	while(fgets(line,sizeof(line),stream)) {
		
		line_number += 1;
		int keep = 0;
		
		if (line[0]=='.') return 0;
		
		int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value);
		if(n<1) continue;
		
		switch(oper) {
			case 'C':
				nv = nvpair_create();
				int res = nvpair_parse_stream(nv,stream);
				if (res>0){

					keep = 1;
					struct argument *arg = db->args;
					while (arg!=NULL){
						const char *var = nvpair_lookup_string(nv,arg->param);
						if ( var!=NULL && keep_object(arg,var)==0 ){
							keep = 0;
							break;
						}
						arg = arg->next;
					}

					nvpair_delete(hash_table_remove(db->table,key));
					if (keep==1){
						if (notime){
							printf("T %lld\n",(long long)current);
							notime = 0;
						}
						nvpair_print_text(nv,stdout);
						hash_table_insert(db->table,key,nv);
					}

				}
				if (!keep)
					nvpair_delete(nv);
				break;
			case 'D':
				nv = hash_table_remove(table,key);
				if(nv){
					if (notime){
						printf("T %lld\n",(long long)current);
						notime = 0;
					}
					printf("%s",line);
				}//nvpair_delete(nv);
				break;
			case 'U':
				nv = hash_table_lookup(table,key);
				if(nv){
					if (notime){
						printf("T %lld\n",(long long)current);
						notime = 0;
					}
					printf("%s",line);
				}//nvpair_insert_string(nv,name,value);
				break;
			case 'R':
				nv = hash_table_lookup(table,key);
				if(nv){
					if (notime){
						printf("T %lld\n",(long long)current);
						notime = 0;
					}
					printf("%s",line);
				}//nvpair_remove(nv,name);
				break;
			case 'T':
				current = atol(key);
				notime = 1;
				break;
			default:
				debug(D_NOTICE,"corrupt log data[%i]: %s",line_number,line);
				fflush(stderr);
				break;
		}
	}
	return 1;
}
/*
Replay a given log file into the hash table, up to the given snapshot time.
Return true if the stoptime was reached.
*/
static int log_play( struct deltadb *db, FILE *stream  )
{
	struct nvpair *nv;

	char line[NVPAIR_LINE_MAX];
	char key[NVPAIR_LINE_MAX];
	char name[NVPAIR_LINE_MAX];
	char value[NVPAIR_LINE_MAX];
	char oper;

	int first_output = 1;

	time_t previous_time = 0;

	while(fgets(line,sizeof(line),stream)) {
		//debug(D_NOTICE,"Processed line: %s",line);

		int n = sscanf(line,"%c %s %s %[^\n]",&oper,key,name,value);
		if(n<1) continue;

		if(line[0]=='\n') break;

		switch(oper) {
			case 'C':
				nv = nvpair_create();
				nvpair_parse_stream(nv,stream);
				nvpair_delete(hash_table_remove(db->table,name));
				hash_table_insert(db->table,key,nv);
				break;
			case 'D':
				nv = hash_table_remove(db->table,key);
				if(nv) nvpair_delete(nv);
				break;
			case 'U':
				nv = hash_table_lookup(db->table,key);
				if(nv) nvpair_insert_string(nv,name,value);
				break;
			case 'R':
				nv = hash_table_lookup(db->table,key);
				if(nv) nvpair_remove(nv,name);
				break;
			case 'T':
				current = atol(key);
				break;
			default:
				debug(D_NOTICE,"corrupt log data: %s",line);
				break;
		}

		if (previous_time==0){
			previous_time = current;
		} else if(previous_time!=current) {
			emit_all_deltadb_reductions(db,previous_time,first_output);
			first_output = 0;
			previous_time = current;
		}
	}
	emit_all_deltadb_reductions(db,previous_time,first_output);

	return 0;
}