void dec_delta(FILE *in_fp) { printf("Delta decoding...\n"); for(curr_channel=0; curr_channel<input_file_header->numChannels; curr_channel++) { if(output_vector[curr_channel]) free(output_vector[curr_channel]); uint32_t output_length; if(first_enc==DELTA) output_length = ((output_buffer[curr_channel].n_bytes*8 - (8-output_buffer[curr_channel].bits_last))/(max_bits[curr_channel]+1)) + 1; else output_length = ((output_buffer[curr_channel].n_bytes*8 - (8-output_buffer[curr_channel].bits_last))/(nbits_run[curr_channel]+nbits_code[curr_channel])) + 1; output_vector[curr_channel] = calloc(output_length, sizeof(uint32_t)); memset(output_vector[curr_channel], 0, output_length); printf("AUIIIIIIIII"); if(first_enc==DELTA) dt_decode(&output_buffer[curr_channel], max_bits[curr_channel], output_vector[curr_channel], output_length, input_file_header->bitsPerSample, firsts[curr_channel]); else dt_decode(&output_buffer[curr_channel], max_bits[curr_channel], output_vector[curr_channel], output_length, nbits_run[curr_channel] + nbits_code[curr_channel], firsts[curr_channel]); bdestroy(&output_buffer[curr_channel]); binit(&output_buffer[curr_channel], output_length); /* O PROBLEMA PODE SER O OUTPUT_LENGTH!!!! */ if(first_enc==DELTA) b_from_uint32_all(&output_buffer[curr_channel], output_vector[curr_channel], output_length, input_file_header->bitsPerSample); else b_from_uint32_all(&output_buffer[curr_channel], output_vector[curr_channel], output_length, nbits_code[curr_channel]+nbits_run[curr_channel]); /*bprint(&output_buffer[curr_channel]);*/ /*bprint( &(output_buffer[curr_channel]));*/ } }
int buf_dt_str(uchar *Buf,int maxSize, char *Fmt, date_time D) { // int len=0; int Start[7],i,k,l=0; char *B=Buf; dt_decode(D, Start+1, Start+2, Start+3, Start+4, Start+5, Start+6); Start[0]=Start[1]%100; i=0; while(*Fmt) { if(l+40>maxSize){ *B=0; return 0; } // No More Size for(i=0; i<13; i++) if(strncmp(Fmdate_time[i].In,Fmt,strlen(Fmdate_time[i].In))==0) break; if(i==13){ l++; *B=*Fmt; Fmt++; B++;} else { if(Fmdate_time[i].Shift==-1) k=sprintf(B,"%s",dt_mon_name[Start[2]]); else k=sprintf(B,Fmdate_time[i].Out,Start[Fmdate_time[i].Shift]); l+=k; B+=k; Fmt+=strlen(Fmdate_time[i].In); } } *B=0; return 1; }
char *dt_str(char *Fmt, date_time D) { char *Buf=NULL; int len=0; int Start[7],i,k,l=0; char *B=Buf; dt_decode(D, Start+1, Start+2, Start+3, Start+4, Start+5, Start+6); Start[0]=Start[1]%100; i=0; while(*Fmt) { if(l+40>len){ Buf=realloc(Buf,l+40); B=Buf+l; len=l+30;} for(i=0; i<13; i++) if(strncmp(Fmdate_time[i].In,Fmt,strlen(Fmdate_time[i].In))==0) break; if(i==13){ l++; *B=*Fmt; Fmt++; B++;} else { if(Fmdate_time[i].Shift==-1) k=sprintf(B,"%s",dt_mon_name[Start[2]]); else k=sprintf(B,Fmdate_time[i].Out,Start[Fmdate_time[i].Shift]); l+=k; B+=k; Fmt+=strlen(Fmdate_time[i].In); } } *B=0; return (Buf); }
// Перекодировка is_null, in bind vars, закачка блобов и потом ora_exec int ora_exec(database *db) { t_ora *o = db->h; db_col *c; int i; if (!o) return ora_error(db); //if (!o->execnum) // { // o->execnum = 1; if (!ora_check_bind(db)) return 0; // Если первый раз - подвязать переменные... // } debugf(" ..ora - check bind ok!\n"); o->execnum++; // Номер запуска exec... for(i=0,c=db->in.cols;i<db->in.count;i++,c++) if ((c->dbflag & 2)==0) { // Все ин-параметры if(c->type==dbDate) // Перекодируем дату { unsigned char *D=(void*)c->dbvalue; double uval = *(double*)c->value; int Year,Month,Day,Hour,Min,Sec; if (!uval) c->null=ORA_NULL; else { c->null=0; dt_decode(uval,&Year,&Month,&Day,&Hour,&Min,&Sec); D[0]=100+Year/100; D[1]=Year%100+100; D[2]=Month; D[3]=Day; D[4]=Hour+1; D[5]=Min+1; D[6]=Sec+1; } //printf("ORA uval=%lf\n",uval); getch(); } else if (c->type == dbBlob && (!(c->dbflag & 2))) { // Закачиваем блобы... db_blob_handle *b = (void*) c->value; // Странно, но я храню блоб тута... int cnt_write = 0, offset = 0, code; cnt_write = b->len; // Сколько записывать... code = OCILobTrim(o->svchp, o->errhp, o->blob,0); //printf("2LobTrimmed data=%d len=%d olob=%d code=%d!\n",b->data,b->len,o->blob,code); c->null = ORA_NULL; if (b->data && b->len>0) { c->null = 0; if ( !ora_ok(db->err_code = OCILobWrite(o->svchp, o->errhp, o->blob, &cnt_write, 1, (dvoid *) b->data, (ub4) b->len, OCI_ONE_PIECE, 0, 0 csid_csfrm) )) { debugf("F**k! cant write blob err_code=%d ND=%d!\n",db->err_code,OCI_NEED_DATA); //if (db->err_code!=-2) // ZU? return ora_error(db); } debugf("vora- ok write %d bytes of lob\n",b->len); } } } debugf(" ..ora - begin OCIStmtExecute stmt=%p!\n",o->stmt); db->err_code = OCIStmtExecute(o->svchp, o->stmt, o->errhp, (ub4) 1, (ub4) 0, (CONST OCISnapshot *) NULL, (OCISnapshot *) NULL,OCI_DEFAULT); debugf("ORARES on exec = %d\n",db->err_code); if (db->err_code == OCI_NO_DATA) return 1; // ExecOK, данные не сфетчились... if (!ora_ok(db->err_code)) return ora_error(db); // А это уже ошибка... debugf("ORA - decode out\n"); //return 1; // Далее - идет обратная декодировка. Пока не отлаживаем for(i = 0, c = db->in.cols;i<db->in.count; i++, c++) if (c->dbflag & 2) { // Смотрим на аут-параметры int is_null; debugf("----ORA --- chek OUT HERE=%s\n",c->name); //printf("NULL=%d on %s\n",*(short*)c->null,c->name); //is_null = c->null && ((*(short*)(c->null)) ); //if (c->null) *(int*)(c->null) = is_null; //printf("Check in var=%s is_null = %d val=%d\n",c->name,is_null,*(int*)c->value); //if (is_null) continue; if ( c->type==dbDate) { unsigned char *D=(void*)c->dbvalue; if (c->null) *(double*)c->value=0; else *(double*)c->value=dt_encode((D[0]-100)*100+(D[1]-100), D[2],D[3],D[4]-1,D[5]-1,D[6]-1); } else if (c->type==dbBlob) { // Вытягиваем блобу... db_blob_handle *b=(void*)c->value; // Это указатель на "вытащенный блоб", его нужно установить на... int cnt_read = 0, offset = 0, blob_length = 0; debugf("ORA --- chek out blob null==%d\n",c->null); if (c->null) {b->len=0; continue;} /// OCILobLock ??? //db->err_code = OCILobOpen ( o->svchp, o->errhp, o->blob_read, OCI_LOB_READONLY ); //printf("Lob opened error = %d\n", db->err_code); //if (db->out.size<1) { // db->out.data = realloc(db->out.data,1); // db->out.size = 1; // } //OCILobRead(o->svchp,o->errhp,o->blob_read, // Интересно, такое бывает? //&cnt_read, 1, db->out.blob, 1 , 0, 0); // Just for FUN ... // printf("Read = %d bytes\n", cnt_read ); if (!ora_ok(db->err_code=OCILobGetLength (o->svchp,o->errhp,o->blob_read, &blob_length))) { debugf("Fail get blob length code=%d result=%d!\n",db->err_code,blob_length); blob_length = 100* 1024 ; // return 1; // ZUZUKA ora_error(db); } //printf("Getting out blob len = %d..\n",blob_length); // - Сюда сливаются БЛОБЫ от SELCETA -- db->out.blob,&db->out.bsize,&db->out.blen if (blob_length +1 >= db->out.bsize) { // Еще место нужно... Realloc... db->out.bsize = blob_length+1024; // Новая длина db->out.blob = realloc(db->out.blob,db->out.bsize); // Думаем что памяти достаточно } if (!ora_ok(db->err_code=OCILobRead(o->svchp,o->errhp,o->blob_read, // Интересно, такое бывает? &cnt_read, 1, db->out.blob, db->out.bsize, 0, 0 csid_csfrm))) { //printf("Fail read blob err=%d!\n"); return ora_error(db); } //OCILobTrim(o->svchp, o->errhp, o->blob_read,0); db->out.blen = cnt_read+1; // Zero termanited на всякий случай... //printf("Read blob len = %d bh=%d\n",cnt_read,b); // Корректируем указатель, т.к. блоб мог реаллокнуться.. b->data = db->out.blob; // Все заточено под один БЛОБ b->len = cnt_read; b->data[b->len] = 0; // Терминирование нулем - вещь полезная... } } return 1; }
int dt2arr(double date, int *Y) { // Extracts date to 7 bytes array ->>> return dt_decode(date, Y, Y+1,Y+2, Y+3,Y+4,Y+5); // Date&Time }
char *dt_rus(date_time D) { int Year,Month,Day,Hour,Min,Sec; dt_decode(D,&Year,&Month,&Day,&Hour,&Min,&Sec); sprintf(szdtfmt,"%02d.%02d.%04d %02d:%02d:%02d",Day,Month,Year,Hour,Min,Sec); return szdtfmt; }