pike.git
/
lib
/
modules
/
Sql.pmod
/
pgsql_util.pmod
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:174:
case BOOLOID: case BYTEAOID: case CHAROID: case INT8OID: case INT2OID: case INT4OID: case FLOAT4OID: #if !constant(__builtin.__SINGLE_PRECISION_FLOAT__) case FLOAT8OID: #endif
+
case NUMERICOID:
case TEXTOID: case OIDOID: case XMLOID: case DATEOID: case TIMEOID: case TIMETZOID: case TIMESTAMPOID: case TIMESTAMPTZOID: case INTERVALOID: case INT4RANGEOID:
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:219:
case INT4OID: case TEXTOID: case OIDOID: case XMLOID: case MACADDROID: case BPCHAROID: case VARCHAROID: case CTIDOID: case UUIDOID: return 1; //binary
+
case NUMERICOID:
case CIDROID: case INETOID: case DATEOID: case TIMEOID: case TIMETZOID: case TIMESTAMPOID: case TIMESTAMPTZOID: case INTERVALOID: case INT4RANGEOID: case INT8RANGEOID:
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:938:
break; case TEXTOID: case BPCHAROID: case VARCHAROID: value = cr->read(collen); if (cenc == UTF8CHARSET && catch(value = utf8_to_string(value)) && !serror) serror = SERROR("%O contains non-%s characters\n", value, UTF8CHARSET); break;
+
case NUMERICOID:
+
if (_forcetext) {
+
value = cr->read(collen);
+
if (!alltext) {
+
value = value/".";
+
if (sizeof(value) == 1)
+
value = (int)value[0];
+
else {
+
int i = sizeof(value[1]);
+
int denom = 1;
+
do
+
denom *= 10;
+
while (--i >= 0);
+
value = Gmp.mpq((int)value[0] * denom + (int)value[1],
+
denom);
+
}
+
}
+
} else {
+
int nwords = cr->read_int16();
+
int magnitude = cr->read_sint(2);
+
int sign = cr->read_int16();
+
cr->consume(2);
+
switch (nwords) {
+
default:
+
for (value = cr->read_int16();
+
--nwords;
+
magnitude--)
+
value = value * NUMERIC_MAGSTEP + cr->read_int16();
+
if (sign)
+
value = -value;
+
if (magnitude > 0)
+
do
+
value *= NUMERIC_MAGSTEP;
+
while (--magnitude);
+
else if (magnitude < 0) {
+
for (sign = NUMERIC_MAGSTEP;
+
++magnitude;
+
sign *= NUMERIC_MAGSTEP);
+
value = Gmp.mpq(value, sign);
+
}
+
break;
+
case 1:
+
for (value = cr->read_int16();
+
magnitude--;
+
value *= NUMERIC_MAGSTEP);
+
if (sign)
+
value = -value;
+
break;
+
case 0:;
+
value = 0;
+
}
+
}
+
break;
case INT4RANGEOID: case INT8RANGEOID: case DATERANGEOID: case TSRANGEOID: case TSTZRANGEOID: if (_forcetext) value = cr->read(collen); else { array totype = oidtotype[typ]; mixed from = -Math.inf, till = Math.inf;
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:1187:
SUSERERROR( "\"char\" types must be 1 byte wide, got %O\n", value); case 0: plugbuffer->add_int32(-1); // NULL break; case 1: plugbuffer->add_hstring(value[0], 4); } } break;
+
case NUMERICOID:
+
if (stringp(value))
+
plugbuffer->add_hstring(value, 4);
+
else {
+
int num, den, sign, magnitude = 0;
+
value = Gmp.mpq(value);
+
num = value->num();
+
den = value->den();
+
for (value = den;
+
value > NUMERIC_MAGSTEP;
+
value /= NUMERIC_MAGSTEP);
+
if (value > 1) {
+
value = NUMERIC_MAGSTEP / value;
+
num *= value;
+
den *= value;
+
}
+
if (num < 0)
+
sign = 0x4000, num = -num;
+
else
+
sign = 0;
+
array stor = ({});
+
if (num) {
+
while (!(num % NUMERIC_MAGSTEP))
+
num /= NUMERIC_MAGSTEP, magnitude++;
+
do
+
stor = ({num % NUMERIC_MAGSTEP}) + stor, magnitude++;
+
while (num /= NUMERIC_MAGSTEP);
+
num = --magnitude << 2;
+
while (den > 1)
+
magnitude--, den /= NUMERIC_MAGSTEP;
+
}
+
plugbuffer->add_int32(4 * 2 + (sizeof(stor) << 1))
+
->add_int16(sizeof(stor))->add_int16(magnitude)
+
->add_int16(sign)->add_int16(num)->add_ints(stor, 2);
+
}
+
break;
case INT4RANGEOID: case INT8RANGEOID: case DATERANGEOID: case TSRANGEOID: case TSTZRANGEOID: if (stringp(value)) plugbuffer->add_hstring(value, 4); else if (value->from >= value->till) plugbuffer->add("\0\0\0\1\1"); else {