⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bogoqdbmupgrade.c

📁 一个C语言写的快速贝叶斯垃圾邮件过滤工具
💻 C
字号:
/* $Id: bogoQDBMupgrade.c,v 1.7 2006/05/29 14:28:00 relson Exp $ *//*  bogoQDBMupgrade.c -- convert QDBM data base from Hash to B+Tree format  Copyright (C) 2004  Stefan Bellon  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation; either version 2 of the License, or (at  your option) any later version.  This program is distributed in the hope that it will be useful, but  WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program; if not, write to the Free Software  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA*//* additional error checks and cleanups by Matthias Andree */#include <stdio.h>#include <string.h>#include <errno.h>#include <depot.h>#include <cabin.h>#include <villa.h>#include <stdlib.h>#include "datastore_qdbm.h"int main(int argc, char *argv[]){    DEPOT *dho;    VILLA *dhn;    char *new_name;#define TACKON "-new"    const char *tackon = TACKON;    int ret;    int ksiz, dsiz;    char *key, *data;    if (argc < 2 || argc > 4) {	fprintf(stderr,		"Usage: %s <database> [<new database>]\n"		"   or: %s <database> <tempfile> <backup>\n"		"  <new database> defaults to <database>" TACKON "\n"		"  If <backup> is given, <database> is backed up to <backup> and\n"		"  upgraded in place, via <tempfile>.\n",		argv[0], argv[0]);	exit(EXIT_FAILURE);    }    dho = dpopen(argv[1], DP_OREADER, 0);    if (!dho) {	fprintf(stderr, "Couldn't open database '%s': %s\n", argv[1],		dperrmsg(dpecode));	exit(EXIT_FAILURE);    }    if (dpgetflags(dho) & 1) {	fprintf(stderr, "Database '%s' is already in B+ tree format.\n", argv[1]);	dpclose(dho);	exit(EXIT_FAILURE);    }    if (argc >= 3) {	new_name = strdup(argv[2]);    } else {	new_name = malloc(strlen(argv[1]) + strlen(tackon) + 1);	if (new_name) {	    strcpy(new_name, argv[1]);	    strcat(new_name, tackon);	}    }    if (!new_name) {	fprintf(stderr, "Couldn't allocate memory.\n");	dpclose(dho);	exit(EXIT_FAILURE);    }    if (strcmp(new_name, argv[1]) == 0) {	fprintf(stderr, "database and %s must be different files!\n",		argc >= 4 ? "tempfile" : "new database");	dpclose(dho);	free(new_name);	exit(EXIT_FAILURE);    }    remove(new_name); /* start with a fresh data base */    dhn = vlopen(new_name, VL_OWRITER | VL_OCREAT, cmpkey);    if (!dhn) {	fprintf(stderr, "Couldn't create database '%s': %s\n", new_name,		dperrmsg(dpecode));	dpclose(dho);	remove(new_name);	free(new_name);	exit(EXIT_FAILURE);    }    ret = dpiterinit(dho);    if (ret) {	while ((key = dpiternext(dho, &ksiz))) {	    data = dpget(dho, key, ksiz, 0, -1, &dsiz);	    if (data) {		ret = vlput(dhn, key, ksiz, data, dsiz, VL_DOVER);		if (!ret) {		    int i;		    fprintf(stderr, "Error writing key '%.*s', value '0x",			    ksiz, key);		    for (i = 0 ; i < dsiz ; i++)			fprintf(stderr, "%02x", data[i]);		    fprintf(stderr, "': %s\n", dperrmsg(dpecode));		    free(data);		    free(key);		    goto barf;		}		free(data);	    } else {		fprintf(stderr, "Error reading value for key '%.*s': %s\n",			ksiz, key, dperrmsg(dpecode));		free(key);		goto barf;	    }	    free(key);	}    } else {	fprintf(stderr, "Error creating database iterator: %s\n",		dperrmsg(dpecode));	goto barf;    }    if (dpfatalerror(dho)) {	fprintf(stderr, "Error: database has fatal error state after reading.\n"		"Last error was: %s", dperrmsg(dpecode));	goto barf;    }    if (!dpclose(dho)) {	fprintf(stderr, "Error closing input database: %s\n", dperrmsg(dpecode));	goto barf;    }    if (!vlclose(dhn)) {	fprintf(stderr, "Error closing output database: %s\n", dperrmsg(dpecode));	goto barf;    }    if (argc >= 4) {	/* rename output to input, taking care the file is always	 * present */	remove(argv[3]); /* ignore errors */	if (link(argv[1], argv[3])) {	    fprintf(stderr, "Error: cannot link %s to %s: %s\n",		    argv[1], argv[3], strerror(errno));	    free(new_name);	    exit(EXIT_FAILURE);	}	if (rename(new_name, argv[1])) {	    fprintf(stderr, "Error: cannot rename %s to %s: %s\n",		    new_name, argv[1], strerror(errno));	    free(new_name);	    exit(EXIT_FAILURE);	}    }    exit(EXIT_SUCCESS);    /* clean up in case of error */barf:    vlclose(dhn);    remove(new_name);    free(new_name);    dpclose(dho);    exit(EXIT_FAILURE);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -