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.

64 lines
1.9 KiB

4 years ago
  1. /*
  2. * Copyright (c)2012 Nicolas Cannasse
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining
  5. * a copy of this software and associated documentation files (the
  6. * "Software"), to deal in the Software without restriction, including
  7. * without limitation the rights to use, copy, modify, merge, publish,
  8. * distribute, sublicense, and/or sell copies of the Software, and to
  9. * permit persons to whom the Software is furnished to do so, subject to
  10. * the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be
  13. * included in all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  18. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  19. * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  20. * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  21. * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. package sys.db;
  24. class Id {
  25. public static function encode( id : String ) : Int {
  26. var l = id.length;
  27. if( l > 6 )
  28. throw "Invalid identifier '"+id+"'";
  29. var k = 0;
  30. var p = l;
  31. while( p > 0 ) {
  32. var c = id.charCodeAt(--p) - 96;
  33. if( c < 1 || c > 26 ) {
  34. c = c + 96 - 48;
  35. if( c >= 1 && c <= 5 )
  36. c += 26;
  37. else
  38. throw "Invalid character "+id.charCodeAt(p)+" in "+id;
  39. }
  40. k <<= 5;
  41. k += c;
  42. }
  43. return k;
  44. }
  45. public static function decode( id : Int ) : String {
  46. var s = new StringBuf();
  47. if( id < 1 ) {
  48. if( id == 0 ) return "";
  49. throw "Invalid ID "+id;
  50. }
  51. while( id > 0 ) {
  52. var k = id & 31;
  53. if( k < 27 )
  54. s.addChar(k + 96);
  55. else
  56. s.addChar(k + 22);
  57. id >>= 5;
  58. }
  59. return s.toString();
  60. }
  61. }