diff --git a/DATabase/MergeDiff.cs b/DATabase/MergeDiff.cs
index 3c730d88..44ad1398 100644
--- a/DATabase/MergeDiff.cs
+++ b/DATabase/MergeDiff.cs
@@ -131,10 +131,11 @@ namespace SabreTools
{
_logger.Log("Total number of lines in database: " + slc.ExecuteScalar());
}
- Output.WriteToDat2(_name + "-db", _desc + "-db", _version, _date, _cat, _author, _forceunpack, _old, _diff, "", dbc, _logger);
+ Output.WriteToDat2(_name + "-db", _desc + "-db", _version, _date, _cat, _author, _forceunpack, _old, _diff, _ad, "", dbc, _logger);
dbc.Close();
+ /*
// If we're in Alldiff mode, we can only use the first 2 inputs
if (_ad)
{
@@ -152,6 +153,7 @@ namespace SabreTools
Output.WriteToDat(_name + "-" + input1 + "-only", _desc + "-" + input1 + "-only", _version, _date, _cat, _author, _forceunpack, _old, "", OnlyB, _logger);
Output.WriteToDat(_name + "-inboth", _desc + "-inboth", _version, _date, _cat, _author, _forceunpack, _old, "", BothAB, _logger);
}
+ */
/*
// If we want a merged list, send it for merging before outputting
diff --git a/SabreHelper/Output.cs b/SabreHelper/Output.cs
index b4f87d1b..391dc93b 100644
--- a/SabreHelper/Output.cs
+++ b/SabreHelper/Output.cs
@@ -24,7 +24,8 @@ namespace SabreTools.Helper
/// List of RomData objects representing the games to be written out
/// Logger object for console and/or file output
/// Tru if the DAT was written correctly, false otherwise
- public static bool WriteToDat(string name, string description, string version, string date, string category, string author, bool forceunpack, bool old, string outDir, List roms, Logger logger)
+ public static bool WriteToDat(string name, string description, string version, string date, string category, string author,
+ bool forceunpack, bool old, string outDir, List roms, Logger logger)
{
// If it's empty, use the current folder
if (outDir.Trim() == "")
@@ -140,12 +141,13 @@ namespace SabreTools.Helper
/// Force all sets to be unzipped
/// Set output mode to old-style DAT
/// Only output files that don't have dupes
+ /// Enable output of files just in each DAT and also just duped. Best if combined with diff=true.
/// Set the output directory
/// Database connection representing the roms to be written
/// Logger object for console and/or file output
/// Tru if the DAT was written correctly, false otherwise
- public static bool WriteToDat2(string name, string description, string version, string date, string category,
- string author, bool forceunpack, bool old, bool diff, string outDir, SqliteConnection dbc, Logger logger)
+ public static bool WriteToDat2(string name, string description, string version, string date, string category, string author,
+ bool forceunpack, bool old, bool diff, bool ab, string outDir, SqliteConnection dbc, Logger logger)
{
// If it's empty, use the current folder
if (outDir.Trim() == "")
@@ -159,95 +161,132 @@ namespace SabreTools.Helper
outDir += Path.DirectorySeparatorChar;
}
- // (currently uses current time, change to "last updated time")
- logger.Log("Opening file for writing: " + outDir + description + (old ? ".dat" : ".xml"));
-
- try
+ // Get all query strings to use
+ List inputs = new List();
+ inputs.Add("");
+ if (diff)
{
- FileStream fs = File.Create(outDir + description + (old ? ".dat" : ".xml"));
- StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
-
- string header_old = "clrmamepro (\n" +
- "\tname \"" + HttpUtility.HtmlEncode(name) + "\"\n" +
- "\tdescription \"" + HttpUtility.HtmlEncode(description) + "\"\n" +
- "\tcategory \"" + HttpUtility.HtmlEncode(category) + "\"\n" +
- "\tversion \"" + HttpUtility.HtmlEncode(version) + "\"\n" +
- "\tdate \"" + HttpUtility.HtmlEncode(date) + "\"\n" +
- "\tauthor \"" + HttpUtility.HtmlEncode(author) + "\"\n" +
- (forceunpack ? "\tforcezipping no\n" : "") +
- ")\n";
-
- string header = "\n" +
- "\n\n" +
- "\t\n" +
- "\t\t\n" +
- "\t\t\t" + HttpUtility.HtmlEncode(name) + "\n" +
- "\t\t\t" + HttpUtility.HtmlEncode(description) + "\n" +
- "\t\t\t" + HttpUtility.HtmlEncode(category) + "\n" +
- "\t\t\t" + HttpUtility.HtmlEncode(version) + "\n" +
- "\t\t\t" + HttpUtility.HtmlEncode(date) + "\n" +
- "\t\t\t" + HttpUtility.HtmlEncode(author) + "\n" +
- (forceunpack ? "\t\t\t\n" : "") +
- "\t\t\n";
-
- // Write the header out
- sw.Write((old ? header_old : header));
-
- // Write out each of the machines and roms
- string lastgame = "";
- string query = "SELECT * FROM roms" + (diff ? " WHERE dupe='false'" : "") + " ORDER BY game, name";
- using (SqliteDataReader sldr = (new SqliteCommand(query, dbc).ExecuteReader()))
+ inputs.Add("WHERE dupe<>'true'");
+ }
+ if (ab)
+ {
+ using (SqliteDataReader sldr = (new SqliteCommand("SELECT DISTINCT dupe FROM roms", dbc).ExecuteReader()))
{
- while (sldr.Read())
+ if (sldr.HasRows)
{
- string state = "";
- if (lastgame != "" && lastgame != sldr.GetString(1))
+ while (sldr.Read())
{
- state += (old ? ")\n" : "\t\n");
+ inputs.Add("WHERE dupe='" + inputs + "'");
}
-
- if (lastgame != sldr.GetString(1))
- {
- state += (old ? "game (\n\tname \"" + sldr.GetString(1) + "\"\n" +
- "\tdescription \"" + sldr.GetString(1) + "\"\n" :
- "\t\n" +
- "\t\t" + HttpUtility.HtmlEncode(sldr.GetString(1)) + "\n");
- }
-
- if (old)
- {
- state += "\t" + sldr.GetString(3) + " ( name \"" + sldr.GetString(2) + "\"" +
- (sldr.GetInt64(6) != 0 ? " size " + sldr.GetInt64(6) : "") +
- (sldr.GetString(7) != "" ? " crc " + sldr.GetString(7).ToLowerInvariant() : "") +
- (sldr.GetString(8) != "" ? " md5 " + sldr.GetString(8).ToLowerInvariant() : "") +
- (sldr.GetString(9) != "" ? " sha1 " + sldr.GetString(9).ToLowerInvariant() : "") +
- " )\n";
- }
- else
- {
- state += "\t\t<" + sldr.GetString(3) + " name=\"" + HttpUtility.HtmlEncode(sldr.GetString(2)) + "\"" +
- (sldr.GetInt64(6) != -1 ? " size=\"" + sldr.GetInt64(6) + "\"" : "") +
- (sldr.GetString(7) != "" ? " crc=\"" + sldr.GetString(7).ToLowerInvariant() + "\"" : "") +
- (sldr.GetString(8) != "" ? " md5=\"" + sldr.GetString(8).ToLowerInvariant() + "\"" : "") +
- (sldr.GetString(9) != "" ? " sha1=\"" + sldr.GetString(9).ToLowerInvariant() + "\"" : "") +
- "/>\n";
- }
-
- lastgame = sldr.GetString(1);
-
- sw.Write(state);
}
}
-
- sw.Write((old ? ")" : "\t\n"));
- logger.Log("File written!" + Environment.NewLine);
- sw.Close();
- fs.Close();
}
- catch (Exception ex)
+
+ int i = 0;
+ foreach (string input in inputs)
{
- logger.Error(ex.ToString());
- return false;
+ string tempname = name;
+ string tempdesc = description;
+
+ // If we have special outputs, append the right things
+ if (i != 0)
+ {
+ tempname += " (" + i + ")";
+ tempdesc += " (" + i + ")";
+ }
+
+ // (currently uses current time, change to "last updated time")
+ logger.Log("Opening file for writing: " + outDir + tempdesc + (old ? ".dat" : ".xml"));
+
+ try
+ {
+ FileStream fs = File.Create(outDir + tempdesc + (old ? ".dat" : ".xml"));
+ StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
+
+ string header_old = "clrmamepro (\n" +
+ "\tname \"" + HttpUtility.HtmlEncode(tempname) + "\"\n" +
+ "\tdescription \"" + HttpUtility.HtmlEncode(tempdesc) + "\"\n" +
+ "\tcategory \"" + HttpUtility.HtmlEncode(category) + "\"\n" +
+ "\tversion \"" + HttpUtility.HtmlEncode(version) + "\"\n" +
+ "\tdate \"" + HttpUtility.HtmlEncode(date) + "\"\n" +
+ "\tauthor \"" + HttpUtility.HtmlEncode(author) + "\"\n" +
+ (forceunpack ? "\tforcezipping no\n" : "") +
+ ")\n";
+
+ string header = "\n" +
+ "\n\n" +
+ "\t\n" +
+ "\t\t\n" +
+ "\t\t\t" + HttpUtility.HtmlEncode(tempname) + "\n" +
+ "\t\t\t" + HttpUtility.HtmlEncode(tempdesc) + "\n" +
+ "\t\t\t" + HttpUtility.HtmlEncode(category) + "\n" +
+ "\t\t\t" + HttpUtility.HtmlEncode(version) + "\n" +
+ "\t\t\t" + HttpUtility.HtmlEncode(date) + "\n" +
+ "\t\t\t" + HttpUtility.HtmlEncode(author) + "\n" +
+ (forceunpack ? "\t\t\t\n" : "") +
+ "\t\t\n";
+
+ // Write the header out
+ sw.Write((old ? header_old : header));
+
+ // Write out each of the machines and roms
+ string lastgame = "";
+ string query = "SELECT * FROM roms " + input + " ORDER BY game, name";
+ using (SqliteDataReader sldr = (new SqliteCommand(query, dbc).ExecuteReader()))
+ {
+ while (sldr.Read())
+ {
+ string state = "";
+ if (lastgame != "" && lastgame != sldr.GetString(1))
+ {
+ state += (old ? ")\n" : "\t\n");
+ }
+
+ if (lastgame != sldr.GetString(1))
+ {
+ state += (old ? "game (\n\tname \"" + sldr.GetString(1) + "\"\n" +
+ "\tdescription \"" + sldr.GetString(1) + "\"\n" :
+ "\t\n" +
+ "\t\t" + HttpUtility.HtmlEncode(sldr.GetString(1)) + "\n");
+ }
+
+ if (old)
+ {
+ state += "\t" + sldr.GetString(3) + " ( name \"" + sldr.GetString(2) + "\"" +
+ (sldr.GetInt64(6) != 0 ? " size " + sldr.GetInt64(6) : "") +
+ (sldr.GetString(7) != "" ? " crc " + sldr.GetString(7).ToLowerInvariant() : "") +
+ (sldr.GetString(8) != "" ? " md5 " + sldr.GetString(8).ToLowerInvariant() : "") +
+ (sldr.GetString(9) != "" ? " sha1 " + sldr.GetString(9).ToLowerInvariant() : "") +
+ " )\n";
+ }
+ else
+ {
+ state += "\t\t<" + sldr.GetString(3) + " name=\"" + HttpUtility.HtmlEncode(sldr.GetString(2)) + "\"" +
+ (sldr.GetInt64(6) != -1 ? " size=\"" + sldr.GetInt64(6) + "\"" : "") +
+ (sldr.GetString(7) != "" ? " crc=\"" + sldr.GetString(7).ToLowerInvariant() + "\"" : "") +
+ (sldr.GetString(8) != "" ? " md5=\"" + sldr.GetString(8).ToLowerInvariant() + "\"" : "") +
+ (sldr.GetString(9) != "" ? " sha1=\"" + sldr.GetString(9).ToLowerInvariant() + "\"" : "") +
+ "/>\n";
+ }
+
+ lastgame = sldr.GetString(1);
+
+ sw.Write(state);
+ }
+ }
+
+ sw.Write((old ? ")" : "\t\n"));
+ logger.Log("File written!" + Environment.NewLine);
+ sw.Close();
+ fs.Close();
+ }
+ catch (Exception ex)
+ {
+ logger.Error(ex.ToString());
+ return false;
+ }
+
+ i++;
}
return true;
diff --git a/SabreHelper/RomManipulation.cs b/SabreHelper/RomManipulation.cs
index 7aea7575..3ad20dd3 100644
--- a/SabreHelper/RomManipulation.cs
+++ b/SabreHelper/RomManipulation.cs
@@ -468,7 +468,7 @@ namespace SabreTools.Helper
if (!sldr.HasRows)
{
query = @"INSERT INTO roms
-(game, name, type, sysid, srcid, size, crc, md5, sha1)
+(game, name, type, sysid, srcid, size, crc, md5, sha1, dupe)
VALUES ('" + tempname.Replace("'", "''") + "', '" +
xtr.GetAttribute("name").Replace("'", "''") + "', '" +
xtr.Name + "', " +
@@ -478,6 +478,7 @@ VALUES ('" + tempname.Replace("'", "''") + "', '" +
(xtr.GetAttribute("crc") != null ? ", '" + xtr.GetAttribute("crc").ToLowerInvariant().Trim() + "'" : ", ''") +
(xtr.GetAttribute("md5") != null ? ", '" + xtr.GetAttribute("md5").ToLowerInvariant().Trim() + "'" : ", ''") +
(xtr.GetAttribute("sha1") != null ? ", '" + xtr.GetAttribute("sha1").ToLowerInvariant().Trim() + "'" : ", ''") +
+ ", '" + filename + "'" +
")";
using (SqliteCommand sslc = new SqliteCommand(query, dbc))
{