summaryrefslogtreecommitdiff
path: root/ndb/src/kernel
diff options
context:
space:
mode:
authorunknown <pekka@mysql.com>2005-09-28 19:54:55 +0200
committerunknown <pekka@mysql.com>2005-09-28 19:54:55 +0200
commit9de4fa45f9c533b33af95748c8ae2e1acd83d3ba (patch)
tree5fd8c9161a4d040dac34981cf1ce7a6bb59c4cec /ndb/src/kernel
parentc7853e4775cd43efd8d2436255dc8940a870255a (diff)
downloadmariadb-git-9de4fa45f9c533b33af95748c8ae2e1acd83d3ba.tar.gz
ndb - printSchemaFile: more checks and options
ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp: more checks and options
Diffstat (limited to 'ndb/src/kernel')
-rw-r--r--ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp168
1 files changed, 117 insertions, 51 deletions
diff --git a/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp b/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp
index b9b144cd977..f73654fd9d5 100644
--- a/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp
+++ b/ndb/src/kernel/blocks/dbdict/printSchemaFile.cpp
@@ -1,14 +1,3 @@
-#if 0
-make -f Makefile -f - printSchemaFile <<'_eof_'
-printSchemaFile: printSchemaFile.cpp SchemaFile.hpp
- $(CXXCOMPILE) -o $@ $@.cpp -L../../../common/util/.libs -lgeneral
-ifneq ($(MYSQL_HOME),)
- ln -sf `pwd`/$@ $(MYSQL_HOME)/bin/$@
-endif
-_eof_
-exit $?
-#endif
-
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
@@ -36,14 +25,19 @@ exit $?
static const char* progname = 0;
static bool allflag = false;
static bool checkonly = false;
-static int xitcode = 0;
+static bool equalcontents = false;
+static bool okquiet = false;
static void
usage()
{
- ndbout << "Usage " << progname
- << " [-ac]"
- << " P0.SchemaLog" << endl;
+ ndbout
+ << "Usage: " << progname << " [-aceq]" << " file ..." << endl
+ << "-a print also unused slots" << endl
+ << "-c check only (return status 1 on error)" << endl
+ << "-e check also that the files have identical contents" << endl
+ << "-q no output if file is ok" << endl
+ << "Example: " << progname << " -ceq ndb_*_fs/D[12]/DBDICT/P0.SchemaLog" << endl;
}
static void
@@ -57,52 +51,78 @@ fill(const char * buf, int mod)
}
}
-static void
+static const char*
+version(Uint32 v)
+{
+ static char buf[40];
+ sprintf(buf, "%d.%d.%d", v >> 16, (v >> 8) & 0xFF, v & 0xFF);
+ return buf;
+}
+
+static int
print_head(const char * filename, const SchemaFile * sf)
{
+ int retcode = 0;
+
if (! checkonly) {
ndbout << "----- Schemafile: " << filename << " -----" << endl;
- ndbout_c("Magic: %.*s ByteOrder: %.8x NdbVersion: %d.%d.%d FileSize: %d",
+ ndbout_c("Magic: %.*s ByteOrder: %.8x NdbVersion: %s FileSize: %d",
sizeof(sf->Magic),
sf->Magic,
sf->ByteOrder,
- sf->NdbVersion >> 16,
- (sf->NdbVersion >> 8) & 0xFF,
- sf->NdbVersion & 0xFF,
+ version(sf->NdbVersion),
sf->FileSize);
}
+
+ if (memcmp(sf->Magic, "NDBSCHMA", sizeof(sf->Magic) != 0)) {
+ ndbout << filename << ": invalid header magic" << endl;
+ retcode = 1;
+ }
+
+ if ((sf->NdbVersion >> 16) < 4 || (sf->NdbVersion >> 16) > 9) {
+ ndbout << filename << ": impossible version " << hex << sf->NdbVersion << endl;
+ retcode = 1;
+ }
+
+ return retcode;
}
-static void
-print_old(const char * filename, const SchemaFile * sf)
+static int
+print_old(const char * filename, const SchemaFile * sf, Uint32 sz)
{
- print_head(filename, sf);
+ int retcode = 0;
+
+ if (print_head(filename, sf) != 0)
+ retcode = 1;
for (Uint32 i = 0; i < sf->NoOfTableEntries; i++) {
SchemaFile::TableEntry_old te = sf->TableEntries_old[i];
if (allflag ||
(te.m_tableState != SchemaFile::INIT &&
te.m_tableState != SchemaFile::DROP_TABLE_COMMITTED)) {
- ndbout << "Table " << i << ":"
- << " State = " << te.m_tableState
- << " version = " << te.m_tableVersion
- << " type = " << te.m_tableType
- << " noOfPages = " << te.m_noOfPages
- << " gcp: " << te.m_gcp << endl;
+ if (! checkonly)
+ ndbout << "Table " << i << ":"
+ << " State = " << te.m_tableState
+ << " version = " << te.m_tableVersion
+ << " type = " << te.m_tableType
+ << " noOfPages = " << te.m_noOfPages
+ << " gcp: " << te.m_gcp << endl;
}
}
+ return retcode;
}
-static void
+static int
print(const char * filename, const SchemaFile * xsf, Uint32 sz)
{
int retcode = 0;
- print_head(filename, xsf);
+ if (print_head(filename, xsf) != 0)
+ retcode = 1;
assert(sizeof(SchemaFile) == NDB_SF_PAGE_SIZE);
if (xsf->FileSize != sz || xsf->FileSize % NDB_SF_PAGE_SIZE != 0) {
- ndbout << "***** invalid FileSize " << xsf->FileSize << endl;
+ ndbout << filename << ": invalid FileSize " << xsf->FileSize << endl;
retcode = 1;
}
Uint32 noOfPages = xsf->FileSize / NDB_SF_PAGE_SIZE;
@@ -111,19 +131,23 @@ print(const char * filename, const SchemaFile * xsf, Uint32 sz)
ndbout << "----- Page: " << n << " (" << noOfPages << ") -----" << endl;
}
const SchemaFile * sf = &xsf[n];
+ if (memcmp(sf->Magic, xsf->Magic, sizeof(sf->Magic)) != 0) {
+ ndbout << filename << ": page " << n << " invalid magic" << endl;
+ retcode = 1;
+ }
if (sf->FileSize != xsf->FileSize) {
- ndbout << "***** page " << n << " FileSize changed to " << sf->FileSize << "!=" << xsf->FileSize << endl;
+ ndbout << filename << ": page " << n << " FileSize changed to " << sf->FileSize << "!=" << xsf->FileSize << endl;
retcode = 1;
}
Uint32 cs = 0;
for (Uint32 j = 0; j < NDB_SF_PAGE_SIZE_IN_WORDS; j++)
cs ^= ((const Uint32*)sf)[j];
if (cs != 0) {
- ndbout << "***** page " << n << " invalid CheckSum" << endl;
+ ndbout << filename << ": page " << n << " invalid CheckSum" << endl;
retcode = 1;
}
if (sf->NoOfTableEntries != NDB_SF_PAGE_ENTRIES) {
- ndbout << "***** page " << n << " invalid NoOfTableEntries " << sf->NoOfTableEntries << endl;
+ ndbout << filename << ": page " << n << " invalid NoOfTableEntries " << sf->NoOfTableEntries << endl;
retcode = 1;
}
for (Uint32 i = 0; i < NDB_SF_PAGE_ENTRIES; i++) {
@@ -141,31 +165,41 @@ print(const char * filename, const SchemaFile * xsf, Uint32 sz)
<< " gcp: " << te.m_gcp << endl;
}
if (te.m_unused[0] != 0 || te.m_unused[1] != 0 || te.m_unused[2] != 0) {
- ndbout << "***** entry " << j << " garbage in m_unused[3]" << endl;
+ ndbout << filename << ": entry " << j << " garbage in m_unused[3]" << endl;
retcode = 1;
}
}
}
- if (retcode != 0)
- xitcode = 1;
- else if (checkonly)
- ndbout << "ok: " << filename << endl;
+ return retcode;
}
NDB_COMMAND(printSchemafile,
"printSchemafile", "printSchemafile", "Prints a schemafile", 16384)
{
progname = argv[0];
+ int exitcode = 0;
- while (argv[1][0] == '-') {
+ while (argc > 1 && argv[1][0] == '-') {
if (strchr(argv[1], 'a') != 0)
allflag = true;
if (strchr(argv[1], 'c') != 0)
checkonly = true;
+ if (strchr(argv[1], 'e') != 0)
+ equalcontents = true;
+ if (strchr(argv[1], 'q') != 0)
+ okquiet = true;
+ if (strchr(argv[1], 'h') != 0 || strchr(argv[1], '?') != 0) {
+ usage();
+ return 0;
+ }
argc--, argv++;
}
+ const char * prevfilename = 0;
+ Uint32 * prevbuf = 0;
+ Uint32 prevbytes = 0;
+
while (argc > 1) {
const char * filename = argv[1];
argc--, argv++;
@@ -173,8 +207,9 @@ NDB_COMMAND(printSchemafile,
struct stat sbuf;
const int res = stat(filename, &sbuf);
if (res != 0) {
- ndbout << "Could not find file: \"" << filename << "\"" << endl;
- return 1;
+ ndbout << filename << ": not found errno=" << errno << endl;
+ exitcode = 1;
+ continue;
}
const Uint32 bytes = sbuf.st_size;
@@ -182,25 +217,56 @@ NDB_COMMAND(printSchemafile,
FILE * f = fopen(filename, "rb");
if (f == 0) {
- ndbout << "Failed to open file" << endl;
+ ndbout << filename << ": open failed errno=" << errno << endl;
delete [] buf;
- return 1;
+ exitcode = 1;
+ continue;
}
Uint32 sz = fread(buf, 1, bytes, f);
fclose(f);
if (sz != bytes) {
- ndbout << "Failure while reading file" << endl;
+ ndbout << filename << ": read failed errno=" << errno << endl;
+ delete [] buf;
+ exitcode = 1;
+ continue;
+ }
+
+ if (sz < 32) {
+ ndbout << filename << ": too short (no header)" << endl;
delete [] buf;
- return 1;
+ exitcode = 1;
+ continue;
}
SchemaFile* sf = (SchemaFile *)&buf[0];
+ int ret;
if (sf->NdbVersion < NDB_SF_VERSION_5_0_6)
- print_old(filename, sf);
+ ret = print_old(filename, sf, sz);
else
- print(filename, sf, sz);
- delete [] buf;
+ ret = print(filename, sf, sz);
+
+ if (ret != 0) {
+ ndbout << filename << ": check failed"
+ << " version=" << version(sf->NdbVersion) << endl;
+ exitcode = 1;
+ } else if (! okquiet) {
+ ndbout << filename << ": ok"
+ << " version=" << version(sf->NdbVersion) << endl;
+ }
+
+ if (equalcontents && prevfilename != 0) {
+ if (prevbytes != bytes || memcmp(prevbuf, buf, bytes) != 0) {
+ ndbout << filename << ": differs from " << prevfilename << endl;
+ exitcode = 1;
+ }
+ }
+
+ prevfilename = filename;
+ delete [] prevbuf;
+ prevbuf = buf;
+ prevbytes = bytes;
}
- return xitcode;
+ delete [] prevbuf;
+ return exitcode;
}