package com.ctriposs.tsdb.table;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
import com.ctriposs.tsdb.ILogWriter;
import com.ctriposs.tsdb.common.IStorage;
import com.ctriposs.tsdb.common.MapFileStorage;
import com.ctriposs.tsdb.storage.FileName;
import com.ctriposs.tsdb.util.ByteUtil;
public class MapFileLogWriter implements ILogWriter {
private IStorage storage;
private AtomicInteger current;
public MapFileLogWriter(String dir, long fileNumber, long capacity) throws IOException {
this.current = new AtomicInteger(0);
this.storage = new MapFileStorage(dir, System.currentTimeMillis(), FileName.logFileName(fileNumber), capacity);
}
public MapFileLogWriter(String dir, String fileName, long capacity) throws IOException {
this.current = new AtomicInteger(0);
this.storage = new MapFileStorage(dir, System.currentTimeMillis(), fileName, capacity);
}
public MapFileLogWriter(File file) throws IOException {
this.current = new AtomicInteger(0);
this.storage = new MapFileStorage(file);
}
@Override
public void close() throws IOException {
this.storage.close();
}
@Override
public void add(int code, long time, byte[] value) throws IOException {
int metaOffset = current.getAndAdd(16 + value.length);
storage.put(metaOffset, ByteUtil.toBytes(code));
storage.put(metaOffset + 4, ByteUtil.toBytes(time));
storage.put(metaOffset + 12, ByteUtil.toBytes(value.length));
storage.put(metaOffset + 16, value);
}
public boolean add(String name, short code) throws IOException {
byte[] nameBytes = ByteUtil.ToBytes(name);
int offset = current.getAndAdd(6 + nameBytes.length);
if(current.get()>MemTable.MAX_MEM_SIZE){
return false;
}
storage.put(offset, ByteUtil.toBytes(code));
storage.put(offset + 2, ByteUtil.toBytes(nameBytes.length));
storage.put(offset + 6, nameBytes);
return true;
}
@Override
public String getName() {
return storage.getName();
}
@Override
public int getLength() {
return current.get();
}
}