1 module dpq2.conv.from_d_types; 2 3 @safe: 4 5 import dpq2; 6 import std.bitmanip: nativeToBigEndian; 7 import std.traits: isNumeric; 8 9 Value toValue(T)(T v) 10 if(isNumeric!(T)) 11 { 12 return Value(v.nativeToBigEndian.dup, detectOidTypeFromNative!T, false, ValueFormat.BINARY); 13 } 14 15 Value toValue(T)(T v, ValueFormat valueFormat = ValueFormat.BINARY) @trusted 16 if(is(T == string)) 17 { 18 if(valueFormat == ValueFormat.TEXT) v = v~'\0'; // for prepareArgs only 19 20 ubyte[] buf = cast(ubyte[]) v; 21 22 return Value(buf, detectOidTypeFromNative!T, false, valueFormat); 23 } 24 25 Value toValue(T)(T v) 26 if(is(T == ubyte[])) 27 { 28 return Value(v, detectOidTypeFromNative!T, false, ValueFormat.BINARY); 29 } 30 31 Value toValue(T : bool)(T v) @trusted 32 { 33 ubyte[] buf; 34 buf.length = 1; 35 buf[0] = (v ? 1 : 0); 36 37 return Value(buf, detectOidTypeFromNative!T, false, ValueFormat.BINARY); 38 } 39 40 unittest 41 { 42 { 43 Value v = toValue(cast(short) 123); 44 45 assert(v.oidType == OidType.Int2); 46 assert(v.as!short == 123); 47 } 48 49 { 50 Value v = toValue(-123.456); 51 52 assert(v.oidType == OidType.Float8); 53 assert(v.as!double == -123.456); 54 } 55 56 { 57 Value v = toValue("Test string"); 58 59 assert(v.oidType == OidType.Text); 60 assert(v.as!string == "Test string"); 61 } 62 63 { 64 ubyte[] buf = [0, 1, 2, 3, 4, 5]; 65 Value v = toValue(buf.dup); 66 67 assert(v.oidType == OidType.ByteArray); 68 assert(v.as!(const ubyte[]) == buf); 69 } 70 71 { 72 Value t = toValue(true); 73 Value f = toValue(false); 74 75 assert(t.as!bool == true); 76 assert(f.as!bool == false); 77 } 78 }