BizHawk/BizHawk.Client.DBMan/DB.cs

335 lines
11 KiB
C#
Raw Normal View History

2014-03-11 02:48:27 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Community.CsharpSqlite.SQLiteClient;
namespace BizHawk.Client.DBMan
{
public class Rom
{
public long RomId;
public string CRC32;
public string MD5;
public string SHA1;
public string System;
public string Name;
public string Region;
public string VersionTags;
public string RomMetadata;
public string RomStatus;
public string Catalog;
2014-03-11 04:09:58 +00:00
public long Size;
2014-03-11 02:48:27 +00:00
public override string ToString() { return Name + " " + VersionTags; }
public Game Game;
public string CombinedMetaData
{
get
{
if (Game == null) return RomMetadata;
if (Game.GameMetadata == null) return RomMetadata;
if (RomMetadata == null) return Game.GameMetadata;
return Game.GameMetadata + ";" + RomMetadata;
}
}
2014-03-11 04:09:58 +00:00
public string SizeFriendly { get { return string.Format("{0} bytes ({1}k)", Size, Size / 1024); } }
2014-03-11 02:48:27 +00:00
}
public class Game
{
public long GameId;
public string System;
public string Name;
public string Developer;
public string Publisher;
public string Classification;
public string ReleaseDate;
public string Players;
public string GameMetadata;
public string Tags;
public string AltNames;
public string Notes;
public override string ToString() { return Name; }
}
public static class DB
{
public static List<Rom> Roms = new List<Rom>();
public static List<Game> Games = new List<Game>();
public static Dictionary<string, Game> GameMap = new Dictionary<string, Game>();
public static SqliteConnection Con;
public static void LoadDbForSystem(string system)
{
Games.Clear();
Roms.Clear();
LoadGames(system);
LoadRoms(system);
}
static void LoadGames(string system)
{
var cmd = Con.CreateCommand();
cmd.CommandText = "SELECT game_id, system, name, developer, publisher, classification, release_date, players, game_metadata, tags, alternate_names, notes FROM game WHERE system = @System";
cmd.Parameters.Add(new SqliteParameter("@System", system));
var reader = cmd.ExecuteReader();
while (reader.NextResult())
{
var game = new Game();
game.GameId = reader.GetInt64(0);
game.System = reader.GetString(1);
game.Name = reader.GetString(2);
game.Developer = reader.GetString(3);
game.Publisher = reader.GetString(4);
game.Classification = reader.GetString(5);
game.ReleaseDate = reader.GetString(6);
game.Players = reader.GetString(7);
game.GameMetadata = reader.GetString(8);
game.Tags = reader.GetString(9);
game.AltNames = reader.GetString(10);
game.Notes = reader.GetString(11);
Games.Add(game);
GameMap[game.Name] = game;
}
reader.Dispose();
cmd.Dispose();
}
static void LoadRoms(string system)
{
var cmd = Con.CreateCommand();
2014-03-11 04:09:58 +00:00
cmd.CommandText = "SELECT rom_id, crc32, md5, sha1, system, name, region, version_tags, rom_metadata, rom_status, catalog, size FROM rom WHERE system = @System";
2014-03-11 02:48:27 +00:00
cmd.Parameters.Add(new SqliteParameter("@System", system));
var reader = cmd.ExecuteReader();
while (reader.NextResult())
{
var rom = new Rom();
rom.RomId = reader.GetInt64(0);
rom.CRC32 = reader.GetString(1);
rom.MD5 = reader.GetString(2);
rom.SHA1 = reader.GetString(3);
rom.System = reader.GetString(4);
rom.Name = reader.GetString(5);
rom.Region = reader.GetString(6);
rom.VersionTags = reader.GetString(7);
rom.RomMetadata = reader.GetString(8);
rom.RomStatus = reader.GetString(9);
rom.Catalog = reader.GetString(10);
2014-03-11 04:09:58 +00:00
rom.Size = reader.GetInt64(11);
2014-03-11 02:48:27 +00:00
rom.Game = GameMap[rom.Name];
Roms.Add(rom);
}
reader.Dispose();
cmd.Dispose();
}
public static void SaveRom(Rom rom)
{
var cmd = Con.CreateCommand();
cmd.CommandText =
"UPDATE rom SET "+
"region=@Region, "+
"version_tags=@VersionTags, "+
"rom_metadata=@RomMetadata, "+
"rom_status=@RomStatus, "+
"catalog=@Catalog " +
"WHERE rom_id=@RomId";
cmd.Parameters.Add(new SqliteParameter("@Region", rom.Region));
cmd.Parameters.Add(new SqliteParameter("@VersionTags", rom.VersionTags));
cmd.Parameters.Add(new SqliteParameter("@RomMetadata", rom.RomMetadata));
cmd.Parameters.Add(new SqliteParameter("@RomStatus", rom.RomStatus));
cmd.Parameters.Add(new SqliteParameter("@Catalog", rom.Catalog));
cmd.Parameters.Add(new SqliteParameter("@RomId", rom.RomId));
cmd.ExecuteNonQuery();
cmd.Dispose();
cmd = Con.CreateCommand();
cmd.CommandText =
"UPDATE game SET "+
"developer=@Developer, "+
"publisher=@Publisher, "+
"classification=@Classification, "+
"release_date=@ReleaseDate, "+
"players=@Players, "+
"game_metadata=@GameMetadata, "+
"tags=@Tags, "+
"alternate_names=@AltNames, "+
"notes=@Notes "+
"WHERE game_id=@GameId";
cmd.Parameters.Add(new SqliteParameter("@Developer", rom.Game.Developer));
cmd.Parameters.Add(new SqliteParameter("@Publisher", rom.Game.Publisher));
cmd.Parameters.Add(new SqliteParameter("@Classification", rom.Game.Classification));
cmd.Parameters.Add(new SqliteParameter("@ReleaseDate", rom.Game.ReleaseDate));
cmd.Parameters.Add(new SqliteParameter("@Players", rom.Game.Players));
cmd.Parameters.Add(new SqliteParameter("@GameMetadata", rom.Game.GameMetadata));
cmd.Parameters.Add(new SqliteParameter("@Tags", rom.Game.Tags));
cmd.Parameters.Add(new SqliteParameter("@AltNames", rom.Game.AltNames));
cmd.Parameters.Add(new SqliteParameter("@Notes", rom.Game.Notes));
cmd.Parameters.Add(new SqliteParameter("@GameId", rom.Game.GameId));
cmd.ExecuteNonQuery();
cmd.Dispose();
}
public static void SaveRom1(Rom rom, string origSystem, string origName)
{
var cmd = Con.CreateCommand();
cmd.CommandText =
"UPDATE rom SET " +
"system=@System, " +
"name=@Name " +
"WHERE system=@OrigSystem and name=@OrigName";
cmd.Parameters.Add(new SqliteParameter("@System", rom.System));
cmd.Parameters.Add(new SqliteParameter("@Name", rom.Name));
cmd.Parameters.Add(new SqliteParameter("@OrigSystem", origSystem));
cmd.Parameters.Add(new SqliteParameter("@OrigName", origName));
cmd.ExecuteNonQuery();
cmd.Dispose();
cmd = Con.CreateCommand();
cmd.CommandText =
"UPDATE game SET " +
"system=@System, " +
"name=@Name " +
"WHERE system=@OrigSystem and name=@OrigName";
cmd.Parameters.Add(new SqliteParameter("@System", rom.System));
cmd.Parameters.Add(new SqliteParameter("@Name", rom.Name));
cmd.Parameters.Add(new SqliteParameter("@OrigSystem", origSystem));
cmd.Parameters.Add(new SqliteParameter("@OrigName", origName));
cmd.ExecuteNonQuery();
cmd.Dispose();
SaveRom(rom);
}
public static void SaveRom2(Rom rom)
{
var cmd = Con.CreateCommand();
cmd.CommandText =
"UPDATE rom SET " +
"system=@System, "+
"name=@Name, "+
"region=@Region, " +
"version_tags=@VersionTags, " +
"rom_metadata=@RomMetadata, " +
"rom_status=@RomStatus, " +
"catalog=@Catalog " +
"WHERE rom_id=@RomId";
cmd.Parameters.Add(new SqliteParameter("@System", rom.System));
cmd.Parameters.Add(new SqliteParameter("@Name", rom.Name));
cmd.Parameters.Add(new SqliteParameter("@Region", rom.Region));
cmd.Parameters.Add(new SqliteParameter("@VersionTags", rom.VersionTags));
cmd.Parameters.Add(new SqliteParameter("@RomMetadata", rom.RomMetadata));
cmd.Parameters.Add(new SqliteParameter("@RomStatus", rom.RomStatus));
cmd.Parameters.Add(new SqliteParameter("@Catalog", rom.Catalog));
cmd.Parameters.Add(new SqliteParameter("@RomId", rom.RomId));
cmd.ExecuteNonQuery();
cmd.Dispose();
bool gameAlreadyExists = false;
cmd = Con.CreateCommand();
cmd.CommandText = "SELECT game_id FROM game WHERE system=@System and name=@Name";
cmd.Parameters.Add(new SqliteParameter("@System", rom.System));
cmd.Parameters.Add(new SqliteParameter("@Name", rom.Name));
gameAlreadyExists = cmd.ExecuteScalar() != null;
cmd.Dispose();
if (!gameAlreadyExists)
{
cmd = Con.CreateCommand();
cmd.CommandText = "INSERT INTO game (system, name) values (@System, @Name)";
cmd.Parameters.Add(new SqliteParameter("@System", rom.System));
cmd.Parameters.Add(new SqliteParameter("@Name", rom.Name));
cmd.ExecuteNonQuery();
cmd.Dispose();
}
cmd = Con.CreateCommand();
cmd.CommandText =
"UPDATE game SET " +
"developer=@Developer, " +
"publisher=@Publisher, " +
"classification=@Classification, " +
"release_date=@ReleaseDate, " +
"players=@Players, " +
"game_metadata=@GameMetadata, " +
"tags=@Tags, " +
"alternate_names=@AltNames, " +
"notes=@Notes " +
"WHERE system=@System and name=@Name";
cmd.Parameters.Add(new SqliteParameter("@Developer", rom.Game.Developer));
cmd.Parameters.Add(new SqliteParameter("@Publisher", rom.Game.Publisher));
cmd.Parameters.Add(new SqliteParameter("@Classification", rom.Game.Classification));
cmd.Parameters.Add(new SqliteParameter("@ReleaseDate", rom.Game.ReleaseDate));
cmd.Parameters.Add(new SqliteParameter("@Players", rom.Game.Players));
cmd.Parameters.Add(new SqliteParameter("@GameMetadata", rom.Game.GameMetadata));
cmd.Parameters.Add(new SqliteParameter("@Tags", rom.Game.Tags));
cmd.Parameters.Add(new SqliteParameter("@System", rom.System));
cmd.Parameters.Add(new SqliteParameter("@Name", rom.Name));
cmd.Parameters.Add(new SqliteParameter("@AltNames", rom.Game.AltNames));
cmd.Parameters.Add(new SqliteParameter("@Notes", rom.Game.Notes));
cmd.ExecuteNonQuery();
cmd.Dispose();
}
public static void Cleanup()
{
var orphanedGameList = new List<Tuple<string, string>>();
var cmd = Con.CreateCommand();
cmd.CommandText =
"SELECT system, name FROM game "+
"EXCEPT "+
"SELECT system, name FROM rom";
var reader = cmd.ExecuteReader();
while (reader.NextResult())
{
string system = reader.GetString(0);
string name = reader.GetString(1);
orphanedGameList.Add(new Tuple<string, string>(system, name));
}
reader.Dispose();
cmd.Dispose();
cmd = Con.CreateCommand();
cmd.CommandText = "DELETE FROM game WHERE system=@System and name=@Name";
foreach (var orphanedGame in orphanedGameList)
{
cmd.Parameters.Clear();
cmd.Parameters.Add(new SqliteParameter("@System", orphanedGame.Item1));
cmd.Parameters.Add(new SqliteParameter("@Name", orphanedGame.Item2));
cmd.ExecuteNonQuery();
}
cmd.Dispose();
cmd = Con.CreateCommand();
cmd.CommandText = "VACUUM";
cmd.ExecuteNonQuery();
cmd.Dispose();
}
public static List<string> GetDeveloperPublisherNames()
{
var names = new List<string>();
var cmd = Con.CreateCommand();
cmd.CommandText =
"SELECT DISTINCT developer FROM game WHERE developer is not null " +
"UNION " +
"SELECT DISTINCT publisher FROM game WHERE publisher is not null";
var reader = cmd.ExecuteReader();
while (reader.NextResult())
{
names.Add(reader.GetString(0));
}
reader.Dispose();
cmd.Dispose();
return names;
}
}
}