
* Removed deprecated docker build * [Core] Several codestyle/standardization fixes * [vmap] Remove unused functions * [core/vmap] Standardise functions and codestyle * [Docker] Cmake double install fix Co-authored-by: PargeLenis <dead.man.walkin@hotmail.de>
333 lines
13 KiB
Python
333 lines
13 KiB
Python
#
|
|
# This code is part of MaNGOS. Contributor & Copyright details are in AUTHORS/THANKS.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
|
|
import MySQLdb as mdb
|
|
import sys
|
|
|
|
#global Variables (change as required)
|
|
host = "localhost"
|
|
user = "mangos"
|
|
passw = "mangos"
|
|
# databases format: list of [name, expansion]
|
|
databases = [ ["mangos", 2] ]
|
|
#databases = [ ["zero_db", 0], ["tbcdb", 1], ["udb_clean", 2], ["ytdb", 2] ]
|
|
|
|
# Should the current conditions table be loaded? (usefull for appending custom content)
|
|
loadOldConditions = 0
|
|
# database, from which the conditions table will be loaded
|
|
database = databases[0][0]
|
|
#database = "mangos_custom"
|
|
|
|
# be very chatty with debug output
|
|
debug = 0
|
|
|
|
# global variables for internal use
|
|
false = 0
|
|
true = 1
|
|
processNumConditions = 0
|
|
fUpdates = 0
|
|
|
|
# Some Helper functions, main code at the bottom
|
|
def isSameCondition(c1, v11, v12, c2, v21, v22):
|
|
return (c1 == c2) and (v11 == v21) and (v12 == v22)
|
|
#
|
|
|
|
def compareCondition(c1, v11, v12, c2, v21, v22):
|
|
if (c1 > c2):
|
|
return true
|
|
if (c1 == c2):
|
|
if (v11 > v21):
|
|
return true
|
|
if (v11 == v21):
|
|
if (v12 > v22):
|
|
return true
|
|
|
|
return false
|
|
#
|
|
|
|
def insertCondition(c, v1, v2):
|
|
global old_max
|
|
old_max = old_max + 1
|
|
linkedList.append( [old_max, c, v1, v2, database] )
|
|
if (debug):
|
|
print "Inserted: [%d, %d, %d, %d], (%s)" % (old_max, c, v1, v2, database)
|
|
#
|
|
|
|
def findCondition(c, v1, v2):
|
|
for entry in linkedList:
|
|
if (isSameCondition(c, v1, v2, entry[1], entry[2], entry[3])):
|
|
return entry[0]
|
|
return 0
|
|
#
|
|
|
|
# Function that processes table tableName for keys keyName1, keyName2, parses the conditions of conditionString, which must select numberOfConditions conditions
|
|
def progressTable(tableName, keyName1, keyName2, conditionString, numberOfConditions):
|
|
global old_max
|
|
global processNumConditions
|
|
global fUpdates
|
|
|
|
try:
|
|
con = mdb.connect(host, user, passw, database);
|
|
cur = con.cursor()
|
|
cur.execute('SELECT %s, %s, %s FROM %s; ' % (keyName1, keyName2, conditionString, tableName))
|
|
|
|
result = cur.fetchall()
|
|
|
|
if (debug):
|
|
print 'ProgressTable %s in database %s' % (tableName, database)
|
|
|
|
for row in result:
|
|
key1 = row[0]
|
|
key2 = row[1]
|
|
|
|
c1 = v11 = v12 = c2 = v21 = v22 = c3= v31 =v32 = 0
|
|
|
|
c1 = row[2]
|
|
v11 = row[3]
|
|
v12 = row[4]
|
|
if (numberOfConditions >= 2):
|
|
c2 = row[5]
|
|
v21 = row[6]
|
|
v22 = row[7]
|
|
if (numberOfConditions >= 3):
|
|
c3 = row[8]
|
|
v31 = row[9]
|
|
v32 = row[10]
|
|
|
|
# Order the conditions of one row from big to slow
|
|
if (numberOfConditions >= 2) and (compareCondition(c2, v21, v22, c1, v11, v12)):
|
|
c1, v11, v12, c2, v21, v22 = c2, v21, v22, c1, v11, v12
|
|
if (numberOfConditions >= 3):
|
|
if (compareCondition(c3, v31, v32, c2, v21, v22)):
|
|
c2, v21, v22, c3, v31, v32 = c3, v31, v32, c2, v21, v22
|
|
if (compareCondition(c2, v21, v22, c1, v11, v12)):
|
|
c1, v11, v12, c2, v21, v22 = c2, v21, v22, c1, v11, v12
|
|
|
|
# How many conditions do we have?
|
|
rowConditionNumber = 0
|
|
if (c1 > 0):
|
|
rowConditionNumber = rowConditionNumber + 1
|
|
if (c2 > 0):
|
|
rowConditionNumber = rowConditionNumber + 1
|
|
if (c3 > 0):
|
|
rowConditionNumber = rowConditionNumber + 1
|
|
|
|
if (rowConditionNumber == 0): #nothing to do
|
|
continue;
|
|
|
|
if (debug):
|
|
print "Condition(s) for Key (%d, %d): %d, %d, %d -- %d, %d, %d -- %d, %d, %d" % (key1, key2, c1, v11, v12, c2, v21, v22, c3, v31, v32)
|
|
|
|
# Just insert
|
|
if (processNumConditions == 0):
|
|
if (rowConditionNumber >= 1 and findCondition(c1, v11, v12) == 0):
|
|
insertCondition(c1, v11, v12)
|
|
if (rowConditionNumber >= 2 and findCondition(c2, v21, v22) == 0):
|
|
insertCondition(c2, v21, v22)
|
|
if (rowConditionNumber >= 3 and findCondition(c3, v31, v32) == 0):
|
|
insertCondition(c3, v31, v32)
|
|
continue
|
|
#
|
|
|
|
# Currently processing?
|
|
if (processNumConditions != rowConditionNumber):
|
|
continue
|
|
|
|
founds = [0, 0, 0]
|
|
countFound = 0 # helper for error
|
|
if (rowConditionNumber >= 1):
|
|
founds[0] = findCondition(c1, v11, v12)
|
|
if (founds[0] > 0):
|
|
countFound = countFound + 1
|
|
if (rowConditionNumber >= 2):
|
|
founds[1] = findCondition(c2, v21, v22)
|
|
if (founds[1] > 0):
|
|
countFound = countFound + 1
|
|
if (rowConditionNumber >= 3):
|
|
founds[2] = findCondition(c3, v31, v32)
|
|
if (founds[2] > 0):
|
|
countFound = countFound + 1
|
|
|
|
if (countFound != rowConditionNumber):
|
|
print 'An error happened for: Condition(s) for Key (%d, %d): %d, %d, %d -- %d, %d, %d -- %d, %d, %d' % (key1, key2, c1, v11, v12, c2, v21, v22, c3, v31, v32)
|
|
continue
|
|
|
|
last_point = 0
|
|
#3-vector condition
|
|
if (rowConditionNumber == 3):
|
|
# search for 2 match
|
|
notSearched = [0, 0, 0]
|
|
notSearched[2] = findCondition(-1, founds[0], founds[1])
|
|
if (notSearched[2] == 0):
|
|
notSearched[2] = findCondition(-1, founds[1], founds[0])
|
|
notSearched[1] = findCondition(-1, founds[0], founds[2])
|
|
if (notSearched[1] == 0):
|
|
notSearched[1] = findCondition(-1, founds[2], founds[0])
|
|
notSearched[0] = findCondition(-1, founds[1], founds[2])
|
|
if (notSearched[0] == 0):
|
|
notSearched[0] = findCondition(-1, founds[2], founds[1])
|
|
|
|
if (notSearched == [0, 0, 0]): # nothing found
|
|
insertCondition(-1, founds[1], founds[2])
|
|
notSearched[0] = old_max
|
|
for i in range(0, 3):
|
|
if (notSearched[i] > 0):
|
|
last_point = findCondition(-1, notSearched[i], founds[i])
|
|
if (last_point == 0):
|
|
last_point = findCondition(-1, founds[i], notSearched[i])
|
|
if (last_point > 0):
|
|
break
|
|
if (last_point == 0):
|
|
for i in range(0, 3):
|
|
if (notSearched[i] > 0):
|
|
insertCondition(-1, founds[i], notSearched[i])
|
|
last_point = old_max
|
|
break
|
|
|
|
#2-vector condition
|
|
if (rowConditionNumber == 2):
|
|
# search for 2 match
|
|
last_point = findCondition(-1, founds[1], founds[0])
|
|
if (last_point == 0):
|
|
last_point = findCondition(-1, founds[0], founds[1])
|
|
if (last_point == 0):
|
|
#Not found, insert list
|
|
insertCondition(-1, founds[1], founds[0])
|
|
last_point = old_max
|
|
|
|
#1-vector condition
|
|
if (rowConditionNumber == 1):
|
|
last_point = founds[0]
|
|
|
|
# Now we must have last_point > 0 (for a condition), and linking to proper place
|
|
if (last_point > 0 and processNumConditions > 0):
|
|
#cur.execute('UPDATE %s SET condition_id=%d WHERE %s=%d AND %s=%d; ' % (tableName, last_point, keyName1, key1, keyName2, key2))
|
|
print >> fUpdates, 'UPDATE %s SET condition_id=%d WHERE %s=%d AND %s=%d;' % (tableName, last_point, keyName1, key1, keyName2, key2)
|
|
|
|
except mdb.Error, e:
|
|
print 'Error %d, %s' % (e.args[0], e.args[1])
|
|
sys.exit(1)
|
|
|
|
finally:
|
|
if con:
|
|
con.close()
|
|
## End of Helper function
|
|
|
|
linkedList = []
|
|
old_max = 0
|
|
linkedList.append( [0, 0, 0, 0, 'initial fill'] )
|
|
|
|
# Extract old conditions
|
|
if (loadOldConditions):
|
|
try:
|
|
con = mdb.connect(host, user, passw, database);
|
|
cur = con.cursor()
|
|
cur.execute('SELECT condition_entry, type, value1, value2 FROM conditions')
|
|
|
|
for row in cur:
|
|
linkedList.append( [row[0], row[1], row[2], row[3], 'reloaded from %s' % database ] )
|
|
old_max = old_max + 1
|
|
if (row[0] != old_max):
|
|
print 'An error happened at old_max=%d, entry=%d' % (old_max, row[0])
|
|
|
|
print 'Loaded %d values from %s conditions table' % (old_max, database)
|
|
|
|
except mdb.Error, e:
|
|
print 'Error %d, %s' % (e.args[0], e.args[1])
|
|
sys.exit(1)
|
|
|
|
finally:
|
|
if con:
|
|
con.close()
|
|
#
|
|
start_entry=old_max
|
|
|
|
def doTables(db):
|
|
global processNumConditions
|
|
global fUpdates
|
|
global database
|
|
|
|
database = db[0]
|
|
print 'Processing database %s (%d vector conditions)' % (database, processNumConditions)
|
|
try:
|
|
if (processNumConditions == 0):
|
|
fUpdates = open("%s_updates.sql" % database, "w")
|
|
else:
|
|
fUpdates = open("%s_updates.sql" % database, "a")
|
|
|
|
if (processNumConditions <= 1):
|
|
progressTable("reference_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("creature_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("gameobject_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("pickpocketing_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("item_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("fishing_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("skinning_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("disenchant_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("mail_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
# Not all expansions have all tables
|
|
if (db[1] >= 1):
|
|
progressTable("prospecting_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
if (db[1] >= 2):
|
|
progressTable("spell_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
progressTable("milling_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
|
|
|
|
if (processNumConditions < 3):
|
|
progressTable("gossip_menu", "entry", "text_id", "cond_1, cond_1_val_1, cond_1_val_2, cond_2, cond_2_val_1, cond_2_val_2", 2)
|
|
progressTable("gossip_menu_option", "menu_id", "id", "cond_1, cond_1_val_1, cond_1_val_2, cond_2, cond_2_val_1, cond_2_val_2, cond_3, cond_3_val_1, cond_3_val_2", 3)
|
|
|
|
except:
|
|
print "An error happened here"
|
|
sys.exit(1)
|
|
|
|
finally:
|
|
fUpdates.close()
|
|
|
|
# end of helper function doTables
|
|
|
|
try:
|
|
fConditions = open("conditions_dump.sql", "w")
|
|
if (debug):
|
|
print 'Opened conditions_dump.sql successfully'
|
|
|
|
for i in range (0, 4):
|
|
processNumConditions = i
|
|
for db in databases:
|
|
doTables(db)
|
|
print 'Inserted %d rows for database %s' % (old_max - start_entry, database)
|
|
start_entry = old_max
|
|
|
|
print 'Processed database(s): %s' % databases
|
|
#create dump
|
|
print >> fConditions, 'TRUNCATE conditions;'
|
|
print >> fConditions, 'INSERT INTO conditions VALUES'
|
|
for i in range(1, old_max):
|
|
if (linkedList[i][0] != i):
|
|
print 'AN ERROR HAPPENED for i=%d, liLi[i].entry=%d' % (i, linkedList[i][0])
|
|
print >> fConditions, '(%d, %d, %d, %d), -- %s' % (linkedList[i][0], linkedList[i][1], linkedList[i][2], linkedList[i][3], linkedList[i][4])
|
|
|
|
i = old_max
|
|
print >> fConditions, '(%d, %d, %d, %d); -- %s' % (linkedList[i][0], linkedList[i][1], linkedList[i][2], linkedList[i][3], linkedList[i][4])
|
|
|
|
except:
|
|
print "An error happened"
|
|
sys.exit(1)
|
|
|
|
finally:
|
|
fConditions.close()
|