You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
6.8 KiB

  1. // Javascript helper functions for parsing and displaying UUIDs in the MongoDB shell.
  2. // This is a temporary solution until SERVER-3153 is implemented.
  3. // To create BinData values corresponding to the various driver encodings use:
  4. // var s = "{00112233-4455-6677-8899-aabbccddeeff}";
  5. // var uuid = UUID(s); // new Standard encoding
  6. // var juuid = JUUID(s); // JavaLegacy encoding
  7. // var csuuid = CSUUID(s); // CSharpLegacy encoding
  8. // var pyuuid = PYUUID(s); // PythonLegacy encoding
  9. // To convert the various BinData values back to human readable UUIDs use:
  10. // uuid.toUUID() => 'UUID("00112233-4455-6677-8899-aabbccddeeff")'
  11. // juuid.ToJUUID() => 'JUUID("00112233-4455-6677-8899-aabbccddeeff")'
  12. // csuuid.ToCSUUID() => 'CSUUID("00112233-4455-6677-8899-aabbccddeeff")'
  13. // pyuuid.ToPYUUID() => 'PYUUID("00112233-4455-6677-8899-aabbccddeeff")'
  14. // With any of the UUID variants you can use toHexUUID to echo the raw BinData with subtype and hex string:
  15. // uuid.toHexUUID() => 'HexData(4, "00112233-4455-6677-8899-aabbccddeeff")'
  16. // juuid.toHexUUID() => 'HexData(3, "77665544-3322-1100-ffee-ddccbbaa9988")'
  17. // csuuid.toHexUUID() => 'HexData(3, "33221100-5544-7766-8899-aabbccddeeff")'
  18. // pyuuid.toHexUUID() => 'HexData(3, "00112233-4455-6677-8899-aabbccddeeff")'
  19. function HexToBase64(hex) {
  20. var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  21. var base64 = "";
  22. var group;
  23. for (var i = 0; i < 30; i += 6) {
  24. group = parseInt(hex.substr(i, 6), 16);
  25. base64 += base64Digits[(group >> 18) & 0x3f];
  26. base64 += base64Digits[(group >> 12) & 0x3f];
  27. base64 += base64Digits[(group >> 6) & 0x3f];
  28. base64 += base64Digits[group & 0x3f];
  29. }
  30. group = parseInt(hex.substr(30, 2), 16);
  31. base64 += base64Digits[(group >> 2) & 0x3f];
  32. base64 += base64Digits[(group << 4) & 0x3f];
  33. base64 += "==";
  34. return base64;
  35. }
  36. function Base64ToHex(base64) {
  37. var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
  38. var hexDigits = "0123456789abcdef";
  39. var hex = "";
  40. for (var i = 0; i < 24; ) {
  41. var e1 = base64Digits.indexOf(base64[i++]);
  42. var e2 = base64Digits.indexOf(base64[i++]);
  43. var e3 = base64Digits.indexOf(base64[i++]);
  44. var e4 = base64Digits.indexOf(base64[i++]);
  45. var c1 = (e1 << 2) | (e2 >> 4);
  46. var c2 = ((e2 & 15) << 4) | (e3 >> 2);
  47. var c3 = ((e3 & 3) << 6) | e4;
  48. hex += hexDigits[c1 >> 4];
  49. hex += hexDigits[c1 & 15];
  50. if (e3 != 64) {
  51. hex += hexDigits[c2 >> 4];
  52. hex += hexDigits[c2 & 15];
  53. }
  54. if (e4 != 64) {
  55. hex += hexDigits[c3 >> 4];
  56. hex += hexDigits[c3 & 15];
  57. }
  58. }
  59. return hex;
  60. }
  61. function UUID(uuid) {
  62. var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
  63. var base64 = HexToBase64(hex);
  64. return new BinData(4, base64); // new subtype 4
  65. }
  66. function JUUID(uuid) {
  67. var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
  68. var msb = hex.substr(0, 16);
  69. var lsb = hex.substr(16, 16);
  70. msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);
  71. lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);
  72. hex = msb + lsb;
  73. var base64 = HexToBase64(hex);
  74. return new BinData(3, base64);
  75. }
  76. function CSUUID(uuid) {
  77. var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
  78. var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
  79. var b = hex.substr(10, 2) + hex.substr(8, 2);
  80. var c = hex.substr(14, 2) + hex.substr(12, 2);
  81. var d = hex.substr(16, 16);
  82. hex = a + b + c + d;
  83. var base64 = HexToBase64(hex);
  84. return new BinData(3, base64);
  85. }
  86. function PYUUID(uuid) {
  87. var hex = uuid.replace(/[{}-]/g, ""); // remove extra characters
  88. var base64 = HexToBase64(hex);
  89. return new BinData(3, base64);
  90. }
  91. BinData.prototype.toUUID = function () {
  92. var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell
  93. var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
  94. return 'UUID("' + uuid + '")';
  95. }
  96. BinData.prototype.toJUUID = function () {
  97. var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell
  98. var msb = hex.substr(0, 16);
  99. var lsb = hex.substr(16, 16);
  100. msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);
  101. lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);
  102. hex = msb + lsb;
  103. var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
  104. return 'JUUID("' + uuid + '")';
  105. }
  106. BinData.prototype.toCSUUID = function () {
  107. var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs in older versions of the shell
  108. var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
  109. var b = hex.substr(10, 2) + hex.substr(8, 2);
  110. var c = hex.substr(14, 2) + hex.substr(12, 2);
  111. var d = hex.substr(16, 16);
  112. hex = a + b + c + d;
  113. var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
  114. return 'CSUUID("' + uuid + '")';
  115. }
  116. BinData.prototype.toPYUUID = function () {
  117. var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs
  118. var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
  119. return 'PYUUID("' + uuid + '")';
  120. }
  121. BinData.prototype.toHexUUID = function () {
  122. var hex = Base64ToHex(this.base64()); // don't use BinData's hex function because it has bugs
  123. var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
  124. return 'HexData(' + this.subtype() + ', "' + uuid + '")';
  125. }
  126. function TestUUIDHelperFunctions() {
  127. var s = "{00112233-4455-6677-8899-aabbccddeeff}";
  128. var uuid = UUID(s);
  129. var juuid = JUUID(s);
  130. var csuuid = CSUUID(s);
  131. var pyuuid = PYUUID(s);
  132. print(uuid.toUUID());
  133. print(juuid.toJUUID());
  134. print(csuuid.toCSUUID());
  135. print(pyuuid.toPYUUID());
  136. print(uuid.toHexUUID());
  137. print(juuid.toHexUUID());
  138. print(csuuid.toHexUUID());
  139. print(pyuuid.toHexUUID());
  140. }