now supporting "blank tables" - schema of the table will be preserved, even if it's empty - especially nice feature for --replicate

This commit is contained in:
Miroslav Stampar 2011-05-23 11:09:44 +00:00
parent 868fbe370b
commit 0ed03d474f
2 changed files with 43 additions and 32 deletions

View File

@ -2581,11 +2581,9 @@ def isNoneValue(value):
if isinstance(value, basestring): if isinstance(value, basestring):
return value == "None" return value == "None"
elif isinstance(value, list): elif isinstance(value, (list, tuple)):
return value == [None] return isNoneValue(value[0]) if len(value) == 1 else not any(filter(lambda x: x and x != "None", value))
elif isinstance(value, tuple):
return value == (None)
elif isinstance(value, dict): elif isinstance(value, dict):
return len(value) == 1 and any(map(lambda x: x in value, [None, "None"])) return not any(value)
else: else:
return value is None return value is None

View File

@ -1527,37 +1527,40 @@ class Enumeration:
if not entries and query: if not entries and query:
entries = inject.getValue(query, blind=False, dump=True) entries = inject.getValue(query, blind=False, dump=True)
if entries: if isNoneValue(entries):
if isinstance(entries, basestring): entries = []
entries = [ entries ] elif isinstance(entries, basestring):
entries = [ entries ]
elif not isinstance(entries, (list, tuple)):
entries = []
entriesCount = len(entries) entriesCount = len(entries)
index = 0 index = 0
for column in colList: for column in colList:
colLen = len(column) colLen = len(column)
if not kb.data.dumpedTable.has_key(column): if not kb.data.dumpedTable.has_key(column):
kb.data.dumpedTable[column] = { "length": 0, "values": [] } kb.data.dumpedTable[column] = { "length": colLen, "values": [] }
for entry in entries: for entry in entries:
if entry is None or len(entry) == 0: if entry is None or len(entry) == 0:
continue continue
if isinstance(entry, basestring): if isinstance(entry, basestring):
colEntry = entry colEntry = entry
else: else:
colEntry = entry[index] if index < len(entry) else u'' colEntry = entry[index] if index < len(entry) else u''
colEntryLen = len(getUnicode(colEntry)) colEntryLen = len(getUnicode(colEntry))
maxLen = max(colLen, colEntryLen) maxLen = max(colLen, colEntryLen)
if maxLen > kb.data.dumpedTable[column]["length"]: if maxLen > kb.data.dumpedTable[column]["length"]:
kb.data.dumpedTable[column]["length"] = maxLen kb.data.dumpedTable[column]["length"] = maxLen
kb.data.dumpedTable[column]["values"].append(colEntry) kb.data.dumpedTable[column]["values"].append(colEntry)
index += 1 index += 1
if not kb.data.dumpedTable and not conf.direct: if not kb.data.dumpedTable and not conf.direct:
infoMsg = "fetching number of " infoMsg = "fetching number of "
@ -1579,7 +1582,20 @@ class Enumeration:
query = rootQuery.blind.count % (conf.db, tbl) query = rootQuery.blind.count % (conf.db, tbl)
count = inject.getValue(query, inband=False, error=False, expected=EXPECTED.INT, charsetType=2) count = inject.getValue(query, inband=False, error=False, expected=EXPECTED.INT, charsetType=2)
if not isNumPosStrValue(count): lengths = {}
entries = {}
if count == "0":
warnMsg = "table '%s' " % unsafeSQLIdentificatorNaming(tbl)
warnMsg += "on database '%s' " % unsafeSQLIdentificatorNaming(conf.db)
warnMsg += "appears to be empty"
logger.warn(warnMsg)
for column in colList:
lengths[column] = len(column)
entries[column] = []
elif not isNumPosStrValue(count):
warnMsg = "unable to retrieve the number of " warnMsg = "unable to retrieve the number of "
if conf.col: if conf.col:
warnMsg += "columns '%s' " % colString warnMsg += "columns '%s' " % colString
@ -1589,10 +1605,7 @@ class Enumeration:
continue continue
lengths = {} elif Backend.getIdentifiedDbms() in (DBMS.ACCESS, DBMS.SYBASE, DBMS.MAXDB, DBMS.MSSQL):
entries = {}
if Backend.getIdentifiedDbms() in (DBMS.ACCESS, DBMS.SYBASE, DBMS.MAXDB, DBMS.MSSQL):
if Backend.isDbms(DBMS.ACCESS): if Backend.isDbms(DBMS.ACCESS):
table = tbl table = tbl
elif Backend.getIdentifiedDbms() in (DBMS.SYBASE, DBMS.MSSQL): elif Backend.getIdentifiedDbms() in (DBMS.SYBASE, DBMS.MSSQL):