module firebird_resultbuffer; private import ibase; private import std.gc; private import std.string; private import std.stdio; /* private import std.c.time; private import std.c.string; private import std.c.stdlib; */ // // Resultbuffer Block - Used to receive (and process) a results buffer in various API calls // /* final class RESULTBUFFER { private char[] ResultbufferVector; private int ResultbuffermSize; private char[] ResultbufferFindToken(char token) { int len = 0; int i = 0; while(ResultbufferVector[i] != isc_info_end) { if(ResultbufferVector[i] == token) return cast(char[]) ResultbufferVector[i..$].dup; writefln(cast(byte[]) ResultbufferVector, ResultbufferVector[i]); len = isc_vax_integer(cast(char*) &ResultbufferVector[i+1], 2); i += (len + 3); } return null; } private char[] ResultbufferFindToken(char token, char subtoken) { int len = 0; int i = 0; while(ResultbufferVector[i] != isc_info_end) { if (ResultbufferVector[i] == token) { // Found token, now find subtoken int inlen = isc_vax_integer(cast(char*) &ResultbufferVector[i+1], 2); i += 3; while(inlen > 0) { if(ResultbufferVector[i] == subtoken) return cast(char[]) ResultbufferVector[i..$].dup; len = isc_vax_integer(cast(char*)&ResultbufferVector[i+1], 2); i += (len + 3); inlen -= (len + 3); } return null; } len = isc_vax_integer(cast(char*) &ResultbufferVector[i+1], 2); i += (len + 3); } return null; } public: char* ResultbufferHandle() { return ResultbufferVector.ptr; } short ResultbuffSize() { return cast(short) ResultbuffermSize; } this() { ResultbuffermSize = 1024; ResultbufferVector = cast(char[]) malloc(ResultbuffermSize); hasNoPointers(&ResultbufferVector); ResultbufferVector[] = cast(char)255; } this(int Size) { ResultbuffermSize = Size; ResultbufferVector = cast(char[]) malloc(ResultbuffermSize); hasNoPointers(&ResultbufferVector); ResultbufferVector[] = cast(char)255; } ~this() { ResultbufferVector = null; } int ResultbufferGetValue(char token) { int value,len; char[] p = ResultbufferFindToken(token); if(p == null) return -1; len = isc_vax_integer(cast(char*)&p[1], 2); if (len == 0) value = 0; else value = isc_vax_integer(cast(char*)&p[3], cast(short)len); return value; } int ResultbufferGetCountValue(char token) {// Specifically used on tokens like isc_info_insert_count and the like which return detailed counts per relation. We sum up the values. int value,len,i; char[] p = ResultbufferFindToken(token); if (p == null) return -1; i = 0; len = isc_vax_integer(cast(char*)&p[1], 2);// len is the number of bytes in the following array i += 3; value = 0; while(len > 0) {// Each array item is 6 bytes : 2 bytes for the relation_id which we skip, and 4 bytes for the count value which we sum up accross all tables. value += isc_vax_integer(cast(char*)&p[i+2], 4); i += 6; len -= 6; } return value; } int ResultbufferGetValue(char token, char subtoken) { int value, len; char[] p = ResultbufferFindToken(token, subtoken); if (p == null) return -1; len = isc_vax_integer(cast(char*)&p[1], 2); if (len == 0) value = 0; else value = isc_vax_integer(cast(char*)&p[3], cast(short)len); return value; } bool ResultbufferGetBool(char token) { int value; char[] p = ResultbufferFindToken(token); if(p == null) return false; value = isc_vax_integer(cast(char*)&p[1], 4); return value == 0 ? false : true; } int ResultbufferGetString(char token, char[] data) { int len; char[] p = ResultbufferFindToken(token); if(p == null) return -1; len = isc_vax_integer(cast(char*)&p[1], 2); data = p[3..len]; return len; } } */ final class RESULTBUFFER { private char[] ResultbufferVector; private int ResultbuffermSize; private char[] ResultbufferFindToken(char token) { int len = 0; int i = 0; while(ResultbufferVector[i] != isc_info_end) { if(ResultbufferVector[i] == token) return cast(char[]) ResultbufferVector[i..$].dup; len = isc_vax_integer(cast(char*) &ResultbufferVector[i+1], 2); i += (len + 3); } return null; } private char[] ResultbufferFindToken(char token, char subtoken) { int len = 0; int i = 0; while(ResultbufferVector[i] != isc_info_end) { if(ResultbufferVector[i] == token) { // Found token, now find subtoken int inlen = isc_vax_integer(cast(char*) &ResultbufferVector[i+1], 2); i += 3; while(inlen > 0) { if(ResultbufferVector[i] == subtoken) return cast(char[]) ResultbufferVector[i..$].dup; len = isc_vax_integer(cast(char*)&ResultbufferVector[i+1], 2); i += (len + 3); inlen -= (len + 3); } return null; } len = isc_vax_integer(cast(char*) &ResultbufferVector[i+1], 2); i += (len + 3); } return null; } public: char* ResultbufferHandle() { return ResultbufferVector.ptr; } short ResultbuffSize() { return cast(short) ResultbuffermSize; } this() { ResultbuffermSize = 1024; ResultbufferVector.length = ResultbuffermSize; ResultbufferVector[] = cast(char)255; } this(int Size) { ResultbuffermSize = Size; ResultbufferVector.length = ResultbuffermSize; ResultbufferVector[] = cast(char)255; } int ResultbufferGetValue(char token) { int value,len; char[] p = ResultbufferFindToken(token); if(p == null) return -1; len = isc_vax_integer(cast(char*)&p[1], 2); if (len == 0) value = 0; else value = isc_vax_integer(cast(char*)&p[3], cast(short)len); return value; } int ResultbufferGetCountValue(char token) {// Specifically used on tokens like isc_info_insert_count and the like which return detailed counts per relation. We sum up the values. int value,len,i; char[] p = ResultbufferFindToken(token); if(p == null) return -1; i = 0; len = isc_vax_integer(cast(char*)&p[1], 2);// len is the number of bytes in the following array i += 3; value = 0; while(len > 0) {// Each array item is 6 bytes : 2 bytes for the relation_id which we skip, and 4 bytes for the count value which we sum up accross all tables. value += isc_vax_integer(cast(char*)&p[i+2], 4); i += 6; len -= 6; } return value; } int ResultbufferGetValue(char token, char subtoken) { int value, len; char[] p = ResultbufferFindToken(token, subtoken); if(p == null) return -1; len = isc_vax_integer(cast(char*)&p[1], 2); if(len == 0) value = 0; else value = isc_vax_integer(cast(char*)&p[3], cast(short)len); return value; } bool ResultbufferGetBool(char token) { int value; char[] p = ResultbufferFindToken(token); if(p == null) return false; value = isc_vax_integer(cast(char*)&p[1], 4); return value == 0 ? false : true; } int ResultbufferGetString(char token, char[] data) { int len; char[] p = ResultbufferFindToken(token); if(p == null) return -1; len = isc_vax_integer(cast(char*)&p[1], 2); data = p[3..len]; return len; } }