static bool _setDecodedParam( Statement* s, unsigned int index, DynamicObject& param, DynamicObject& value) { bool rval = true; if(param->hasMember("encode")) { // FIXME: could use streams here and handle types other than string, // but the DatabaseClient API might be abandoned before this actually // ever really gets used to that extent // fill byte buffer with initial data ByteBuffer b; b.put(value->getString(), value->length(), true); // apply each decoding // FIXME: optimize this by doing it once and storing it when // defining the schema DynamicObject decode = param["encode"].clone(); decode->reverse(); DynamicObjectIterator i = decode.getIterator(); while(rval && i->hasNext()) { const char* type = i->next()->getString(); // convert hex to binary if(strcmp(type, "hex") == 0) { const char* hex = b.bytes(); unsigned int len = b.length(); unsigned int binLen = (len >> 1) + 1; char bin[binLen]; rval = Convert::hexToBytes(hex, len, bin, binLen); if(rval) { b.clear(); b.put(bin, binLen, true); } } } // only blobs are supported at the moment rval = rval && s->setBlob(index, b.bytes(), b.length()); }