i forget what i did today

ok
This commit is contained in:
Malloc of Kuzkycyziklistan 2017-08-25 16:03:33 -05:00
parent 69124ad82f
commit 97a5626fd9
12 changed files with 133 additions and 83 deletions

View file

@ -1,13 +1,27 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace SockScape.DAL { namespace SockScape.DAL {
class Item { class Item {
public ulong Id { get; set; } public long Id { get; set; }
[ForeignKey("Master"), Required]
public int MasterId { get; set; }
public virtual ItemMaster Master { get; set; }
[ForeignKey("User"), Required]
public long UserId { get; set; }
public virtual User User { get; set; }
[Required]
public long Quantity { get; set; }
[Required]
public long Sequence { get; set; }
} }
} }

View file

@ -19,16 +19,16 @@ namespace SockScape.DAL {
[Required, DefaultValue(false)] [Required, DefaultValue(false)]
public bool Stackable { get; set; } public bool Stackable { get; set; }
[Required, DefaultValue(UInt32.MaxValue)] [Required, DefaultValue(UInt32.MaxValue)]
public uint MaxStack { get; set; } public long MaxStack { get; set; }
[Required, DefaultValue(true)] [Required, DefaultValue(true)]
public bool Droppable { get; set; } public bool Droppable { get; set; }
[Required, MaxLength(64)] [Required, MaxLength(64)]
public string Sheet { get; set; } public string Sheet { get; set; }
[Required] [Required]
public ushort Row { get; set; } public int Row { get; set; }
[Required] [Required]
public ushort Column { get; set; } public int Column { get; set; }
[MaxLength(64)] [MaxLength(64)]
public string Object { get; set; } public string Object { get; set; }

View file

@ -16,8 +16,7 @@ namespace SockScape.DAL {
public long UserId { get; set; } public long UserId { get; set; }
public virtual User User { get; set; } public virtual User User { get; set; }
[Index("IX_RawIp_UserId_Unique", 2, IsUnique = true)] [Required, Index("IX_RawIp_UserId_Unique", 2, IsUnique = true)]
[MaxLength(16), Required]
public byte[] RawIp { get; set; } public byte[] RawIp { get; set; }
[NotMapped] [NotMapped]

View file

@ -36,7 +36,9 @@ namespace SockScape.DAL {
protected override void OnModelCreating(DbModelBuilder builder) { protected override void OnModelCreating(DbModelBuilder builder) {
base.OnModelCreating(builder); base.OnModelCreating(builder);
builder.HasDefaultSchema(String.Empty);
builder.Properties<string>() builder.Properties<string>()
.Configure(s => s.HasMaxLength(256).HasColumnType("varchar")); .Configure(s => s.HasMaxLength(256).HasColumnType("varchar"));

View file

@ -14,9 +14,7 @@ namespace SockScape.DAL {
[Required] [Required]
public virtual User User { get; set; } public virtual User User { get; set; }
[Required] [Required, Index(IsUnique = true)]
[Index(IsUnique = true)]
[MaxLength(16), MinLength(16)]
public byte[] Secret { get; set; } public byte[] Secret { get; set; }
[Required] [Required]

View file

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -9,12 +10,10 @@ namespace SockScape.DAL {
public partial class User { public partial class User {
public long Id { get; set; } public long Id { get; set; }
[Required] [Required, MaxLength(16)]
[MaxLength(16)]
public string Username { get; set; } public string Username { get; set; }
[Required] [Required]
[MaxLength(36), MinLength(36)]
public byte[] Password { get; set; } public byte[] Password { get; set; }
[Required] [Required]

View file

@ -15,7 +15,6 @@ using MySql.Data.Entity;
namespace SockScape { namespace SockScape {
class Entrypoint { class Entrypoint {
static void Main(string[] args) { static void Main(string[] args) {
DbConfiguration.SetConfiguration(new MySqlEFConfiguration());
var db = new DAL.ScapeDb(); var db = new DAL.ScapeDb();
Dictionary<int, Server> servers Dictionary<int, Server> servers

View file

@ -1,61 +0,0 @@
namespace SockScape.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Origins",
c => new
{
Id = c.Long(nullable: false, identity: true),
UserId = c.Long(nullable: false),
RawIp = c.Binary(nullable: false, storeType: "binary(16)"),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Users", t => t.UserId, cascadeDelete: true)
.Index(t => new { t.UserId, t.RawIp }, unique: true, name: "IX_RawIp_UserId_Unique");
CreateTable(
"dbo.Users",
c => new
{
Id = c.Long(nullable: false, identity: true),
Username = c.String(nullable: false, maxLength: 16, storeType: "varchar"),
Password = c.Binary(nullable: false, storeType: "binary(36)"),
Joined = c.DateTime(nullable: false, precision: 0),
LastLogin = c.DateTime(precision: 0),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Sessions",
c => new
{
Id = c.Long(nullable: false),
Secret = c.Binary(nullable: false, storeType: "binary(16)"),
ServerId = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Users", t => t.Id)
.Index(t => t.Id)
.Index(t => t.Secret, unique: true);
}
public override void Down()
{
DropForeignKey("dbo.Origins", "UserId", "dbo.Users");
DropForeignKey("dbo.Sessions", "Id", "dbo.Users");
DropIndex("dbo.Sessions", new[] { "Secret" });
DropIndex("dbo.Sessions", new[] { "Id" });
DropIndex("dbo.Origins", "IX_RawIp_UserId_Unique");
DropTable("dbo.Sessions");
DropTable("dbo.Users");
DropTable("dbo.Origins");
}
}
}

View file

@ -13,7 +13,7 @@ namespace SockScape.Migrations
string IMigrationMetadata.Id string IMigrationMetadata.Id
{ {
get { return "201708231959530_Initial"; } get { return "201708251600325_Initial"; }
} }
string IMigrationMetadata.Source string IMigrationMetadata.Source

View file

@ -0,0 +1,100 @@
namespace SockScape.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"ItemMaster",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 64, unicode: false),
Description = c.String(nullable: false, maxLength: 256, unicode: false),
Stackable = c.Boolean(nullable: false),
MaxStack = c.Long(nullable: false),
Droppable = c.Boolean(nullable: false),
Sheet = c.String(nullable: false, maxLength: 64, unicode: false),
Row = c.Int(nullable: false),
Column = c.Int(nullable: false),
Object = c.String(maxLength: 64, unicode: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"Items",
c => new
{
Id = c.Long(nullable: false, identity: true),
MasterId = c.Int(nullable: false),
UserId = c.Long(nullable: false),
Quantity = c.Long(nullable: false),
Sequence = c.Long(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("ItemMaster", t => t.MasterId, cascadeDelete: true)
.ForeignKey("Users", t => t.UserId, cascadeDelete: true)
.Index(t => t.MasterId)
.Index(t => t.UserId);
CreateTable(
"Users",
c => new
{
Id = c.Long(nullable: false, identity: true),
Username = c.String(nullable: false, maxLength: 16, unicode: false),
Password = c.Binary(nullable: false, storeType: "binary(36)"),
Joined = c.DateTime(nullable: false, precision: 0),
LastLogin = c.DateTime(precision: 0),
})
.PrimaryKey(t => t.Id);
CreateTable(
"Origins",
c => new
{
Id = c.Long(nullable: false, identity: true),
UserId = c.Long(nullable: false),
RawIp = c.Binary(nullable: false, storeType: "binary(16)"),
})
.PrimaryKey(t => t.Id)
.ForeignKey("Users", t => t.UserId, cascadeDelete: true)
.Index(t => new { t.UserId, t.RawIp }, unique: true, name: "IX_RawIp_UserId_Unique");
CreateTable(
"Sessions",
c => new
{
Id = c.Long(nullable: false),
Secret = c.Binary(nullable: false, storeType: "binary(16)"),
ServerId = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("Users", t => t.Id)
.Index(t => t.Id)
.Index(t => t.Secret, unique: true);
}
public override void Down()
{
DropForeignKey("Items", "UserId", "Users");
DropForeignKey("Sessions", "Id", "Users");
DropForeignKey("Origins", "UserId", "Users");
DropForeignKey("Items", "MasterId", "ItemMaster");
DropIndex("Sessions", new[] { "Secret" });
DropIndex("Sessions", new[] { "Id" });
DropIndex("Origins", "IX_RawIp_UserId_Unique");
DropIndex("Items", new[] { "UserId" });
DropIndex("Items", new[] { "MasterId" });
DropTable("Sessions");
DropTable("Origins");
DropTable("Users");
DropTable("Items");
DropTable("ItemMaster");
}
}
}

View file

@ -118,9 +118,9 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="Target" xml:space="preserve"> <data name="Target" xml:space="preserve">
<value>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</value> <value>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</value>
</data> </data>
<data name="DefaultSchema" xml:space="preserve"> <data name="DefaultSchema" xml:space="preserve">
<value>dbo</value> <value />
</data> </data>
</root> </root>

View file

@ -96,9 +96,9 @@
<Compile Include="DAL\User.cs" /> <Compile Include="DAL\User.cs" />
<Compile Include="Encryption\KeyExchange.cs" /> <Compile Include="Encryption\KeyExchange.cs" />
<Compile Include="Encryption\Cipher.cs" /> <Compile Include="Encryption\Cipher.cs" />
<Compile Include="Migrations\201708231959530_Initial.cs" /> <Compile Include="Migrations\201708251600325_Initial.cs" />
<Compile Include="Migrations\201708231959530_Initial.Designer.cs"> <Compile Include="Migrations\201708251600325_Initial.Designer.cs">
<DependentUpon>201708231959530_Initial.cs</DependentUpon> <DependentUpon>201708251600325_Initial.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="Migrations\Configuration.cs" /> <Compile Include="Migrations\Configuration.cs" />
<Compile Include="ServerList.cs" /> <Compile Include="ServerList.cs" />
@ -163,8 +163,8 @@
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Migrations\201708231959530_Initial.resx"> <EmbeddedResource Include="Migrations\201708251600325_Initial.resx">
<DependentUpon>201708231959530_Initial.cs</DependentUpon> <DependentUpon>201708251600325_Initial.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />