char* ReadLine(int fd)
{
	char buf[N];
	char* result;

	int i = 0, bytesRead = 0;
	for(; i<N; i++)
	{
		buf[i] = 0;
	}
	bytesRead = SafeRead(fd, buf, N);
	if(bytesRead <= 0) return NULL;
	
	for(i=0; i<bytesRead; i++)
		if(buf[i]=='\n')
		{
			buf[i]=0;
			break;
		}
	result = malloc(i+1);
	if(result==NULL)
        FILE_ERR("malloc failed!");
	result[i]=0;
	memcpy(result, buf, i);
	if(-1 == lseek(fd, i - bytesRead + 1, SEEK_CUR))
		FILE_ERR("Error occured using lseek in ReadLine function!");
	return result;
}
Exemple #2
0
char *genStr(char *filename, int len) {
    int fh;
    unsigned char *data;

    if ((fh = open(filename, O_RDONLY)) == -1) FILE_ERR(filename, "open");

    struct stat finfo;
    fstat(fh, &finfo);

    if ((data = mmap(0, finfo.st_size, PROT_READ, MAP_SHARED, fh, 0))
            == MAP_FAILED) FILE_ERR(filename, "mmap");
    if (close(fh) == -1) FILE_ERR(filename, "close");

    int dataIdx = 0, alphabetSize = 1;
    for (; data[dataIdx]; dataIdx += byteLength(data[dataIdx]), ++alphabetSize);
    ++dataIdx;  // we're on the null byte, want to be where data actually starts
    if (alphabetSize*alphabetSize*(8+4*alphabetSize) != finfo.st_size - dataIdx) {
        return "!!! CORRUPT DATA FILE !!!";
    }

    char *str = malloc((len+1) * 4*sizeof *str);
    int a = alphabetSize - 1, b = alphabetSize - 1;
    int strpos = 0;
    for (int i = 0; i < len; ++i) {
        unsigned char *dataPtr = DATA(a, b);
        unsigned long long n = longRand(getLong(dataPtr));
        dataPtr += 8;
        int nextCharPos = 0;
        for (; nextCharPos < alphabetSize; ++nextCharPos) {
            unsigned int m = getInt(dataPtr);
            if (m > n) break;
            n -= m;
            dataPtr += 4;
        }
        a = b;
        b = nextCharPos;
        int alphabetIdx = 0;
        for (; nextCharPos; --nextCharPos) {
            alphabetIdx += byteLength(ALPHABET[alphabetIdx]);
        }
        int nextCharLen = byteLength(ALPHABET[alphabetIdx]);
        for (int i = nextCharLen; i >= 0; --i) {
            str[strpos + i] = ALPHABET[alphabetIdx + i];
        }
        strpos += nextCharLen;
    }
    str[strpos] = '\0';
    //for (int i = 0; i < len*2; ++i) printf("str[%d]: %c\n", i, str[i]);

    if (munmap(data, finfo.st_size) == -1) FILE_ERR(filename, "munmap");

    return str;
}
void work(int info_fd, int log_fd)
{
    data pcData = getData();
    
    // Write to info file as binary serialized data
    ssize_t charWritten = SafeWrite(info_fd, (char*)&pcData, sizeof(data));
    if (charWritten != sizeof(data))
        FILE_ERR("Not all data written to info file");
    
    // Write to log file in csv format
    char* pdDataText = dataToString(&pcData);
    size_t expected_size = strlen(pdDataText)*sizeof(char);
    charWritten = SafeWriteLine(log_fd, pdDataText, expected_size);
    if (charWritten != expected_size)
        FILE_ERR("Not all data written to log file");
    
    free(pdDataText);
}
options* initProgram(int argc, char** argv)
{
    // init, get options and init SMC
    if(setHandler(sigintHandler, SIGINT))
        FILE_ERR("Can't set sigint handler");
    options* opt = getOptions(argc, argv);
    CHECK_ERROR_WHEN_NULL( opt );
    smcInit();
    printOptions(opt);
    return opt;
}
void prepareFiles(int& info_fd, int& log_fd, options* opt)
{
    // Create dir and open info file
    CHECK_ERROR( CreateDirIfNotExists(opt->data_dir) );
    info_fd = OpenFile(opt->data_file, O_WRONLY | O_APPEND | O_CREAT);
    CHECK_ERROR( info_fd );
    
    // Open/Create log file and write column names if file does not exist
    bool logCreate = false;
    if(-1 == access(opt->log_file, F_OK)) logCreate = true;
    log_fd = OpenFile(opt->log_file, O_WRONLY | O_APPEND | O_CREAT);
    CHECK_ERROR( log_fd );
    if(logCreate)
    {
        char* data_labels = getDataLabels(',');
        size_t data_labels_size = strlen(data_labels)*sizeof(char);
        ssize_t data_labels_written = SafeWriteLine(log_fd, data_labels, data_labels_size);
        if (data_labels_written != data_labels_size)
            FILE_ERR("Not all data labels written to log file");
        free(data_labels);
    }
}
Exemple #6
0
int index_get(struct index *idx, struct slice *sk, struct slice *sv)
{
	int ret = 0, value_len, result;
	uint64_t value_off = 0UL;

	struct skipnode *node;
	struct skiplist *cur_list;
	struct skiplist *merge_list;

	/* 
	 * 0) Get from bloomfilter, if bloom_get return 1, next 
	 * 1) First lookup from active memtable 
	 * 2) Then from merge memtable 
	 * 3) Last from sst on-disk indexes 
	 */

	cur_list = idx->list;
	node = skiplist_lookup(cur_list, sk->data);

	if(node) {
		if(node->opt == DEL) {
			ret = -1;
			goto out_get;
		}
		value_off =node->val;
	} else {
		merge_list = idx->park->list;
		if(merge_list) {
			node = skiplist_lookup(merge_list, sk->data);
			if(node && node->opt == ADD)
				value_off = node->val;
		}
	}
	if(value_off == 0UL)
		value_off = sst_getoff(idx->sst, sk);

	if(value_off != 0UL) {
		__be32 be32len;
		lseek(idx->db_rfd, value_off, SEEK_SET);
		result = read(idx->db_rfd, &be32len, sizeof(int));
		if(FILE_ERR(result)) {
			ret = -1;
			goto out_get;
		}

		value_len = from_be32(be32len);
		if(result == sizeof(int)) {
			char *data = malloc(value_len + 1);
			memset(data, 0, value_len+1);
			result = read(idx->db_rfd, data, value_len);
			if(FILE_ERR(result)) {
				free(data);
				ret = -1;
				goto out_get;
			}
			sv->len = value_len;
			sv->data = data;
			return 1;
		}
	} else {
		return 0;
	}
out_get:
	return ret;
}