1: # include <ingres.h> 2: # include <symbol.h> 3: # include "IIglobals.h" 4: # include <sccs.h> 5: # include <errors.h> 6: 7: SCCSID(@(#)IIn_ret.c 8.3 2/13/85) 8: 9: 10: 11: /* 12: ** IIn_ret -- get next domain in a retrieve 13: ** 14: ** Gets the next domain in a retrieve from the data 15: ** pipe. If an error occurred previously in the tuple, 16: ** will not load the c-var with the value of the domain. 17: ** Performs the conversion from the gotten type to 18: ** the expected type. 19: ** 20: ** Signals any errors and calls IIerror() accordingly. 21: ** 22: ** Expects the type and length of the next data item in 23: ** IIr_sym. 24: ** 25: */ 26: 27: 28: 29: 30: IIn_ret(addr, type) 31: char *addr; 32: int type; 33: { 34: char temp[256], *IIitos(); 35: char *s; 36: register struct retsym *ret; 37: register length; 38: 39: 40: 41: if (IIerrflag && IIerrflag != 1001) 42: return; /* error, no data will be coming, or 43: * the rest of the query should be 44: * skipped 45: */ 46: 47: ret = &IIr_sym; 48: 49: if ((ret->len & I1MASK) && 50: IIpb_get(&IIpb, temp, ret->len & I1MASK) != (ret->len & I1MASK)) 51: IIsyserr("IIn_ret: bad pb_get-1 %d", ret->len & I1MASK); 52: 53: 54: # ifdef xETR1 55: if (IIdebug) 56: { 57: printf("%s ent ", IIproc_name ? IIproc_name: ""); 58: printf("IIn_ret : addr 0%o type %d length %d type %d IIerrflag %d\n", 59: addr, type, ret->len & I1MASK, ret->type, IIerrflag); 60: } 61: # endif 62: 63: 64: IIdomains++; 65: switch (type) 66: { 67: 68: case opSHORT: 69: type = INT; 70: length = 2; 71: break; 72: 73: case opLONG: 74: type = INT; 75: length = 4; 76: break; 77: 78: case opFLOAT: 79: type = FLOAT; 80: length = 4; 81: break; 82: 83: case opDOUBLE: 84: type = FLOAT; 85: length = 8; 86: break; 87: 88: case opSTRING: 89: type = CHAR; 90: length = 255; /* with the current implementation the length is not known */ 91: break; 92: 93: default: 94: IIsyserr("IIn_ret:bad type %d", type); 95: } 96: 97: switch (ret->type) 98: { 99: 100: case INT: 101: case FLOAT: 102: if (type == CHAR) 103: { 104: s = IIitos(IIdomains); 105: IIerrflag = NUMINTOCHAR; 106: IIerror(NUMINTOCHAR, 1, &s); 107: return (0); 108: } 109: if (IIconvert(temp, IIerrflag ? temp : addr, 110: ret->type, ret->len & I1MASK, type, length) < 0) 111: { 112: s = IIitos(IIdomains); 113: IIerrflag = NUMOVFLO; 114: IIerror(NUMOVFLO, 1, &s); 115: } 116: break; 117: 118: case CHAR: 119: if (type != CHAR) 120: { 121: s = IIitos(IIdomains); 122: IIerrflag = CHARINTONUM; 123: IIerror(CHARINTONUM, 1, &s); 124: return (0); 125: } 126: if (!IIerrflag) 127: { 128: IIbmove(temp, addr, ret->len & I1MASK); 129: 130: /* null terminate string */ 131: addr [ret->len & I1MASK] = '\0'; 132: } 133: break; 134: 135: default : 136: IIsyserr("IIn_ret bad gotten type %d", 137: ret->type); 138: } 139: 140: if (IIpb_get(&IIpb, ret, 2) != 2) 141: IIsyserr("IIn_ret : bad pb_get - 2"); 142: }