diff --git a/eos/db/migrations/upgrade22.py b/eos/db/migrations/upgrade22.py new file mode 100644 index 000000000..fb821c2d1 --- /dev/null +++ b/eos/db/migrations/upgrade22.py @@ -0,0 +1,45 @@ +""" +Migration 22 + +- Adds the created and modified fields to most tables +""" +import sqlalchemy + + +def upgrade(saveddata_engine): + + # 1 = created only + # 2 = created and modified + tables = { + "boosters": 2, + "cargo": 2, + "characters": 2, + "crest": 1, + "damagePatterns": 2, + "drones": 2, + "fighters": 2, + "fits": 2, + "projectedFits": 2, + "commandFits": 2, + "implants": 2, + "implantSets": 2, + "modules": 2, + "overrides": 2, + "characterSkills": 2, + "targetResists": 2 + } + + for table in tables.keys(): + + # midnight brain, there's probably a much more simple way to do this, but fuck it + if tables[table] > 0: + try: + saveddata_engine.execute("SELECT created FROM {0} LIMIT 1;".format(table)) + except sqlalchemy.exc.DatabaseError: + saveddata_engine.execute("ALTER TABLE {} ADD COLUMN created DATETIME;".format(table)) + + if tables[table] > 1: + try: + saveddata_engine.execute("SELECT modified FROM {0} LIMIT 1;".format(table)) + except sqlalchemy.exc.DatabaseError: + saveddata_engine.execute("ALTER TABLE {} ADD COLUMN modified DATETIME;".format(table)) diff --git a/eos/db/saveddata/booster.py b/eos/db/saveddata/booster.py index 11ef16506..518bca003 100644 --- a/eos/db/saveddata/booster.py +++ b/eos/db/saveddata/booster.py @@ -17,18 +17,21 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, ForeignKey, Integer, Boolean +from sqlalchemy import Table, Column, ForeignKey, Integer, Boolean, DateTime from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.orm import mapper, relation +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.booster import Booster boosters_table = Table("boosters", saveddata_meta, - Column("ID", Integer, primary_key=True), - Column("itemID", Integer), - Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False), - Column("active", Boolean), + Column("ID", Integer, primary_key=True), + Column("itemID", Integer), + Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False), + Column("active", Boolean), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()), ) # Legacy booster side effect code, should disable but a mapper relies on it. diff --git a/eos/db/saveddata/cargo.py b/eos/db/saveddata/cargo.py index a0222ac3b..83ab0ca0b 100644 --- a/eos/db/saveddata/cargo.py +++ b/eos/db/saveddata/cargo.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey +from sqlalchemy import Table, Column, Integer, ForeignKey, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.cargo import Cargo @@ -27,6 +28,9 @@ cargo_table = Table("cargo", saveddata_meta, Column("ID", Integer, primary_key=True), Column("fitID", Integer, ForeignKey("fits.ID"), nullable=False, index=True), Column("itemID", Integer, nullable=False), - Column("amount", Integer, nullable=False)) + Column("amount", Integer, nullable=False), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()), + ) mapper(Cargo, cargo_table) diff --git a/eos/db/saveddata/character.py b/eos/db/saveddata/character.py index aaa8a3829..129642905 100644 --- a/eos/db/saveddata/character.py +++ b/eos/db/saveddata/character.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, String +from sqlalchemy import Table, Column, Integer, ForeignKey, String, DateTime from sqlalchemy.orm import relation, mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.db.saveddata.implant import charImplants_table @@ -36,7 +37,9 @@ characters_table = Table("characters", saveddata_meta, Column("chars", String, nullable=True), Column("defaultLevel", Integer, nullable=True), Column("alphaCloneID", Integer, nullable=True), - Column("ownerID", ForeignKey("users.ID"), nullable=True)) + Column("ownerID", ForeignKey("users.ID"), nullable=True), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now())) mapper(Character, characters_table, properties={ diff --git a/eos/db/saveddata/crest.py b/eos/db/saveddata/crest.py index c5cbcbb05..fff78a3ee 100644 --- a/eos/db/saveddata/crest.py +++ b/eos/db/saveddata/crest.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, String +from sqlalchemy import Table, Column, Integer, String, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.crestchar import CrestChar @@ -26,6 +27,8 @@ from eos.saveddata.crestchar import CrestChar crest_table = Table("crest", saveddata_meta, Column("ID", Integer, primary_key=True), Column("name", String, nullable=False, unique=True), - Column("refresh_token", String, nullable=False)) + Column("refresh_token", String, nullable=False), + # These records aren't updated. Instead, they are dropped and created, hence we don't have a modified field + Column("created", DateTime, nullable=True, default=func.now())) mapper(CrestChar, crest_table) diff --git a/eos/db/saveddata/damagePattern.py b/eos/db/saveddata/damagePattern.py index d31c66ea6..6f20cd92f 100644 --- a/eos/db/saveddata/damagePattern.py +++ b/eos/db/saveddata/damagePattern.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, String +from sqlalchemy import Table, Column, Integer, ForeignKey, String, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.damagePattern import DamagePattern @@ -30,6 +31,9 @@ damagePatterns_table = Table("damagePatterns", saveddata_meta, Column("thermalAmount", Integer), Column("kineticAmount", Integer), Column("explosiveAmount", Integer), - Column("ownerID", ForeignKey("users.ID"), nullable=True)) + Column("ownerID", ForeignKey("users.ID"), nullable=True), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) mapper(DamagePattern, damagePatterns_table) diff --git a/eos/db/saveddata/drone.py b/eos/db/saveddata/drone.py index 6a5ffa8bb..93efd9956 100644 --- a/eos/db/saveddata/drone.py +++ b/eos/db/saveddata/drone.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean +from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.drone import Drone @@ -29,6 +30,9 @@ drones_table = Table("drones", saveddata_meta, Column("itemID", Integer, nullable=False), Column("amount", Integer, nullable=False), Column("amountActive", Integer, nullable=False), - Column("projected", Boolean, default=False)) + Column("projected", Boolean, default=False), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) mapper(Drone, drones_table) diff --git a/eos/db/saveddata/fighter.py b/eos/db/saveddata/fighter.py index bd7d8fd54..c6658ead5 100644 --- a/eos/db/saveddata/fighter.py +++ b/eos/db/saveddata/fighter.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean +from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean, DateTime from sqlalchemy.orm import mapper, relation +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.fighterAbility import FighterAbility @@ -31,7 +32,10 @@ fighters_table = Table("fighters", saveddata_meta, Column("itemID", Integer, nullable=False), Column("active", Boolean, nullable=True), Column("amount", Integer, nullable=False), - Column("projected", Boolean, default=False)) + Column("projected", Boolean, default=False), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) fighter_abilities_table = Table("fightersAbilities", saveddata_meta, Column("groupID", Integer, ForeignKey("fighters.groupID"), primary_key=True, diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index 8cbdb4d6f..0f3c9483e 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -21,7 +21,8 @@ from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.orm.collections import attribute_mapped_collection from sqlalchemy.sql import and_ from sqlalchemy.orm import relation, reconstructor, mapper, relationship -from sqlalchemy import ForeignKey, Column, Integer, String, Table, Boolean +from sqlalchemy import ForeignKey, Column, Integer, String, Table, Boolean, DateTime +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.db import saveddata_session @@ -57,6 +58,8 @@ fits_table = Table("fits", saveddata_meta, Column("modeID", Integer, nullable=True), Column("implantLocation", Integer, nullable=False, default=ImplantLocation.FIT), Column("notes", String, nullable=True), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) ) projectedFits_table = Table("projectedFits", saveddata_meta, @@ -64,12 +67,16 @@ projectedFits_table = Table("projectedFits", saveddata_meta, Column("victimID", ForeignKey("fits.ID"), primary_key=True), Column("amount", Integer, nullable=False, default=1), Column("active", Boolean, nullable=False, default=1), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) ) commandFits_table = Table("commandFits", saveddata_meta, Column("boosterID", ForeignKey("fits.ID"), primary_key=True), Column("boostedID", ForeignKey("fits.ID"), primary_key=True), - Column("active", Boolean, nullable=False, default=1) + Column("active", Boolean, nullable=False, default=1), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) ) diff --git a/eos/db/saveddata/implant.py b/eos/db/saveddata/implant.py index c5bfc4cc5..e1f1632c4 100644 --- a/eos/db/saveddata/implant.py +++ b/eos/db/saveddata/implant.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean +from sqlalchemy import Table, Column, Integer, ForeignKey, Boolean, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.implant import Implant @@ -26,7 +27,10 @@ from eos.saveddata.implant import Implant implants_table = Table("implants", saveddata_meta, Column("ID", Integer, primary_key=True), Column("itemID", Integer), - Column("active", Boolean)) + Column("active", Boolean), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) fitImplants_table = Table("fitImplants", saveddata_meta, Column("fitID", ForeignKey("fits.ID"), index=True), diff --git a/eos/db/saveddata/implantSet.py b/eos/db/saveddata/implantSet.py index 955accc07..d06261a54 100644 --- a/eos/db/saveddata/implantSet.py +++ b/eos/db/saveddata/implantSet.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, String +from sqlalchemy import Table, Column, Integer, String, DateTime from sqlalchemy.orm import relation, mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.db.saveddata.implant import implantsSetMap_table @@ -29,6 +30,8 @@ from eos.saveddata.implantSet import ImplantSet implant_set_table = Table("implantSets", saveddata_meta, Column("ID", Integer, primary_key=True), Column("name", String, nullable=False), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) ) mapper(ImplantSet, implant_set_table, diff --git a/eos/db/saveddata/module.py b/eos/db/saveddata/module.py index c5533d4ed..7f869c0a6 100644 --- a/eos/db/saveddata/module.py +++ b/eos/db/saveddata/module.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean +from sqlalchemy import Table, Column, Integer, ForeignKey, CheckConstraint, Boolean, DateTime from sqlalchemy.orm import relation, mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.module import Module @@ -33,6 +34,8 @@ modules_table = Table("modules", saveddata_meta, Column("state", Integer, CheckConstraint("state >= -1"), CheckConstraint("state <= 2")), Column("projected", Boolean, default=False, nullable=False), Column("position", Integer), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()), CheckConstraint('("dummySlot" = NULL OR "itemID" = NULL) AND "dummySlot" != "itemID"')) mapper(Module, modules_table, diff --git a/eos/db/saveddata/override.py b/eos/db/saveddata/override.py index 2ca622966..ed3288405 100644 --- a/eos/db/saveddata/override.py +++ b/eos/db/saveddata/override.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, Float +from sqlalchemy import Table, Column, Integer, Float, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.override import Override @@ -26,6 +27,9 @@ from eos.saveddata.override import Override overrides_table = Table("overrides", saveddata_meta, Column("itemID", Integer, primary_key=True, index=True), Column("attrID", Integer, primary_key=True, index=True), - Column("value", Float, nullable=False)) + Column("value", Float, nullable=False), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) mapper(Override, overrides_table) diff --git a/eos/db/saveddata/skill.py b/eos/db/saveddata/skill.py index 5b279e0d3..40192def9 100644 --- a/eos/db/saveddata/skill.py +++ b/eos/db/saveddata/skill.py @@ -17,15 +17,20 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, ForeignKey +from sqlalchemy import Table, Column, Integer, ForeignKey, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.character import Skill + skills_table = Table("characterSkills", saveddata_meta, Column("characterID", ForeignKey("characters.ID"), primary_key=True, index=True), Column("itemID", Integer, primary_key=True), - Column("_Skill__level", Integer, nullable=True)) + Column("_Skill__level", Integer, nullable=True), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) mapper(Skill, skills_table) diff --git a/eos/db/saveddata/targetResists.py b/eos/db/saveddata/targetResists.py index e8f125c5c..bda30405d 100644 --- a/eos/db/saveddata/targetResists.py +++ b/eos/db/saveddata/targetResists.py @@ -17,8 +17,9 @@ # along with eos. If not, see . # =============================================================================== -from sqlalchemy import Table, Column, Integer, Float, ForeignKey, String +from sqlalchemy import Table, Column, Integer, Float, ForeignKey, String, DateTime from sqlalchemy.orm import mapper +import sqlalchemy.sql.functions as func from eos.db import saveddata_meta from eos.saveddata.targetResists import TargetResists @@ -30,6 +31,9 @@ targetResists_table = Table("targetResists", saveddata_meta, Column("thermalAmount", Float), Column("kineticAmount", Float), Column("explosiveAmount", Float), - Column("ownerID", ForeignKey("users.ID"), nullable=True)) + Column("ownerID", ForeignKey("users.ID"), nullable=True), + Column("created", DateTime, nullable=True, default=func.now()), + Column("modified", DateTime, nullable=True, onupdate=func.now()) + ) mapper(TargetResists, targetResists_table)