📄 informix.c
字号:
{ /* TODO: take care of DBCENTURY environment variable */ /* PGSQL functions allow all centuries */ errno = 0; if (PGTYPESdate_defmt_asc(d, fmt, str) == 0) return 0; switch (errno) { case PGTYPES_DATE_ERR_ENOSHORTDATE: return ECPG_INFORMIX_ENOSHORTDATE; case PGTYPES_DATE_ERR_EARGS: case PGTYPES_DATE_ERR_ENOTDMY: return ECPG_INFORMIX_ENOTDMY; case PGTYPES_DATE_BAD_DAY: return ECPG_INFORMIX_BAD_DAY; case PGTYPES_DATE_BAD_MONTH: return ECPG_INFORMIX_BAD_MONTH; default: return ECPG_INFORMIX_BAD_YEAR; }}intrfmtdate(date d, char *fmt, char *str){ errno = 0; if (PGTYPESdate_fmt_asc(d, fmt, str) == 0) return 0; if (errno == ENOMEM) return ECPG_INFORMIX_OUT_OF_MEMORY; return ECPG_INFORMIX_DATE_CONVERT;}intrmdyjul(short mdy[3], date * d){ int mdy_int[3]; mdy_int[0] = mdy[0]; mdy_int[1] = mdy[1]; mdy_int[2] = mdy[2]; PGTYPESdate_mdyjul(mdy_int, d); return 0;}intrdayofweek(date d){ return (PGTYPESdate_dayofweek(d));}/* And the datetime stuff */voiddtcurrent(timestamp * ts){ PGTYPEStimestamp_current(ts);}intdtcvasc(char *str, timestamp * ts){ timestamp ts_tmp; int i; char **endptr = &str; errno = 0; ts_tmp = PGTYPEStimestamp_from_asc(str, endptr); i = errno; if (i) /* TODO: rewrite to Informix error codes */ return i; if (**endptr) { /* extra characters exist at the end */ return ECPG_INFORMIX_EXTRA_CHARS; } /* TODO: other Informix error codes missing */ /* everything went fine */ *ts = ts_tmp; return 0;}intdtcvfmtasc(char *inbuf, char *fmtstr, timestamp * dtvalue){ return PGTYPEStimestamp_defmt_asc(inbuf, fmtstr, dtvalue);}intdtsub(timestamp * ts1, timestamp * ts2, interval * iv){ return PGTYPEStimestamp_sub(ts1, ts2, iv);}intdttoasc(timestamp * ts, char *output){ char *asctime = PGTYPEStimestamp_to_asc(*ts); strcpy(output, asctime); free(asctime); return 0;}intdttofmtasc(timestamp * ts, char *output, int str_len, char *fmtstr){ return PGTYPEStimestamp_fmt_asc(ts, output, str_len, fmtstr);}intintoasc(interval * i, char *str){ errno = 0; str = PGTYPESinterval_to_asc(i); if (!str) return -errno; return 0;}/* * rfmt.c - description * by Carsten Wolff <carsten.wolff@credativ.de>, Wed Apr 2 2003 */static struct{ long val; int maxdigits; int digits; int remaining; char sign; char *val_string;} value;/** * initialize the struct, which holds the different forms * of the long value */static intinitValue(long lng_val){ int i, j; long l, dig; /* set some obvious things */ value.val = lng_val >= 0 ? lng_val : lng_val * (-1); value.sign = lng_val >= 0 ? '+' : '-'; value.maxdigits = log10(2) * (8 * sizeof(long) - 1); /* determine the number of digits */ i = 0; l = 1; do { i++; l *= 10; } while ((l - 1) < value.val && l <= LONG_MAX / 10); if (l <= LONG_MAX / 10) { value.digits = i; l /= 10; } else value.digits = i + 1; value.remaining = value.digits; /* convert the long to string */ if ((value.val_string = (char *) malloc(value.digits + 1)) == NULL) return -1; dig = value.val; for (i = value.digits, j = 0; i > 0; i--, j++) { value.val_string[j] = dig / l + '0'; dig = dig % l; l /= 10; } value.val_string[value.digits] = '\0'; return 0;}/* return the position oft the right-most dot in some string */static intgetRightMostDot(char *str){ size_t len = strlen(str); int i, j; j = 0; for (i = len - 1; i >= 0; i--) { if (str[i] == '.') return len - j - 1; j++; } return -1;}/* And finally some misc functions */intrfmtlong(long lng_val, char *fmt, char *outbuf){ size_t fmt_len = strlen(fmt); size_t temp_len; int i, j, k, dotpos; int leftalign = 0, blank = 0, sign = 0, entity = 0, entitydone = 0, signdone = 0, brackets_ok = 0; char *temp; char tmp[2] = " "; char lastfmt = ' ', fmtchar = ' '; temp = (char *) malloc(fmt_len + 1); /* put all info about the long in a struct */ if (!temp || initValue(lng_val) == -1) { errno = ENOMEM; return -1; } /* '<' is the only format, where we have to align left */ if (strchr(fmt, (int) '<')) leftalign = 1; /* '(' requires ')' */ if (strchr(fmt, (int) '(') && strchr(fmt, (int) ')')) brackets_ok = 1; /* get position of the right-most dot in the format-string */ /* and fill the temp-string wit '0's up to there. */ dotpos = getRightMostDot(fmt); /* start to parse the formatstring */ temp[0] = '\0'; j = 0; /* position in temp */ k = value.digits - 1; /* position in the value_string */ for (i = fmt_len - 1, j = 0; i >= 0; i--, j++) { /* qualify, where we are in the value_string */ if (k < 0) { blank = 1; if (k == -2) entity = 1; else if (k == -1) sign = 1; if (leftalign) { /* can't use strncat(,,0) here, Solaris would freek out */ if (sign) if (signdone) { temp[j] = '\0'; break; } } } /* if we're right side of the right-most dot, print '0' */ if (dotpos >= 0 && dotpos <= i) { if (dotpos < i) { if (fmt[i] == ')') tmp[0] = value.sign == '-' ? ')' : ' '; else tmp[0] = '0'; } else tmp[0] = '.'; strcat(temp, tmp); continue; } /* the ',' needs special attention, if it is in the blank area */ if (blank && fmt[i] == ',') fmtchar = lastfmt; else fmtchar = fmt[i]; /* waiting for the sign */ if (k < 0 && leftalign && sign && !signdone && fmtchar != '+' && fmtchar != '-') continue; /* analyse this format-char */ switch (fmtchar) { case ',': tmp[0] = ','; k++; break; case '*': if (blank) tmp[0] = '*'; else tmp[0] = value.val_string[k]; break; case '&': if (blank) tmp[0] = '0'; else tmp[0] = value.val_string[k]; break; case '#': if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '-': if (sign && value.sign == '-' && !signdone) { tmp[0] = '-'; signdone = 1; } else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '+': if (sign && !signdone) { tmp[0] = value.sign; signdone = 1; } else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '(': if (sign && brackets_ok && value.sign == '-') tmp[0] = '('; else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case ')': if (brackets_ok && value.sign == '-') tmp[0] = ')'; else tmp[0] = ' '; break; case '$': if (blank && !entitydone) { tmp[0] = '$'; entitydone = 1; } else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '<': tmp[0] = value.val_string[k]; break; default: tmp[0] = fmt[i]; } strcat(temp, tmp); lastfmt = fmt[i]; k--; } /* safety-net */ temp[fmt_len] = '\0'; /* reverse the temp-string and put it into the outbuf */ temp_len = strlen(temp); outbuf[0] = '\0'; for (i = temp_len - 1; i >= 0; i--) { tmp[0] = temp[i]; strcat(outbuf, tmp); } outbuf[temp_len] = '\0'; /* cleaning up */ free(temp); free(value.val_string); return 0;}voidrupshift(char *str){ for (; *str != '\0'; str++) if (islower((unsigned char) *str)) *str = toupper((unsigned char) *str); return;}intbyleng(char *str, int len){ for (len--; str[len] && str[len] == ' '; len--); return (len + 1);}voidldchar(char *src, int len, char *dest){ int dlen = byleng(src, len); memmove(dest, src, dlen); dest[dlen] = '\0';}intrgetmsg(int msgnum, char *s, int maxsize){ return 0;}intrtypalign(int offset, int type){ return 0;}intrtypmsize(int type, int len){ return 0;}intrtypwidth(int sqltype, int sqllen){ return 0;}static struct var_list{ int number; void *pointer; struct var_list *next;} *ivlist = NULL;voidECPG_informix_set_var(int number, void *pointer, int lineno){ struct var_list *ptr; for (ptr = ivlist; ptr != NULL; ptr = ptr->next) { if (ptr->number == number) { /* already known => just change pointer value */ ptr->pointer = pointer; return; } } /* a new one has to be added */ ptr = (struct var_list *) calloc(1L, sizeof(struct var_list)); if (!ptr) { struct sqlca_t *sqlca = ECPGget_sqlca(); sqlca->sqlcode = ECPG_OUT_OF_MEMORY; strncpy(sqlca->sqlstate, "YE001", sizeof("YE001")); snprintf(sqlca->sqlerrm.sqlerrmc, sizeof(sqlca->sqlerrm.sqlerrmc), "Out of memory in line %d.", lineno); sqlca->sqlerrm.sqlerrml = strlen(sqlca->sqlerrm.sqlerrmc); /* free all memory we have allocated for the user */ ECPGfree_auto_mem(); } else { ptr->number = number; ptr->pointer = pointer; ptr->next = ivlist; ivlist = ptr; }}void *ECPG_informix_get_var(int number){ struct var_list *ptr; for (ptr = ivlist; ptr != NULL && ptr->number != number; ptr = ptr->next); return (ptr) ? ptr->pointer : NULL;}intrsetnull(int t, char *ptr){ ECPGset_noind_null(t, ptr); return 0;}intrisnull(int t, char *ptr){ return (ECPGis_noind_null(t, ptr));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -