Guest User

Untitled

a guest
Jun 1st, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.77 KB | None | 0 0
  1. import os
  2. import fnmatch
  3. import subprocess
  4.  
  5. db_user='mangos'
  6. db_password='mangos'
  7. mangos_db='mangos_udb'
  8. character_db='mangos_character'
  9. realmd_db='mangos_realmd'
  10. sql_path='/opt/mangos/dat/mangos/sql/updates/'
  11.  
  12. class sqlUpdate:
  13. def __init__(self, rev, fnum, name):
  14. self.rev = rev
  15. self.fnum = fnum
  16. self.name = name
  17. def __cmp__(self,other):
  18. res = cmp(self.rev, other.rev)
  19. if res != 0:
  20. return res
  21. res = cmp(self.fnum, other.fnum)
  22. if res != 0:
  23. return res
  24. # should not happen, but did already happen, go by full of filename for consistent order
  25. return cmp(self.name, other.name)
  26.  
  27. def parseFileName(filename):
  28. token = filename.split('_')
  29. # some files are rev_num_db.sql instead of rev_num_db_table.sql:
  30. if len(token) == 3:
  31. token2 = token[2].split('.')
  32. token[2] = token2[0]
  33. return int(token[0]), int(token[1]), token[2]
  34.  
  35. def queryVersion(query, db_name):
  36. command = ['mysql', '-u', db_user, '-p%s'%db_password, '-ss', '-e', query, db_name]
  37. stdoutdata, stderrdata = subprocess.Popen(command, stdout=subprocess.PIPE).communicate()
  38. last_update=stdoutdata.split()[0]
  39. print last_update
  40. last_update_tokens = last_update.split('_')
  41. return sqlUpdate(int(last_update_tokens[1]), int(last_update_tokens[2]), last_update)
  42.  
  43. files = os.listdir(sql_path)
  44. sqlupdates = fnmatch.filter(files, '*.sql')
  45.  
  46. #=== find current db versions ===
  47.  
  48. worldstate = queryVersion('SHOW COLUMNS FROM db_version LIKE \'required%\'', mangos_db)
  49. charstate = queryVersion('SHOW COLUMNS FROM character_db_version LIKE \'required%\'', character_db)
  50. realmdstate = queryVersion('SHOW COLUMNS FROM realmd_db_version LIKE \'required%\'', realmd_db)
  51. world_updates = []
  52. char_updates = []
  53. realmd_updates = []
  54.  
  55. for i in sqlupdates:
  56. rev, num, db = parseFileName(i)
  57. ufile = sqlUpdate(rev, num, i)
  58. if db == 'mangos':
  59. if ufile > worldstate:
  60. world_updates.append(ufile)
  61. elif db == 'characters':
  62. if ufile > charstate:
  63. char_updates.append(ufile)
  64. elif db == 'realmd':
  65. if ufile > realmdstate:
  66. realmd_updates.append(ufile)
  67. else: print "Error: file does not follow naming conventions:" + ufile.name
  68.  
  69. print 'Updating world DB...'
  70. world_updates.sort()
  71. for i in world_updates:
  72. print 'Applying: ' + i.name
  73. command = ['mysql', '-u', db_user, '-p%s'%db_password, mangos_db]
  74. subprocess.Popen(command, stdin=open(sql_path + i.name,'r')).communicate()
  75.  
  76. print 'Updating character DB...'
  77. char_updates.sort()
  78. for i in char_updates:
  79. print 'Applying: ' + i.name
  80. command = ['mysql', '-u', db_user, '-p%s'%db_password, character_db]
  81. subprocess.Popen(command, stdin=open(sql_path + i.name,'r')).communicate()
  82.  
  83. print 'Updating realmd DB...'
  84. world_updates.sort()
  85. for i in realmd_updates:
  86. print 'Applying: ' + i.name
  87. command = ['mysql', '-u', db_user, '-p%s'%db_password, realmd_db]
  88. subprocess.Popen(command, stdin=open(sql_path + i.name,'r')).communicate()
Add Comment
Please, Sign In to add comment