Aggiunta eliminazione dei record duplicati sulla 1a chiave

git-svn-id: svn://10.65.10.50/trunk@2700 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1996-03-27 10:36:57 +00:00
parent 364401f662
commit f28253517a

View File

@ -37,7 +37,8 @@
#include <codeb.h>
#include <rectypes.h>
#include <progind.h>
#define MAXLEN 128 /* Lunghezza massima chiave */
#include <checks.h>
#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; j<r->NKeys;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;