mdbx-tools: more for quiet mode inside mdbx_load.

Change-Id: I31839d530b94516c9819e6600fd808a3c97c609a
This commit is contained in:
Leonid Yuriev 2021-03-11 17:02:43 +03:00
parent f01e0efc2d
commit 0603dd8305

View File

@ -46,14 +46,17 @@ static void signal_handler(int sig) {
#endif /* !WINDOWS */ #endif /* !WINDOWS */
static char *prog; static char *prog;
static bool quiet = false;
static size_t lineno; static size_t lineno;
static void error(const char *func, int rc) { static void error(const char *func, int rc) {
if (!quiet) {
if (lineno) if (lineno)
fprintf(stderr, "%s: at input line %" PRIiSIZE ": %s() error %d, %s\n", fprintf(stderr, "%s: at input line %" PRIiSIZE ": %s() error %d, %s\n",
prog, lineno, func, rc, mdbx_strerror(rc)); prog, lineno, func, rc, mdbx_strerror(rc));
else else
fprintf(stderr, "%s: %s() error %d %s\n", prog, func, rc, fprintf(stderr, "%s: %s() error %d %s\n", prog, func, rc,
mdbx_strerror(rc)); mdbx_strerror(rc));
}
} }
static char *valstr(char *line, const char *item) { static char *valstr(char *line, const char *item) {
@ -63,8 +66,10 @@ static char *valstr(char *line, const char *item) {
if (line[len] != '=') { if (line[len] != '=') {
if (line[len] > ' ') if (line[len] > ' ')
return nullptr; return nullptr;
fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected line format for '%s'\n", if (!quiet)
prog, lineno, item); fprintf(stderr,
"%s: line %" PRIiSIZE ": unexpected line format for '%s'\n", prog,
lineno, item);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
char *ptr = strchr(line, '\n'); char *ptr = strchr(line, '\n');
@ -81,9 +86,10 @@ static bool valnum(char *line, const char *item, uint64_t *value) {
char *end = nullptr; char *end = nullptr;
*value = strtoull(str, &end, 0); *value = strtoull(str, &end, 0);
if (end && *end) { if (end && *end) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": unexpected number format for '%s'\n", prog, "%s: line %" PRIiSIZE ": unexpected number format for '%s'\n",
lineno, item); prog, lineno, item);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
return true; return true;
@ -95,8 +101,9 @@ static bool valbool(char *line, const char *item, bool *value) {
return false; return false;
if (u64 > 1) { if (u64 > 1) {
fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected value for '%s'\n", prog, if (!quiet)
lineno, item); fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected value for '%s'\n",
prog, lineno, item);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
*value = u64 != 0; *value = u64 != 0;
@ -157,6 +164,7 @@ static int readhdr(void) {
if (valnum(dbuf.iov_base, "VERSION", &u64)) { if (valnum(dbuf.iov_base, "VERSION", &u64)) {
if (u64 != 3) { if (u64 != 3) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": unsupported value %" PRIu64 "%s: line %" PRIiSIZE ": unsupported value %" PRIu64
" for %s\n", " for %s\n",
@ -167,17 +175,19 @@ static int readhdr(void) {
} }
if (valnum(dbuf.iov_base, "db_pagesize", &u64)) { if (valnum(dbuf.iov_base, "db_pagesize", &u64)) {
if (!(mode & GLOBAL) && envinfo.mi_dxb_pagesize != u64) if (!(mode & GLOBAL) && envinfo.mi_dxb_pagesize != u64) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore value %" PRIu64 "%s: line %" PRIiSIZE ": ignore value %" PRIu64
" for '%s' in non-global context\n", " for '%s' in non-global context\n",
prog, lineno, u64, "db_pagesize"); prog, lineno, u64, "db_pagesize");
else if (u64 < MDBX_MIN_PAGESIZE || u64 > MDBX_MAX_PAGESIZE) } else if (u64 < MDBX_MIN_PAGESIZE || u64 > MDBX_MAX_PAGESIZE) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore unsupported value %" PRIu64 "%s: line %" PRIiSIZE ": ignore unsupported value %" PRIu64
" for %s\n", " for %s\n",
prog, lineno, u64, "db_pagesize"); prog, lineno, u64, "db_pagesize");
else } else
envinfo.mi_dxb_pagesize = (uint32_t)u64; envinfo.mi_dxb_pagesize = (uint32_t)u64;
continue; continue;
} }
@ -192,8 +202,10 @@ static int readhdr(void) {
mode &= ~PRINT; mode &= ~PRINT;
continue; continue;
} }
fprintf(stderr, "%s: line %" PRIiSIZE ": unsupported value '%s' for %s\n", if (!quiet)
prog, lineno, str, "format"); fprintf(stderr,
"%s: line %" PRIiSIZE ": unsupported value '%s' for %s\n", prog,
lineno, str, "format");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -203,6 +215,7 @@ static int readhdr(void) {
free(subname); free(subname);
subname = mdbx_strdup(str); subname = mdbx_strdup(str);
if (!subname) { if (!subname) {
if (!quiet)
perror("strdup()"); perror("strdup()");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -213,9 +226,10 @@ static int readhdr(void) {
str = valstr(dbuf.iov_base, "type"); str = valstr(dbuf.iov_base, "type");
if (str) { if (str) {
if (strcmp(str, "btree") != 0) { if (strcmp(str, "btree") != 0) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": unsupported value '%s' for %s\n", prog, "%s: line %" PRIiSIZE ": unsupported value '%s' for %s\n",
lineno, str, "type"); prog, lineno, str, "type");
free(subname); free(subname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -223,52 +237,60 @@ static int readhdr(void) {
} }
if (valnum(dbuf.iov_base, "mapaddr", &u64)) { if (valnum(dbuf.iov_base, "mapaddr", &u64)) {
if (u64) if (u64) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64 "%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64
" for %s\n", " for %s\n",
prog, lineno, u64, "mapaddr"); prog, lineno, u64, "mapaddr");
}
continue; continue;
} }
if (valnum(dbuf.iov_base, "mapsize", &u64)) { if (valnum(dbuf.iov_base, "mapsize", &u64)) {
if (!(mode & GLOBAL)) if (!(mode & GLOBAL)) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore value %" PRIu64 "%s: line %" PRIiSIZE ": ignore value %" PRIu64
" for '%s' in non-global context\n", " for '%s' in non-global context\n",
prog, lineno, u64, "mapsize"); prog, lineno, u64, "mapsize");
else if (u64 < MIN_MAPSIZE || u64 > MAX_MAPSIZE64) } else if (u64 < MIN_MAPSIZE || u64 > MAX_MAPSIZE64) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64 "%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64
" for %s\n", " for %s\n",
prog, lineno, u64, "mapsize"); prog, lineno, u64, "mapsize");
else } else
envinfo.mi_mapsize = (size_t)u64; envinfo.mi_mapsize = (size_t)u64;
continue; continue;
} }
if (valnum(dbuf.iov_base, "maxreaders", &u64)) { if (valnum(dbuf.iov_base, "maxreaders", &u64)) {
if (!(mode & GLOBAL)) if (!(mode & GLOBAL)) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore value %" PRIu64 "%s: line %" PRIiSIZE ": ignore value %" PRIu64
" for '%s' in non-global context\n", " for '%s' in non-global context\n",
prog, lineno, u64, "maxreaders"); prog, lineno, u64, "maxreaders");
else if (u64 < 1 || u64 > MDBX_READERS_LIMIT) } else if (u64 < 1 || u64 > MDBX_READERS_LIMIT) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64 "%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64
" for %s\n", " for %s\n",
prog, lineno, u64, "maxreaders"); prog, lineno, u64, "maxreaders");
else } else
envinfo.mi_maxreaders = (int)u64; envinfo.mi_maxreaders = (int)u64;
continue; continue;
} }
if (valnum(dbuf.iov_base, "txnid", &u64)) { if (valnum(dbuf.iov_base, "txnid", &u64)) {
if (u64 < MIN_TXNID || u64 > MAX_TXNID) if (u64 < MIN_TXNID || u64 > MAX_TXNID) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64 "%s: line %" PRIiSIZE ": ignore unsupported value 0x%" PRIx64
" for %s\n", " for %s\n",
prog, lineno, u64, "txnid"); prog, lineno, u64, "txnid");
} else
txnid = u64; txnid = u64;
continue; continue;
} }
@ -280,17 +302,19 @@ static int readhdr(void) {
str = valstr(dbuf.iov_base, "geometry"); str = valstr(dbuf.iov_base, "geometry");
if (str) { if (str) {
if (!(mode & GLOBAL)) if (!(mode & GLOBAL)) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore values %s" "%s: line %" PRIiSIZE ": ignore values %s"
" for '%s' in non-global context\n", " for '%s' in non-global context\n",
prog, lineno, str, "geometry"); prog, lineno, str, "geometry");
else if (sscanf(str, } else if (sscanf(str,
"l%" PRIu64 ",c%" PRIu64 ",u%" PRIu64 ",s%" PRIu64 "l%" PRIu64 ",c%" PRIu64 ",u%" PRIu64 ",s%" PRIu64
",g%" PRIu64, ",g%" PRIu64,
&envinfo.mi_geo.lower, &envinfo.mi_geo.current, &envinfo.mi_geo.lower, &envinfo.mi_geo.current,
&envinfo.mi_geo.upper, &envinfo.mi_geo.shrink, &envinfo.mi_geo.upper, &envinfo.mi_geo.shrink,
&envinfo.mi_geo.grow) != 5) { &envinfo.mi_geo.grow) != 5) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": unexpected line format for '%s'\n", "%s: line %" PRIiSIZE ": unexpected line format for '%s'\n",
prog, lineno, "geometry"); prog, lineno, "geometry");
@ -301,13 +325,15 @@ static int readhdr(void) {
str = valstr(dbuf.iov_base, "canary"); str = valstr(dbuf.iov_base, "canary");
if (str) { if (str) {
if (!(mode & GLOBAL)) if (!(mode & GLOBAL)) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": ignore values %s" "%s: line %" PRIiSIZE ": ignore values %s"
" for '%s' in non-global context\n", " for '%s' in non-global context\n",
prog, lineno, str, "canary"); prog, lineno, str, "canary");
else if (sscanf(str, "v%" PRIu64 ",x%" PRIu64 ",y%" PRIu64 ",z%" PRIu64, } else if (sscanf(str, "v%" PRIu64 ",x%" PRIu64 ",y%" PRIu64 ",z%" PRIu64,
&canary.v, &canary.x, &canary.y, &canary.z) != 4) { &canary.v, &canary.x, &canary.y, &canary.z) != 4) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": unexpected line format for '%s'\n", "%s: line %" PRIiSIZE ": unexpected line format for '%s'\n",
prog, lineno, "canary"); prog, lineno, "canary");
@ -333,15 +359,17 @@ static int readhdr(void) {
return MDBX_SUCCESS; return MDBX_SUCCESS;
} }
if (!quiet)
fprintf(stderr, fprintf(stderr,
"%s: line %" PRIiSIZE ": unrecognized keyword ignored: %s\n", prog, "%s: line %" PRIiSIZE ": unrecognized keyword ignored: %s\n",
lineno, (char *)dbuf.iov_base); prog, lineno, (char *)dbuf.iov_base);
next:; next:;
} }
return EOF; return EOF;
} }
static int badend(void) { static int badend(void) {
if (!quiet)
fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected end of input\n", prog, fprintf(stderr, "%s: line %" PRIiSIZE ": unexpected end of input\n", prog,
lineno); lineno);
return errno ? errno : MDBX_ENODATA; return errno ? errno : MDBX_ENODATA;
@ -395,8 +423,10 @@ static int readline(MDBX_val *out, MDBX_val *buf) {
while (c1[len - 1] != '\n') { while (c1[len - 1] != '\n') {
buf->iov_base = mdbx_realloc(buf->iov_base, buf->iov_len * 2); buf->iov_base = mdbx_realloc(buf->iov_base, buf->iov_len * 2);
if (!buf->iov_base) { if (!buf->iov_base) {
fprintf(stderr, "%s: line %" PRIiSIZE ": out of memory, line too long\n", if (!quiet)
prog, lineno); fprintf(stderr,
"%s: line %" PRIiSIZE ": out of memory, line too long\n", prog,
lineno);
return MDBX_ENOMEM; return MDBX_ENOMEM;
} }
c1 = buf->iov_base; c1 = buf->iov_base;
@ -482,7 +512,6 @@ int main(int argc, char *argv[]) {
MDBX_dbi dbi; MDBX_dbi dbi;
char *envname = nullptr; char *envname = nullptr;
int envflags = MDBX_SAFE_NOSYNC | MDBX_ACCEDE, putflags = MDBX_UPSERT; int envflags = MDBX_SAFE_NOSYNC | MDBX_ACCEDE, putflags = MDBX_UPSERT;
bool quiet = false;
bool rescue = false; bool rescue = false;
bool purge = false; bool purge = false;
@ -521,6 +550,7 @@ int main(int argc, char *argv[]) {
break; break;
case 'f': case 'f':
if (freopen(optarg, "r", stdin) == nullptr) { if (freopen(optarg, "r", stdin) == nullptr) {
if (!quiet)
fprintf(stderr, "%s: %s: open: %s\n", prog, optarg, fprintf(stderr, "%s: %s: open: %s\n", prog, optarg,
mdbx_strerror(errno)); mdbx_strerror(errno));
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -618,6 +648,7 @@ int main(int argc, char *argv[]) {
envinfo.mi_dxb_pagesize ? (intptr_t)envinfo.mi_dxb_pagesize : -1); envinfo.mi_dxb_pagesize ? (intptr_t)envinfo.mi_dxb_pagesize : -1);
} else { } else {
if (envinfo.mi_mapsize > MAX_MAPSIZE) { if (envinfo.mi_mapsize > MAX_MAPSIZE) {
if (!quiet)
fprintf( fprintf(
stderr, stderr,
"Database size is too large for current system (mapsize=%" PRIu64 "Database size is too large for current system (mapsize=%" PRIu64
@ -644,6 +675,7 @@ int main(int argc, char *argv[]) {
kbuf.iov_len = mdbx_env_get_maxvalsize_ex(env, 0) + 1; kbuf.iov_len = mdbx_env_get_maxvalsize_ex(env, 0) + 1;
if (kbuf.iov_len >= INTPTR_MAX / 2) { if (kbuf.iov_len >= INTPTR_MAX / 2) {
if (!quiet)
fprintf(stderr, "mdbx_env_get_maxkeysize() failed, returns %zu\n", fprintf(stderr, "mdbx_env_get_maxkeysize() failed, returns %zu\n",
kbuf.iov_len); kbuf.iov_len);
goto env_close; goto env_close;
@ -696,6 +728,7 @@ int main(int argc, char *argv[]) {
goto txn_abort; goto txn_abort;
} }
if (present_sequence > sequence) { if (present_sequence > sequence) {
if (!quiet)
fprintf(stderr, fprintf(stderr,
"present sequence for '%s' value (%" PRIu64 "present sequence for '%s' value (%" PRIu64
") is greater than loaded (%" PRIu64 ")\n", ") is greater than loaded (%" PRIu64 ")\n",
@ -739,6 +772,7 @@ int main(int argc, char *argv[]) {
if (rc == MDBX_SUCCESS) if (rc == MDBX_SUCCESS)
rc = readline(&data, &dbuf); rc = readline(&data, &dbuf);
if (rc) { if (rc) {
if (!quiet)
fprintf(stderr, "%s: line %" PRIiSIZE ": failed to read key value\n", fprintf(stderr, "%s: line %" PRIiSIZE ": failed to read key value\n",
prog, lineno); prog, lineno);
goto txn_abort; goto txn_abort;
@ -748,6 +782,7 @@ int main(int argc, char *argv[]) {
if (rc == MDBX_KEYEXIST && putflags) if (rc == MDBX_KEYEXIST && putflags)
continue; continue;
if (rc == MDBX_BAD_VALSIZE && rescue) { if (rc == MDBX_BAD_VALSIZE && rescue) {
if (!quiet)
fprintf(stderr, "%s: skip line %" PRIiSIZE ": due %s\n", prog, lineno, fprintf(stderr, "%s: skip line %" PRIiSIZE ": due %s\n", prog, lineno,
mdbx_strerror(rc)); mdbx_strerror(rc));
continue; continue;
@ -818,6 +853,7 @@ int main(int argc, char *argv[]) {
case MDBX_SUCCESS: case MDBX_SUCCESS:
break; break;
case MDBX_EINTR: case MDBX_EINTR:
if (!quiet)
fprintf(stderr, "Interrupted by signal/user\n"); fprintf(stderr, "Interrupted by signal/user\n");
break; break;
default: default: