Beispiel #1
0
/*===========================================
 * main -- Main procedure of dbverify command
 *=========================================*/
int
main (int argc, char **argv)
{
    char *flags, *dbname;
    char *ptr;
    char * msg;
    BOOLEAN cflag=FALSE; /* create new db if not found */
    INT writ=1; /* request write access to database */
    BOOLEAN immut=FALSE; /* immutable access to database */
    BOOLEAN allchecks=FALSE; /* if user requested all checks */
    INT returnvalue=1;
    STRING crashlog=NULL;
    INT lldberrnum=0;
    int i=0;

    /* initialize all the low-level library code */
    init_stdlib();

    validate_errs();

#if HAVE_SETLOCALE
    /* initialize locales */
    setlocale(LC_ALL, "");
#endif /* HAVE_SETLOCALE */

#if ENABLE_NLS
    ll_bindtextdomain(PACKAGE, LOCALEDIR);
    textdomain(PACKAGE);
#endif

    save_original_locales();

#ifdef WIN32
    /* TO DO - research if this is necessary */
    _fmode = O_BINARY;	/* default to binary rather than TEXT mode */
#endif

    /* handle conventional arguments --version and --help */
    /* needed for help2man to synthesize manual pages */
    for (i=1; i<argc; ++i) {
        if (!strcmp(argv[i], "--version")) {
            print_version("dbverify");
            return 0;
        }
        if (!strcmp(argv[i], "--help")
                || !strcmp(argv[i], "-?")) {
            print_usage();
            return 0;
        }
    }

    if (argc != 3 || argv[1][0] != '-' || argv[1][1] == '\0') {
        print_usage();
        goto done;
    }
    flags = argv[1];
    dbname = argv[2];
    for (ptr=&flags[1]; *ptr; ++ptr) {
        switch(*ptr) {
        case 'l':
            todo.check_dbstructure=TRUE;
            break;
        case 'g':
            todo.find_ghosts=TRUE;
            break;
        case 'G':
            todo.fix_ghosts=TRUE;
            break;
        case 'i':
            todo.check_indis=TRUE;
            break;
        case 'f':
            todo.check_fams=TRUE;
            break;
        case 's':
            todo.check_sours=TRUE;
            break;
        case 'e':
            todo.check_evens=TRUE;
            break;
        case 'x':
            todo.check_othes=TRUE;
            break;
        case 'n':
            noisy=TRUE;
            break;
        case 'a':
            allchecks=TRUE;
            break;
        case 'F':
            todo.fix_alter_pointers=TRUE;
            break;
        case 'm':
            todo.check_missing_data_records=TRUE;
            break;
        case 'M':
            todo.fix_missing_data_records=TRUE;
            break;
        case 'D':
            todo.fix_deletes=TRUE;
            break;
        case 'v':
            print_version("llexec");
            goto done;
        case 'h':
        default:
            print_usage();
            goto done;
        }
    }

    /* Turn off Memory Debugging */
    /* This is unnecessary -- it is off anyway, Perry, 2001/10/28 */
    alloclog  = FALSE;

    /* Enable any checks needed for fixes selected */
    if (todo.fix_missing_data_records)
        todo.check_missing_data_records = 1;

    /* initialize options & misc. stuff */
    llgettext_set_default_localedir(LOCALEDIR);
    if (!init_lifelines_global(0, &msg, 0)) {
        printf("%s\n", msg);
        goto done;
    }

    /* setup crashlog in case init_screen fails (eg, bad menu shortcuts) */
    crashlog = getlloptstr("CrashLog_dbverify", NULL);
    if (!crashlog) {
        crashlog = "Crashlog_dbverify.log";
    }
    crash_setcrashlog(crashlog);

    /* NB: This assumes btree database */
    if (!(BTR = bt_openbtree(dbname, cflag, writ, immut, &lldberrnum))) {
        char buffer[256];
        describe_dberror(lldberrnum, buffer, ARRSIZE(buffer));
        puts(buffer);
        goto done;
    }

    /*
    Do low-level checks before initializing lifelines database layer,
    because lifelines database init traverses btree for user options
    and translation tables, and here we check the infrastructure of
    the btree itself.
    */
    if (todo.check_dbstructure || allchecks) {
        if (!check_btree(BTR))
            goto done;
    }

    if (!init_lifelines_postdb()) {
        printf(_(qSbaddb));
        goto done;
    }
    printf(_("Checking %s"), dbname);
    puts("");

    /* all checks - if any new ones, have to update this */
    if (allchecks) {
        todo.check_indis=todo.check_fams=todo.check_sours=TRUE;
        todo.check_evens=todo.check_othes=TRUE;
        todo.find_ghosts=TRUE;
    }

    if (todo.find_ghosts || todo.fix_ghosts)
        check_ghosts();


    if (!(bwrite(BTR))) {
        todo.fix_alter_pointers = FALSE;
        todo.fix_ghosts = FALSE;
    }

    if (todo.check_indis
            || todo.check_fams
            || todo.check_sours
            || todo.check_evens
            || todo.check_othes) {
        check_and_fix_records();
    }

    if (todo.check_missing_data_records) {
        check_missing_data_records();
    }

    report_results();

    closebtree(BTR);

    /* TODO: probably should call lldb_close, Perry 2005-10-07 */

    BTR = 0;
    returnvalue = 0;

done:
    return returnvalue;
}
Beispiel #2
0
/*==================================
 * main -- Main routine of LifeLines
 *================================*/
int
main (int argc, char **argv)
{
	extern char *optarg;
	extern int optind;
	char * msg;
	int c;
	BOOLEAN ok=FALSE;
	STRING dbrequested=NULL; /* database (path) requested */
	STRING dbused=NULL; /* database (path) found */
	BOOLEAN forceopen=FALSE, lockchange=FALSE;
	char lockarg = 0; /* option passed for database lock */
	INT alteration=0;
	LIST exprogs=NULL;
	TABLE exargs=NULL;
	STRING progout=NULL;
	BOOLEAN graphical=TRUE;
	STRING configfile=0;
	STRING crashlog=0;
	int i=0;

	/* initialize all the low-level library code */
	init_stdlib();

#if HAVE_SETLOCALE
	/* initialize locales */
	setlocale(LC_ALL, "");
#endif /* HAVE_SETLOCALE */
	
	/* capture user's default codeset */
	ext_codeset = strsave(ll_langinfo());
	/* TODO: We can use this info for default conversions */

#if ENABLE_NLS
	/* setup gettext translation */
	ll_bindtextdomain(PACKAGE, LOCALEDIR);
	textdomain(PACKAGE);
#endif

	save_original_locales();
	load_usage();

	/* handle conventional arguments --version and --help */
	/* needed for help2man to synthesize manual pages */
	for (i=1; i<argc; ++i) {
		if (!strcmp(argv[i], "--version")
			|| !strcmp(argv[i], "-v")) {
			print_version("llexec");
			return 0;
		}
		if (!strcmp(argv[i], "--help")
			|| !strcmp(argv[i], "-h")
			|| !strcmp(argv[i], "-?")) {
			print_usage();
			return 0;
		}
	}

	/* Parse Command-Line Arguments */
	opterr = 0;	/* turn off getopt's error message */
	while ((c = getopt(argc, argv, "adkrwil:fntc:Fu:x:o:zC:I:vh?")) != -1) {
		switch (c) {
		case 'c':	/* adjust cache sizes */
			while(optarg && *optarg) {
				if(isasciiletter((uchar)*optarg) && isupper((uchar)*optarg))
					*optarg = tolower((uchar)*optarg);
				if(*optarg == 'i') {
					INT icsz_indi=0;
					sscanf(optarg+1, "%ld,%ld", &csz_indi, &icsz_indi);
				}
				else if(*optarg == 'f') {
					INT icsz_fam=0;
					sscanf(optarg+1, "%ld,%ld", &csz_fam, &icsz_fam);
				}
				else if(*optarg == 's') {
					INT icsz_sour=0;
					sscanf(optarg+1, "%ld,%ld", &csz_sour, &icsz_sour);
				}
				else if(*optarg == 'e') {
					INT icsz_even=0;
					sscanf(optarg+1, "%ld,%ld", &csz_even, &icsz_even);
				}
				else if((*optarg == 'o') || (*optarg == 'x')) {
					INT icsz_othr=0;
					sscanf(optarg+1, "%ld,%ld", &csz_othr, &icsz_othr);
				}
				optarg++;
				while(*optarg && isdigit((uchar)*optarg)) optarg++;
				if(*optarg == ',') optarg++;
				while(*optarg && isdigit((uchar)*optarg)) optarg++;
			}
			break;
#ifdef FINNISH
# ifdef FINNISHOPTION
		case 'F':	/* Finnish sorting order [toggle] */
			opt_finnish = !opt_finnish;
			/*
			TO DO - need to mark Finnish databases, as 
			name records are not interoperable, because of
			different soundex encoding
			2001/02/17, Perry Rapp
			*/
			break;
# endif
#endif
		case 'a':	/* debug allocation */
			alloclog = TRUE;
			break;
		case 'd':	/* debug = no signal catchers */
			debugmode = TRUE;
			break;
		case 'k':	/* don't show key values */
			keyflag = FALSE;
			break;
		case 'r':	/* request for read only access */
			readonly = TRUE;
			break;
		case 'w':	/* request for write access */
			writeable = TRUE;
			break;
		case 'i': /* immutable access */
			immutable = TRUE;
			readonly = TRUE;
			break;
		case 'l': /* locking switch */
			lockchange = TRUE;
			lockarg = *optarg;
			break;
		case 'f':	/* force database open in all cases */
			forceopen = TRUE;
			break;
		case 'n':	/* use non-traditional family rules */
			traditional = FALSE;
			break;
		case 't': /* show lots of trace statements for debugging */
			prog_trace = TRUE;
			break;
		case 'x': /* execute program */
			if (!exprogs) {
				exprogs = create_list2(LISTDOFREE);
			}
			push_list(exprogs, strdup(optarg ? optarg : ""));
			break;
		case 'I': /* program arguments */
			{
				STRING optname=0, optval=0;
				parse_arg(optarg, &optname, &optval);
				if (optname && optval) {
					if (!exargs) {
						exargs = create_table_str();
					}
					insert_table_str(exargs, optname, optval);
				}
				strfree(&optname);
				strfree(&optval);
			}
			break;
		case 'o': /* output directory */
			progout = optarg;
			break;
		case 'z': /* nongraphical box */
			graphical = FALSE;
			break;
		case 'C': /* specify config file */
			configfile = optarg;
			break;
		case 'v': /* show version */
			showversion = TRUE;
			goto usage;
			break;
		case 'h': /* show usage */
		case '?': /* show usage */
			showversion = TRUE;
			showusage = TRUE;
			goto usage;
			break;
		}
	}

prompt_for_db:

	/* catch any fault, so we can close database */
	if (debugmode)
		stdstring_hardfail();
	else
		set_signals();

	platform_init();
	set_displaykeys(keyflag);
	/* initialize options & misc. stuff */
	llgettext_set_default_localedir(LOCALEDIR);
	if (!init_lifelines_global(configfile, &msg, &main_db_notify)) {
		llwprintf("%s", msg);
		goto finish;
	}
	/* setup crashlog in case init_screen fails (eg, bad menu shortcuts) */
	crashlog = getlloptstr("CrashLog_llexec", NULL);
	if (!crashlog) { crashlog = "Crashlog_llexec.log"; }
	crash_setcrashlog(crashlog);
	init_interpreter(); /* give interpreter its turn at initialization */

	/* Validate Command-Line Arguments */
	if ((readonly || immutable) && writeable) {
		llwprintf(_(qSnorwandro));
		goto finish;
	}
	if (forceopen && lockchange) {
		llwprintf(_(qSnofandl));
		goto finish;
	}
	if (lockchange && lockarg != 'y' && lockarg != 'n') {
		llwprintf(_(qSbdlkar));
		goto finish;
	}
	if (forceopen)
		alteration = 3;
	else if (lockchange) {
		if (lockarg == 'y')
			alteration = 2;
		else
			alteration = 1;
	}
	c = argc - optind;
	if (c > 1) {
		showusage = TRUE;
		goto usage;
	}

	/* Open database, prompting user if necessary */
	if (1) {
		STRING errmsg=0;
		if (!alldone && c>0) {
			dbrequested = strsave(argv[optind]);
		} else {
			strupdate(&dbrequested, "");
		}
		if (!select_database(dbrequested, alteration, &errmsg)) {
			if (errmsg) {
				llwprintf(errmsg);
			}
			alldone = 0;
			goto finish;
		}
	}

	/* Start Program */
	if (!init_lifelines_postdb()) {
		llwprintf(_(qSbaddb));
		goto finish;
	}
	/* does not use show module */
	/* does not use browse module */
	if (exargs) {
		set_cmd_options(exargs);
		release_table(exargs);
		exargs = 0;
	}
	if (exprogs) {
		BOOLEAN picklist = FALSE;
		BOOLEAN timing = FALSE;
		interp_main(exprogs, progout, picklist, timing);
		destroy_list(exprogs);
	} else {
		/* TODO: prompt for report filename */
	}
	/* does not use show module */
	/* does not use browse module */
	ok=TRUE;

finish:
	/* we free this not because we care so much about these tiny amounts
	of memory, but to ensure we have the memory management right */
	/* strfree frees memory & nulls pointer */
	if (dbused) strfree(&dbused);
	strfree(&dbrequested);
	strfree(&readpath_file);
	shutdown_interpreter();
	close_lifelines();
	shutdown_ui(!ok);
	if (alldone == 2)
		goto prompt_for_db; /* changing databases */
	termlocale();
	strfree(&ext_codeset);

usage:
	/* Display Version and/or Command-Line Usage Help */
	if (showversion) { print_version("llexec"); }
	if (showusage) puts(usage_summary);

	/* Exit */
	return !ok;
}