// dbconvert.cpp - Convert databases to various MUX formats. // // $Id: dbconvert.cpp,v 1.3 2000/09/18 08:03:42 sdennis Exp $ // #include "copyright.h" #include "autoconf.h" #include "config.h" #undef MEMORY_BASED #include "externs.h" #include "db.h" #include "vattr.h" #include "_build.h" #ifdef RADIX_COMPRESSION #ifndef COMPRESSOR #define COMPRESSOR #endif #include "radix.h" #endif extern void NDECL(cf_init); extern void FDECL(do_dbck, (dbref, dbref, int)); extern void NDECL(init_attrtab); /* * --------------------------------------------------------------------------- * * info: display info about the file being read or written. */ void info(int fmt, int flags, int ver) { const char *cp; switch (fmt) { case F_MUX: cp = "TinyMUX"; break; case F_MUSH: cp = "TinyMUSH"; break; case F_MUSE: cp = "TinyMUSE"; break; case F_MUD: cp = "TinyMUD"; break; case F_MUCK: cp = "TinyMUCK"; break; default: cp = "*unknown*"; break; } Log.printf("%s version %d:", cp, ver); if (flags & V_ZONE) Log.WriteString(" Zone"); if (flags & V_LINK) Log.WriteString(" Link"); if (flags & V_GDBM) Log.WriteString(" GDBM"); if (flags & V_ATRNAME) Log.WriteString(" AtrName"); if (flags & V_ATRKEY) { if ((fmt == F_MUSH) && (ver == 2)) Log.WriteString(" ExtLocks"); else Log.WriteString(" AtrKey"); } if (flags & V_PARENT) Log.WriteString(" Parent"); if (flags & V_COMM) Log.WriteString(" Comm"); if (flags & V_ATRMONEY) Log.WriteString(" AtrMoney"); if (flags & V_XFLAGS) Log.WriteString(" ExtFlags"); Log.WriteString("\n"); } void usage(char *prog) { #ifdef WIN32 #ifdef BETA #if PATCHLEVEL > 0 Log.printf("%s from MUX %s.p%d for Win32 #%s [BETA]\n", prog, MUX_VERSION, PATCHLEVEL, MUX_BUILD_NUM); #else // PATCHLEVEL Log.printf("%s from MUX %s for Win32 #%s [BETA]\n", prog, MUX_VERSION, MUX_BUILD_NUM); #endif // PATCHLEVEL #else // BETA #if PATCHLEVEL > 0 Log.printf("%s from MUX %s.p%d for Win32 #%s [%s]\n", prog, MUX_VERSION, PATCHLEVEL, MUX_BUILD_NUM, MUX_RELEASE_DATE); #else // PATCHLEVEL Log.printf("%s from MUX %s for Win32 #%s [%s]\n", prog, MUX_VERSION, MUX_BUILD_NUM, MUX_RELEASE_DATE); #endif // PATCHLEVEL #endif // BETA #else // WIN32 #ifdef BETA #if PATCHLEVEL > 0 Log.printf("%s from MUX %s.p%d #%s [BETA]\n", prog, MUX_VERSION, PATCHLEVEL, MUX_BUILD_NUM); #else // PATCHLEVEL Log.printf("%s from MUX %s #%s [BETA]\n", prog, MUX_VERSION, MUX_BUILD_NUM); #endif // PATCHLEVEL #else // BETA #if PATCHLEVEL > 0 Log.printf("%s from MUX %s.p%d #%s [%s]\n", prog, MUX_VERSION, PATCHLEVEL, MUX_BUILD_NUM, MUX_RELEASE_DATE); #else // PATCHLEVEL Log.printf("%s from MUX %s #%s [%s]\n", prog, MUX_VERSION, MUX_BUILD_NUM, MUX_RELEASE_DATE); #endif // PATCHLEVEL #endif // BETA #endif // WIN32 Log.printf("Usage: %s gamedb-basename [flags] [<in-file] [>out-file]\n", prog); Log.WriteString(" Available flags are:\n"); Log.WriteString(" C - Perform consistency check\n"); Log.WriteString(" G - Write in dir/pag format g - Write in flat file format\n"); Log.WriteString(" K - Store key as an attribute k - Store key in the header\n"); Log.WriteString(" L - Include link information l - Don't include link information\n"); Log.WriteString(" M - Store attr map if DIRPAG m - Don't store attr map if DIRPAG\n"); Log.WriteString(" N - Store name as an attribute n - Store name in the header\n"); Log.WriteString(" P - Include parent information p - Don't include parent information\n"); Log.WriteString(" W - Write the output file b w - Don't write the output file.\n"); Log.WriteString(" X - Create a default DIRPAG db x - Create a default flat file db\n"); Log.WriteString(" Z - Include zone information z - Don't include zone information\n"); Log.WriteString(" <number> - Set output version number\n"); } long DebugTotalFiles = 3; long DebugTotalThreads = 1; long DebugTotalSemaphores = 0; long DebugTotalSockets = 0; int DCL_CDECL main(int argc, char *argv[]) { int setflags, clrflags, ver; int db_ver, db_format, db_flags, do_check, do_write; char *fp; if ((argc < 2) || (argc > 3)) { usage(argv[0]); exit(1); } SeedRandomNumberGenerator(); cf_init(); #ifdef RADIX_COMPRESSION init_string_compress(); #endif // Decide what conversions to do and how to format the output file. // setflags = clrflags = ver = do_check = 0; do_write = 1; int do_redirect = 0; if (argc >= 3) { for (fp = argv[2]; *fp; fp++) { switch (*fp) { case 'C': do_check = 1; break; case 'G': setflags |= V_GDBM; break; case 'g': clrflags |= V_GDBM; break; case 'Z': setflags |= V_ZONE; break; case 'z': clrflags |= V_ZONE; break; case 'L': setflags |= V_LINK; break; case 'l': clrflags |= V_LINK; break; case 'N': setflags |= V_ATRNAME; break; case 'n': clrflags |= V_ATRNAME; break; case 'K': setflags |= V_ATRKEY; break; case 'k': clrflags |= V_ATRKEY; break; case 'P': setflags |= V_PARENT; break; case 'p': clrflags |= V_PARENT; break; case 'W': do_write = 1; break; case 'w': do_write = 0; break; case 'X': clrflags = 0xffffffff; setflags = OUTPUT_FLAGS; ver = OUTPUT_VERSION; do_redirect = 1; break; case 'x': clrflags = 0xffffffff; setflags = UNLOAD_OUTFLAGS; ver = UNLOAD_VERSION; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ver = ver * 10 + (*fp - '0'); break; default: Log.printf("Unknown flag: '%c'\n", *fp); usage(argv[0]); exit(1); } } } #ifdef WIN32 _setmode(fileno(stdin),O_BINARY); _setmode(fileno(stdout),O_BINARY); #endif // WIN32 // Open the database // init_attrtab(); char dirfile[SIZEOF_PATHNAME]; char pagfile[SIZEOF_PATHNAME]; strcpy(dirfile, argv[1]); strcat(dirfile, ".dir"); strcpy(pagfile, argv[1]); strcat(pagfile, ".pag"); int cc = init_dbfile(dirfile, pagfile); if (cc == HF_OPEN_STATUS_ERROR) { Log.printf("Can't open database in (%s, %s) files\n", dirfile, pagfile); exit(1); } else if (cc == HF_OPEN_STATUS_OLD) { if (setflags == OUTPUT_FLAGS) { Log.printf("Would overwrite existing database (%s, %s)\n", dirfile, pagfile); CLOSE; exit(1); } } else if (cc == HF_OPEN_STATUS_NEW) { if (setflags == UNLOAD_OUTFLAGS) { Log.printf("Database (%s, %s) is empty.\n", dirfile, pagfile); CLOSE; exit(1); } } // Go do it. // if (do_redirect) { extern void cache_redirect(void); cache_redirect(); } setvbuf(stdin, NULL, _IOFBF, 16384); db_read(stdin, &db_format, &db_ver, &db_flags); if (do_redirect) { extern void cache_pass2(void); cache_pass2(); } Log.WriteString("Input: "); info(db_format, db_flags, db_ver); if (do_check) do_dbck(NOTHING, NOTHING, DBCK_FULL); if (do_write) { db_flags = (db_flags & ~clrflags) | setflags; if (db_format != F_MUX) db_ver = 3; if (ver != 0) db_ver = ver; Log.WriteString("Output: "); info(F_MUX, db_flags, db_ver); setvbuf(stdout, NULL, _IOFBF, 16384); db_write(stdout, F_MUX, db_ver | db_flags); } CLOSE; db_free(); return 0; }