// licensed according to http://code.kx.com/wiki/TermsAndConditions
package kx;
/*
types
20+ userenums
98 table
99 dict
100 lambda
101 unary prim
102 binary prim
103 ternary(operator)
104 projection
105 composition
106 f'
107 f/
108 f\
109 f':
110 f/:
111 f\:
112 dynamic load
*/
import java.util.logging.Level;
import java.util.logging.Logger;
import studio.kdb.K;
import javax.swing.*;
import java.io.*;
import java.net.InetSocketAddress;
//import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
import java.util.UUID;
import studio.kdb.Config;
public class c {
DataInputStream inputStream;
OutputStream outputStream;
byte[] b, B;
int j;
private JFrame frame;
int J;
boolean a;
int rxBufferSize;
public void setFrame(JFrame frame) {
this.frame = frame;
}
void io(Socket s) throws IOException {
s.setTcpNoDelay(true);
inputStream = new DataInputStream(s.getInputStream());
outputStream = s.getOutputStream();
rxBufferSize=s.getReceiveBufferSize();
}
public void close() {
try {
// this will force k() to break out i hope
if (inputStream != null)
try {
inputStream.close();
}
catch (IOException e) {
}
finally {
inputStream = null;
}
if (outputStream != null)
try {
outputStream.close();
}
catch (IOException e) {
}
finally {
outputStream = null;
}
} // synchronized(this)
finally {
frame = null;
closed = true;
}
}
public c() {
}
/* public c(Socket s) throws IOException {
io(s);
inputStream.read(b = new byte[99]);
outputStream.write(b,0,1);
}
public c(ServerSocket s) throws IOException {
this(s.accept());
}
*/
public static class K4AccessException extends Exception {
K4AccessException(String s) {
super(s);
}
}
private final java.util.List responses = java.util.Collections.synchronizedList(new LinkedList());
boolean closed = true;
public boolean isClosed() {
return closed;
}
public K.KBase getResponse() throws Throwable {
Object obj;
synchronized (responses) {
if (responses.size() == 0)
try {
responses.wait();
}
catch (InterruptedException e) {
}
obj = responses.remove(0);
}
if (obj instanceof Throwable)
throw (Throwable) obj;
return (K.KBase) obj;
}
private void startReader() {
Runnable runner = new Runnable() {
public void run() {
while (!closed) {
Object o = null;
try {
o = k();
}
catch (K4Exception e) {
o = e;
}
catch (Throwable t) {
o = t;
close();
}
synchronized (responses) {
responses.add(o);
responses.notify();
}
}
}
};
Thread t = new Thread(runner);
t.start();
}
public void reconnect(boolean retry) throws IOException,K4Exception {
Socket s=new Socket();
s.setReceiveBufferSize(1024*1024);
s.connect(new InetSocketAddress(host,port));
io(s);
java.io.ByteArrayOutputStream baos = new ByteArrayOutputStream();
java.io.DataOutputStream dos = new DataOutputStream(baos);
dos.write((up+(retry?"\3":"")).getBytes());
dos.writeByte(0);
dos.flush();
outputStream.write(baos.toByteArray());
byte[] bytes=new byte[2+up.getBytes().length];
if (1 != inputStream.read(bytes,0,1))
if(retry)
reconnect(false);
else
throw new K4Exception("Authentication failed");
closed = false;
startReader();
}
private String host;
private int port;
private String up;
public c(String h,int p,String u) {
host = h;
port = p;
up = u;
}
boolean rb() {
return 1 == b[j++];
}
short rh() {
int x = b[j++], y = b[j++];
return (short) (a ? x & 0xff | y << 8 : x << 8 | y & 0xff);
}
int ri() {
int x = rh(), y = rh();
return a ? x & 0xffff | y << 16 : x << 16 | y & 0xffff;
}
long rj() {
int x = ri(), y = ri();
return a ? x & 0xffffffffL | (long) y << 32 : (long) x << 32 | y & 0xffffffffL;
}
float re() {
return Float.intBitsToFloat(ri());
}
double rf() {
return Double.longBitsToDouble(rj());
}
UUID rg(){boolean oa=a;a=false;UUID g=new UUID(rj(),rj());a=oa;return g;}
char rc() {
return (char) (b[j++] & 0xff);
}
K.KSymbol rs() {
int n=j;
for (;b[n] != 0;)
++n;
String s=null;
try {
s = new String(b, j, n-j, Config.getInstance().getEncoding());
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(c.class.getName()).log(Level.WARNING, null, ex);
}
j=n;
++j;
return new K.KSymbol(s);
}
K.UnaryPrimitive rup() {
return new K.UnaryPrimitive(b[j++]);
}
K.BinaryPrimitive rbp() {
return new K.BinaryPrimitive(b[j++]);
}
K.TernaryOperator rternary() {
return new K.TernaryOperator(b[j++]);
}
K.Function rfn() {
K.KSymbol s = rs();
return new K.Function((K.KCharacterVector) r());
}
K.Feach rfeach() {
return new K.Feach(r());
}
K.Fover rfover() {
return new K.Fover(r());
}
K.Fscan rfscan() {
return new K.Fscan(r());
}
K.FComposition rcomposition() {
int n = ri();
Object[] objs = new Object[n];
for (int i = 0;i < n;i++)
objs[i] = r();
return new K.FComposition(objs);
}
K.FPrior rfPrior() {
return new K.FPrior(r());
}
K.FEachRight rfEachRight() {
return new K.FEachRight(r());
}
K.FEachLeft rfEachLeft() {
return new K.FEachLeft(r());
}
K.Projection rproj() {
int n = ri();
K.KList list = new K.KList(n);
K.KBase[] array = (K.KBase[]) list.getArray();
for (int i = 0;i < n;i++)
array[i] = r();
return new K.Projection(list);
}
K.Minute ru() {
return new K.Minute(ri());
}
K.Month rm() {
return new K.Month(ri());
}
K.Second rv() {
return new K.Second(ri());
}
K.KTimespan rn() {
return new K.KTimespan(rj());
}
K.KTime rt() {
return new K.KTime(ri());
}
K.KDate rd() {
return new K.KDate(ri());
}
K.KDatetime rz() {
return new K.KDatetime(rf());
}
K.KTimestamp rp() {
return new K.KTimestamp(rj());
}
K.KBase r() {
int i = 0, n, t = b[j++];
if (t < 0)
switch (t) {
case -1:
return new K.KBoolean(rb());
case -2:
return new K.KGuid(rg());
case -4:
return new K.KByte(b[j++]);
case -5:
return new K.KShort(rh());
case -6:
return new K.KInteger(ri());
case -7:
return new K.KLong(rj());
case -8:
return new K.KFloat(re());
case -9:
return new K.KDouble(rf());
case -10:
return new K.KCharacter(rc());
case -11:
return rs();
case -12:
return rp();
case -13:
return rm();
case -14:
return rd();
case -15:
return rz();
case -16:
return rn();
case -17:
return ru();
case -18:
return rv();
case -19:
return rt();
}
if (t == 100)
return rfn(); // fn - lambda
if (t == 101)
return rup(); // unary primitive
if (t == 102)
return rbp(); // binary primitive
if (t == 103)
return rternary();
if (t == 104)
return rproj(); // fn projection
if (t == 105)
return rcomposition();
if (t == 106)
return rfeach(); // f'
if (t == 107)
return rfover(); // f/
if (t == 108)
return rfscan(); //f\
if (t == 109)
return rfPrior(); // f':
if (t == 110)
return rfEachRight(); // f/:
if (t == 111)
return rfEachLeft(); // f\:
if (t == 112) {
// dynamic load
j++;
return null;
}
if(t==127){
K.Dict d=new K.Dict(r(),r());
d.setAttr((byte)1);
return d;
}
if (t > 99) {
j++;
return null;
}
if (t == 99)
return new K.Dict(r(),r());
byte attr = b[j++];
if (t == 98)
return new K.Flip((K.Dict) r());
n = ri();
switch (t) {
case 0: {
K.KList L = new K.KList(n);
L.setAttr(attr);
K.KBase[] array = (K.KBase[]) L.getArray();
for (;i < n;i++)
array[i] = r();
return L;
}
case 1: {
K.KBooleanVector B = new K.KBooleanVector(n);
B.setAttr(attr);
boolean[] array = (boolean[]) B.getArray();
for (;i < n;i++)
array[i] = rb();
return B;
}
case 2: {
K.KGuidVector B = new K.KGuidVector(n);
B.setAttr(attr);
UUID[] array = (UUID[]) B.getArray();
for (;i < n;i++)
array[i] = rg();
return B;
}
case 4: {
K.KByteVector G = new K.KByteVector(n);
G.setAttr(attr);
byte[] array = (byte[]) G.getArray();
for (;i < n;i++)
array[i] = b[j++];
return G;
}
case 5: {
K.KShortVector H = new K.KShortVector(n);
H.setAttr(attr);
short[] array = (short[]) H.getArray();
for (;i < n;i++)
array[i] = rh();
return H;
}
case 6: {
K.KIntVector I = new K.KIntVector(n);
I.setAttr(attr);
int[] array = (int[]) I.getArray();
for (;i < n;i++)
array[i] = ri();
return I;
}
case 7: {
K.KLongVector J = new K.KLongVector(n);
J.setAttr(attr);
long[] array = (long[]) J.getArray();
for (;i < n;i++)
array[i] = rj();
return J;
}
case 8: {
K.KFloatVector E = new K.KFloatVector(n);
E.setAttr(attr);
float[] array = (float[]) E.getArray();
for (;i < n;i++)
array[i] = re();
return E;
}
case 9: {
K.KDoubleVector F = new K.KDoubleVector(n);
F.setAttr(attr);
double[] array = (double[]) F.getArray();
for (;i < n;i++)
array[i] = rf();
return F;
}
case 10: {
K.KCharacterVector C=null;
try{
char[] array=new String(b,j,n, Config.getInstance().getEncoding()).toCharArray();
C = new K.KCharacterVector(array);
C.setAttr(attr);
}catch(UnsupportedEncodingException e){
Logger.getLogger(c.class.getName()).log(Level.WARNING, null, e);
}
j+=n;
return C;
}
case 11: {
K.KSymbolVector S = new K.KSymbolVector(n);
S.setAttr(attr);
String[] array = (String[]) S.getArray();
for (;i < n;i++)
array[i] = rs().s;
return S;
}
case 12: {
K.KTimestampVector P = new K.KTimestampVector(n);
P.setAttr(attr);
long[] array = (long[]) P.getArray();
for (; i < n; i++) {
array[i] = rj();
}
return P;
}
case 13: {
K.KMonthVector M = new K.KMonthVector(n);
M.setAttr(attr);
int[] array = (int[]) M.getArray();
for (;i < n;i++)
array[i] = ri();
return M;
}
case 14: {
K.KDateVector D = new K.KDateVector(n);
D.setAttr(attr);
int[] array = (int[]) D.getArray();
for (;i < n;i++)
array[i] = ri();
return D;
}
case 15: {
K.KDatetimeVector Z = new K.KDatetimeVector(n);
Z.setAttr(attr);
double[] array = (double[]) Z.getArray();
for (;i < n;i++)
array[i] = rf();
return Z;
}
case 16:{
K.KTimespanVector N = new K.KTimespanVector(n);
N.setAttr(attr);
long[] array = (long[]) N.getArray();
for (; i < n; i++) {
array[i] = rj();
}
return N;
}
case 17: {
K.KMinuteVector U = new K.KMinuteVector(n);
U.setAttr(attr);
int[] array = (int[]) U.getArray();
for (;i < n;i++)
array[i] = ri();
return U;
}
case 18: {
K.KSecondVector V = new K.KSecondVector(n);
V.setAttr(attr);
int[] array = (int[]) V.getArray();
for (;i < n;i++)
array[i] = ri();
return V;
}
case 19: {
K.KTimeVector T = new K.KTimeVector(n);
T.setAttr(attr);
int[] array = (int[]) T.getArray();
for (;i < n;i++)
array[i] = ri();
return T;
}
}
return null;
}
void w(int i,K.KBase x) throws IOException {
java.io.ByteArrayOutputStream baosBody = new ByteArrayOutputStream();
java.io.DataOutputStream dosBody = new DataOutputStream(baosBody);
x.serialise(dosBody);
java.io.ByteArrayOutputStream baosHeader = new ByteArrayOutputStream();
java.io.DataOutputStream dosHeader = new DataOutputStream(baosHeader);
dosHeader.writeByte(0);
dosHeader.writeByte(i);
dosHeader.writeByte(0);
dosHeader.writeByte(0);
int msgSize = 8 + dosBody.size();
K.write(dosHeader,msgSize);
byte[] b = baosHeader.toByteArray();
outputStream.write(b);
b = baosBody.toByteArray();
outputStream.write(b);
}
public static class K4Exception extends Exception {
K4Exception(String s) {
super(s);
}
}
public Object k() throws K4Exception,IOException {
boolean responseMsg=false;
boolean c=false;
synchronized(inputStream){
while(!responseMsg){ // throw away incoming aync, and error out on incoming sync
inputStream.readFully(b = new byte[8]);
a = b[0] == 1;
c = b[2] == 1;
byte msgType=b[1];
if(msgType==1){close();throw new IOException("Cannot process sync msg from remote");}
responseMsg=msgType == 2;
j = 4;
final int msgLength = ri() - 8;
final String message = "Receiving "+(c?"compressed ":"")+"data ...";
final String note = "0 of " + (msgLength / 1024) + " kB";
String title = "Studio for kdb+";
UIManager.put("ProgressMonitor.progressText",title);
final int min = 0;
final int max = msgLength;
ProgressMonitor pm = new ProgressMonitor(frame,message,note,min,max);
try {
pm.setMillisToDecideToPopup(300);
pm.setMillisToPopup(100);
pm.setProgress(0);
b = new byte[msgLength];
int total = 0;
int packetSize = 1 + msgLength / 100;
if (packetSize < rxBufferSize)
packetSize = rxBufferSize;
while (total < msgLength) {
if (pm.isCanceled())
throw new IOException("Cancelled by user");
int remainder = msgLength - total;
if (remainder < packetSize)
packetSize = remainder;
total += inputStream.read(b,total,packetSize);
pm.setProgress(total);
pm.setNote((total / 1024) + " of " + (msgLength / 1024) + " kB");
}
}
finally {
pm.close();
}
}
if (c)
u();
else
j = 0;
if (b[0] == -128) {
j = 1;
throw new K4Exception(rs().toString(true));
}
return r();
}
}
private void u() {
int n = 0, r = 0, f = 0, s = 8, p = s;
short i = 0;
j = 0;
byte[] dst = new byte[ri()];
int d = j;
int[] aa = new int[256];
while (s < dst.length) {
if (i == 0) {
f = 0xff & (int) b[d++];
i = 1;
}
if ((f & i) != 0) {
r = aa[0xff & (int) b[d++]];
dst[s++] = dst[r++];
dst[s++] = dst[r++];
n = 0xff & (int) b[d++];
for (int m = 0; m < n; m++) {
dst[s + m] = dst[r + m];
}
} else {
dst[s++] = b[d++];
}
while (p < s - 1) {
aa[(0xff & (int) dst[p]) ^ (0xff & (int) dst[p + 1])] = p++;
}
if ((f & i) != 0) {
p = s += n;
}
i *= 2;
if (i == 256) {
i = 0;
}
}
b = dst;
j = 8;
}
public void k(K.KBase x) throws K4Exception,IOException {
w(1,x);
}
}