From f28253517aa242aca6f65b9d8eb80fa7bfa51e35 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 27 Mar 1996 10:36:57 +0000 Subject: [PATCH] Aggiunta eliminazione dei record duplicati sulla 1a chiave git-svn-id: svn://10.65.10.50/trunk@2700 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- include/codeb.c | 152 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 118 insertions(+), 34 deletions(-) diff --git a/include/codeb.c b/include/codeb.c index d2ff95d13..7aed27c1b 100755 --- a/include/codeb.c +++ b/include/codeb.c @@ -37,7 +37,8 @@ #include #include #include -#define MAXLEN 128 /* Lunghezza massima chiave */ +#include +#define MAXLEN 137 /* Lunghezza massima chiave */ extern char* CUpString(char *); @@ -562,23 +563,24 @@ HIDDEN int is_inkey(RecDes *r, int numfield) return(found); } -HIDDEN void do_key(char *fname, RecDes *r, TAG4INFO *tag_info) +HIDDEN void do_key(char *fname, RecDes *r, TAG4INFO *tag_info, int n_keys) { int i,j; - char tiname[9]; /* Tag name, max 8 characters long! */ + char tiname[9]; /* Tag name, max 8 characters long! */ strcpy(tiname,fname); CUpString(tiname); - for (i=0; ((i < MaxKeys) && (i < r->NKeys)); i++) + for (i=0; ((i < MaxKeys) && (i < n_keys)); i++) { tag_info[i].name=(char *)u4alloc(9); - tag_info[i].expression=(char *)u4alloc(128); + tag_info[i].expression=(char *)u4alloc(256); tag_info[i].filter=(char*)u4alloc(20); tag_info[i].descending=0; if (r->Ky[i].DupKeys) tag_info[i].unique=0; else - tag_info[i].unique=e4unique; + tag_info[i].unique= i == 0 ? e4unique : r4unique_continue; +// tag_info[i].unique=e4unique; strcpy(tag_info[i].filter,".NOT. DELETED()"); /* Not available for DBIII and CLIPPER */ strcpy(tag_info[i].name,tiname) ; if (strlen(tiname) < 8) @@ -750,6 +752,68 @@ int DB_packmemo(short vis, const char * filename) return rt; } +/*------------------------------------------------------------------------- + Elimina i record duplicati + --------------------------------------------------------------------------*/ +int DB_clean_file(int handle, const char * filename, char * ff, RecDes * r, bool vis) +{ + TAG4INFO tags[2]; + TAG4 * t; + char s[256]; + int l = 0, rt = 0; + long cnt = 0; + INDEX4 *w = NULL; + long items = DB_reccount(handle); + + if (items == 0) + return 0; + + s[0] = '\0'; + do_key(ff, r, tags, 1); + strcat(tags[0].expression, "+STR(RECNO(),9)"); + w = i4create(dbdata[handle],(char*)filename,tags); + u4free(tags[0].name); + u4free(tags[0].expression); + u4free(tags[0].filter); + if (w == NULL) return code_base.error_code; + t = d4tag_default(dbdata[handle]); + l = expr4key_len(t->expr) - 9; +#ifndef FOXPRO + if (vis) + progind_create(items,"Ricerca record duplicati",1,1,1); +#endif + + rt = t4bottom(t); + + while (code_base.error_code == 0) + { + const char* s0 = t4key(t); + +#ifndef FOXPRO + if (vis) + progind_set_status(++cnt); +#endif + + if (!strncmp(s, s0, l)) + { + x4go(&xdb[handle],t4recno(t)); + d4delete(dbdata[handle]); + } + strncpy(s, s0, l); + if (t4skip(t, -1L) == 0) + break; + + } // while + rt = code_base.error_code; +#ifndef FOXPRO + if (vis) + progind_destroy(); +#endif + + i4close(w); + return rt; +} + /*------------------------------------------------------------------------- Compatta gli indici --------------------------------------------------------------------------*/ @@ -757,7 +821,8 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod) { int rt=0,handle; TAG4INFO tags[MaxKeys+1]; - char s[82]; + char s[82]; + INDEX4 * w = NULL; strcpy(s,"Ricostruzione indici file : "); strcat(s,filename); @@ -769,47 +834,72 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod) { int i; char *ff = find_slash_backslash((char *)filename); - if (vis) - { #ifndef FOXPRO + if (vis) progind_create((long)r->NKeys,s,1,1,1); #endif - } if ((ff == NULL) || *ff == '\0') ff = (char *)filename; else ff++; - do_key(ff,r,tags); - if (u4switch() &2 || u4switch() & 8) /* Clipper and DBIII */ - { - INDEX4 * w = i4create(dbdata[handle],(char*)filename,tags); + do_key(ff,r,tags, r->NKeys); + w = i4create(dbdata[handle],NULL,tags); #ifndef FOXPRO + if (vis) + { progind_set_status((long)r->NKeys); + progind_destroy(); + } #endif - if (w != NULL && code_base.error_code==0) + if (w == NULL) rt = code_base.error_code; + if (rt == e4unique || rt == r4unique) + { + rt = 0; + if (yesno_box("Sono stati rilevati alcuni record duplicati devo eliminarli ?")) + rt = DB_clean_file(handle, (char*) filename, ff, r, vis); + else + tags[0].unique = r4unique_continue; + if (rt == 0) { +#ifndef FOXPRO + if (vis) + progind_create((long)r->NKeys,s,1,1,1); +#endif + w = i4create(dbdata[handle],(char*)filename,tags); + if (w == NULL) rt = code_base.error_code; +#ifndef FOXPRO + if (vis) + { + progind_set_status((long)r->NKeys); + progind_destroy(); + } +#endif + } + } + if (rt == 0) + { + if (u4switch() & 2 || u4switch() & 8) /* Clipper and DBIII */ + { FILE *fp; char cgp[81]; - + strcpy(cgp,filename); - strcat(cgp,".CGP"); + strcat(cgp,".cgp"); if ((fp=fopen(cgp,"w"))!=NULL) { int j; - + for (j=0; jNKeys;j++) fprintf(fp,"%s\n",tags[j].name); fclose(fp); } } - } - if (u4switch() & 1 || u4switch() & 4) /* FOXPRO and DBIV */ - { - INDEX4 * w = i4create(dbdata[handle],NULL,tags); - if (w == NULL) rt = code_base.error_code; -#ifndef FOXPRO - progind_set_status((long)r->NKeys); -#endif +/* + else + if (u4switch() & 1 || u4switch() & 4) // FOXPRO and DBIV + { + } +*/ } for (i=0; ((i < MaxKeys) && (i < r->NKeys)); i++) { @@ -817,17 +907,11 @@ int DB_packindex(short vis, const char * filename, RecDes *r, long *peod) u4free(tags[i].expression); u4free(tags[i].filter); } - if (vis) - { -#ifndef FOXPRO - progind_destroy(); -#endif - } *peod=DB_reccount(handle); DB_close(handle); } code_base.auto_open = 1; - return(code_base.error_code); + return(rt); } @@ -887,7 +971,7 @@ int DB_build(const char * filename, RecDes *r) ff = (char *) filename; else ff++; - do_key(ff,r,tag_info); + do_key(ff,r,tag_info, r->NKeys); if ((dbuilded=d4create(&code_base, (char *)filename, field_info, tag_info))==0) /* deve solo creare il file dati vuoto */ rt=code_base.error_code;