package scouter.server.db;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import scouter.io.DataOutputX;
import scouter.net.TcpFlag;
import scouter.server.Configure;
import scouter.server.Logger;
import scouter.util.DateUtil;
public class BatchZipDB {
static public void write(long time, String objName, String filename, long fileSize, InputStream in) throws IOException{
String path = getDBPath(time, objName);
if (Configure.getInstance().log_udp_batch) {
Logger.println(new StringBuilder(100).append("Batch stack path: ").append(path).toString());
}
File f = new File(path);
if (!f.exists()) {
f.mkdirs();
}
if (!f.exists()) {
throw new IOException("can't create path:" + path);
}
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream(new File(new StringBuilder(100).append(path).append('/').append(filename).append(".zip").toString())));
int totalSize = 0;
int readSize;
byte [] buffer = new byte[1024];
while((readSize = in.read(buffer)) != -1){
out.write(buffer, 0, readSize);
totalSize += readSize;
if(totalSize == fileSize){
break;
}
}
}finally{
if(out != null){
try{out.close(); }catch(Exception ex){}
}
}
}
static public String getDBPath(long time, String objName){
StringBuilder buffer = new StringBuilder();
buffer.append(DBCtr.getRootPath());
buffer.append('/').append(DateUtil.yyyymmdd(time)).append('/').append(objName).append('/').append(DateUtil.getHour(time));
return buffer.toString();
}
static public void read(String objName, long time, String filename, DataOutputX dout) throws IOException {
String path = getDBPath(time, objName);
File f = new File(path);
if (!f.exists()) {
return;
}
BufferedInputStream in = null;
try {
File file = new File(new StringBuilder(100).append(path).append('/').append(filename).toString());
int fileSize = (int)file.length();
int readSize;
int totalSize = 0;
byte [] buffer = new byte[120000];
in = new BufferedInputStream(new FileInputStream(file));
while((readSize = in.read(buffer)) != -1){
if(readSize > 0){
writeBytes(dout, buffer, readSize);
totalSize += readSize;
}
if(totalSize >= fileSize){
break;
}
}
}finally{
if(in != null){
try{in.close(); }catch(Exception ex){}
}
}
}
static private void writeBytes(DataOutputX dout, byte [] data, int size) throws IOException{
dout.writeByte(TcpFlag.HasNEXT);
dout.writeBlob(data, 0, size);
}
}