pike.git / lib / modules / Sql.pmod / pgsql_util.pmod

version» Context lines:

pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:173:    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 MACADDROID:    case BPCHAROID:    case VARCHAROID:    case CTIDOID:    case UUIDOID:    return 1; //binary    }
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:205:    case INT4OID:    case TEXTOID:    case OIDOID:    case XMLOID:    case MACADDROID:    case BPCHAROID:    case VARCHAROID:    case CTIDOID:    case UUIDOID:    return 1; //binary +  case NUMERICOID:    case FLOAT4OID:   #if !constant(__builtin.__SINGLE_PRECISION_FLOAT__)    case FLOAT8OID:   #endif    if (!stringp(value))    return 1;    }    return 0; // text   }   
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:895:    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 INT8OID:case INT2OID:    case OIDOID:case INT4OID:    if (_forcetext) {    value = cr->read(collen);    if (!alltext)    value = (int)value;    } else {    switch (typ) {    case INT8OID:value = cr->read_sint(8);    break;
pike.git/lib/modules/Sql.pmod/pgsql_util.pmod:1074:    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 FLOAT4OID:   #if !constant(__builtin.__SINGLE_PRECISION_FLOAT__)    case FLOAT8OID:   #endif    if (stringp(value))    plugbuffer->add_hstring(value, 4);    else {    int w = dtoid[i] == FLOAT4OID ? 4 : 8;    plugbuffer->add_int32(w)    ->sprintf(w == 4 ? "%4F" : "%8F", value);