@@ -54,6 +54,7 @@ static int _indexinfo = 0;
5454static int _nodeinfo = 0 ;
5555static int _autoinc = 0 ;
5656static int _context = 0 ;
57+ static int _metadata = 0 ;
5758
5859static int _retries = 0 ;
5960
@@ -91,11 +92,15 @@ static struct my_option my_long_options[] = {
9192 nullptr , GET_BOOL, NO_ARG, 0 , 0 , 0 , nullptr , 0 , nullptr },
9293 {" context" , ' x' , " Show context information" , &_context, nullptr , nullptr ,
9394 GET_BOOL, NO_ARG, 0 , 0 , 0 , nullptr , 0 , nullptr },
95+ {" embedded-metadata" , ' m' , " Show embedded metadata" , &_metadata, nullptr ,
96+ nullptr , GET_BOOL, NO_ARG, 0 , 0 , 0 , nullptr , 0 , nullptr },
9497 NdbStdOpt::end_of_options};
9598
9699static void print_context_info (Ndb *pNdb, NdbDictionary::Table const *pTab);
97100static void print_autoinc_info (Ndb *pNdb, NdbDictionary::Table const *pTab);
98101static void print_part_info (Ndb *pNdb, NdbDictionary::Table const *pTab);
102+ static void print_embedded_metadata (Ndb *myndb,
103+ NdbDictionary::Table const *pTab);
99104
100105int main (int argc, char **argv) {
101106 NDB_INIT (argv[0 ]);
@@ -334,6 +339,11 @@ int desc_table(Ndb *myndb, char const *name) {
334339 }
335340 }
336341
342+ if (_metadata) {
343+ print_embedded_metadata (myndb, pTab);
344+ ndbout << endl;
345+ }
346+
337347 return 1 ;
338348}
339349
@@ -499,3 +509,91 @@ int desc_hashmap(Ndb_cluster_connection &con, Ndb *myndb, char const *name) {
499509 }
500510 return 0 ;
501511}
512+
513+ static void print_binary (const void *data, Uint32 len) {
514+ const Uint32 digitsPerLine = 8 ;
515+ char readable[digitsPerLine + 1 ];
516+ Uint32 offset = 0 ;
517+ /* Line format
518+ * 0x00000000: 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 ABCDEFGH
519+ * Offset Bytes as hex Printable chars
520+ */
521+
522+ ndbout << hex << offset << " : " ;
523+ while (offset < len) {
524+ const uint8 digit = ((const uint8 *)data)[offset];
525+
526+ ndbout << hex << digit << " " ;
527+
528+ readable[offset % digitsPerLine] = isprint (digit) ? digit : ' ' ;
529+
530+ offset++;
531+
532+ if ((offset % digitsPerLine) == 0 ) {
533+ /* End of line */
534+ readable[digitsPerLine] = 0 ;
535+ ndbout << " " << readable << endl;
536+ if (offset < len) ndbout << hex << offset << " : " ;
537+ }
538+ }
539+
540+ Uint32 lastLineDigits = offset % digitsPerLine;
541+ if (lastLineDigits > 0 ) {
542+ /* Pad out last line */
543+ Uint32 padDigits = digitsPerLine - lastLineDigits;
544+ for (; padDigits; padDigits--)
545+ // 0xHH_
546+ ndbout << " " ;
547+
548+ readable[lastLineDigits] = 0 ;
549+ ndbout << " " << readable << endl;
550+ }
551+
552+ ndbout << endl;
553+ }
554+
555+ static void print_embedded_metadata (Ndb *myndb,
556+ NdbDictionary::Table const *pTab) {
557+ ndbout << " -- Embedded metadata" << endl;
558+
559+ const Uint32 packed_len = pTab->getFrmLength ();
560+
561+ ndbout << " Packed len : " << packed_len << endl;
562+
563+ if (packed_len > 0 ) {
564+ Uint32 metadata_version = 0 ;
565+ void *metadata_ptr = nullptr ;
566+ Uint32 metadata_len = 0 ;
567+
568+ const int res =
569+ pTab->getExtraMetadata (metadata_version, &metadata_ptr, &metadata_len);
570+
571+ if (res == 0 ) {
572+ ndbout << " Metadata version : " << metadata_version << endl;
573+ ndbout << " Unpacked length : " << metadata_len << endl;
574+
575+ bool text = true ;
576+ for (Uint32 i = 0 ; i < metadata_len; i++) {
577+ if (!isprint (((const char *)metadata_ptr)[i])) {
578+ text = false ;
579+ break ;
580+ }
581+ }
582+
583+ ndbout << " Metadata begin" << endl;
584+ if (!text) {
585+ print_binary (metadata_ptr, metadata_len);
586+ } else {
587+ /* All text, direct print, ensuring null termination */
588+ BaseString null_terminated_copy (static_cast <char *>(metadata_ptr),
589+ metadata_len);
590+ ndbout << null_terminated_copy.c_str () << endl;
591+ }
592+ ndbout << " Metadata end" << endl;
593+
594+ free (metadata_ptr);
595+ } else {
596+ ndbout << " Problem reading : " << res << endl;
597+ }
598+ }
599+ }
0 commit comments