Changeset 4e3480232150fec3f0d7484fb98198030b98b813

Show
Ignore:
Timestamp:
06/09/07 23:40:50 (1 year ago)
Author:
Christopher Jung <bktheg@web.de>
git-committer:
Christopher Jung <bktheg@web.de> 1181425250 +0200
git-parent:

[873e52de84747c990bb3a932eb6e9d93db3063f8]

git-author:
Christopher Jung <bktheg@web.de> 1181425250 +0200
Message:

Erste Anfaenge der Hibernate-Integration im Tick

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • db/tables/bases.sql

    r8825186 r4e34802  
    2323  `coreactive` tinyint(3) unsigned NOT NULL default '0', 
    2424  `autogtuacts` text NOT NULL default '', 
     25  `version` int(11) NOT NULL default '0', 
    2526  PRIMARY KEY  (`id`), 
    2627  KEY `owner` (`owner`,`id`), 
  • db/updates.xml

    r23d6d8b r4e34802  
    283283                UPDATE ships SET fleet=NULL WHERE fleet=0; 
    284284                ALTER TABLE ships ADD CONSTRAINT ships_fk_ship_fleets FOREIGN KEY (fleet) REFERENCES ship_fleets(id); 
     285                ALTER TABLE bases ADD COLUMN version INT NOT NULL DEFAULT '0'; 
    285286        ]]></update> 
    286287</updates> 
  • src/net/driftingsouls/ds2/server/bases/Base.java

    r283e6c7 r4e34802  
    3535import javax.persistence.Table; 
    3636import javax.persistence.Transient; 
     37import javax.persistence.Version; 
    3738 
    3839import net.driftingsouls.ds2.server.cargo.Cargo; 
     
    9495        @Column(name="autogtuacts") 
    9596        private String autoGtuActs; 
     97        @Version 
     98        private int version; 
    9699         
    97100        @Transient 
     
    671674                return false; 
    672675        } 
     676 
     677        /** 
     678         * Gibt die Versionsnummer des Eintrags zurueck 
     679         * @return Die Versionsnummer 
     680         */ 
     681        public int getVersion() { 
     682                return version; 
     683        } 
    673684} 
  • src/net/driftingsouls/ds2/server/entities/User.java

    r283e6c7 r4e34802  
    836836         
    837837        /** 
     838         * Setzt die Nahrungsbilanz des letzten Ticks 
     839         * @param stat Die Nahrungsbilanz des letzten Ticks 
     840         */ 
     841        public void setNahrungsStat(String stat) { 
     842                this.nstat = stat; 
     843        } 
     844         
     845        /** 
    838846         * Liefert die Anzahl der NPC-Punkte des Benutzers zurueck. 
    839847         * @return Die Anzahl der NPC-Punkte 
  • src/net/driftingsouls/ds2/server/modules/TransportController.java

    r283e6c7 r4e34802  
    428428                        Database db = ContextMap.getContext().getDatabase(); 
    429429                         
    430                         db.tUpdate(1,"UPDATE bases SET cargo='",getCargo().save(),"' WHERE id='",getData().getInt("id"),"' AND cargo='",getCargo().save(true),"'"); 
     430                        db.tUpdate(1,"UPDATE bases SET cargo='",getCargo().save(),"',version=version+1 WHERE id='",getData().getInt("id"),"' AND cargo='",getCargo().save(true),"'"); 
    431431                } 
    432432        } 
  • src/net/driftingsouls/ds2/server/ships/Ship.java

    r23d6d8b r4e34802  
    2020 
    2121import java.sql.Blob; 
     22import java.util.ArrayList; 
     23import java.util.List; 
    2224 
    2325import javax.persistence.Column; 
     
    2931import javax.persistence.Table; 
    3032 
     33import net.driftingsouls.ds2.server.Offizier; 
    3134import net.driftingsouls.ds2.server.cargo.Cargo; 
     35import net.driftingsouls.ds2.server.cargo.Resources; 
     36import net.driftingsouls.ds2.server.config.ItemEffect; 
    3237import net.driftingsouls.ds2.server.entities.User; 
     38import net.driftingsouls.ds2.server.framework.Common; 
    3339import net.driftingsouls.ds2.server.framework.ContextMap; 
    3440import net.driftingsouls.ds2.server.framework.Loggable; 
     
    729735         
    730736        /** 
     737         * Gibt die Typen-Daten des Schiffs zurueck  
     738         * @return die Typen-Daten 
     739         */ 
     740        public ShipTypeData getTypeData() {      
     741                ShipModules modules = null; 
     742                 
     743                if( status.indexOf("tblmodules") != -1 ) { 
     744                        org.hibernate.Session db = ContextMap.getContext().getDB(); 
     745                        modules = (ShipModules)db.get(ShipModules.class, this.id); 
     746                } 
     747                 
     748                return getShipType(this.type, modules, false); 
     749        } 
     750         
     751        private static final int MANGEL_TICKS = 9; 
     752         
     753        /** 
     754         * Berechnet das Status-Feld des Schiffes neu. Diese Aktion sollte nach jeder 
     755         * Operation angewendet werden, die das Schiff in irgendeiner Weise veraendert. 
     756         * @return der neue Status-String 
     757         */ 
     758        public String recalculateShipStatus() { 
     759                if( this.id < 0 ) { 
     760                        throw new UnsupportedOperationException("recalculateShipStatus kann nur bei Schiffen mit positiver ID ausgefuhert werden!"); 
     761                } 
     762                 
     763                org.hibernate.Session db = ContextMap.getContext().getDB(); 
     764                 
     765                ShipTypeData type = this.getTypeData(); 
     766                 
     767                Cargo cargo = this.cargo; 
     768                 
     769                List<String> status = new ArrayList<String>(); 
     770                 
     771                // Alten Status lesen und ggf Elemente uebernehmen 
     772                String[] oldstatus = StringUtils.split(this.status, ' '); 
     773                 
     774                if( oldstatus.length > 0 ) { 
     775                        for( int i=0; i < oldstatus.length; i++ ) { 
     776                                String astatus = oldstatus[i]; 
     777                                if( !astatus.equals("disable_iff") && !astatus.equals("mangel_nahrung") &&  
     778                                        !astatus.equals("mangel_reaktor") && !astatus.equals("offizier") &&  
     779                                        !astatus.equals("nocrew") && !astatus.equals("nebel") && !astatus.equals("tblmodules") ) { 
     780                                        status.add(astatus); 
     781                                } 
     782                        } 
     783                } 
     784                 
     785                // Treibstoffverbrauch bereichnen 
     786                if( type.getRm() > 0 ) { 
     787                        long ep = cargo.getResourceCount( Resources.URAN ) * type.getRu() +  
     788                                cargo.getResourceCount( Resources.DEUTERIUM ) * type.getRd() +  
     789                                cargo.getResourceCount( Resources.ANTIMATERIE ) * type.getRa(); 
     790                        long er = ep/type.getRm(); 
     791                         
     792                        int turns = 2; 
     793                        if( (this.alarm == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 
     794                                turns = 4;       
     795                        } 
     796                         
     797                        if( er <= MANGEL_TICKS/turns ) { 
     798                                status.add("mangel_reaktor"); 
     799                        } 
     800                } 
     801                 
     802                // Ist Crew an Bord? 
     803                if( (type.getCrew() != 0) && (this.crew == 0) ) { 
     804                        status.add("nocrew");    
     805                } 
     806         
     807                // Die Items nach IFF und Hydros durchsuchen 
     808                boolean disableIFF = false; 
     809         
     810                if( cargo.getItemWithEffect(ItemEffect.Type.DISABLE_IFF) != null ) { 
     811                        disableIFF = true; 
     812                } 
     813                 
     814                if( disableIFF ) { 
     815                        status.add("disable_iff"); 
     816                } 
     817                 
     818                Cargo usercargo = new Cargo(Cargo.Type.STRING, this.owner.getCargo()); 
     819                 
     820                // Den Nahrungsverbrauch berechnen 
     821                if( this.crew > 0 ) { 
     822                        double scale = 1; 
     823                        if( (this.alarm == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 
     824                                scale = 0.9;     
     825                        } 
     826                         
     827                        int nn = (int)Math.ceil(this.crew/scale) - type.getHydro(); 
     828                        if( (nn > 0) || ((nn == 0) && (type.getHydro() == 0)) ) { 
     829                                if( nn == 0 ) nn = 1; 
     830                                long nr = usercargo.getResourceCount( Resources.NAHRUNG )/nn; 
     831                                 
     832                                if( nr <= MANGEL_TICKS ) { 
     833                                        status.add("mangel_nahrung"); 
     834                                } 
     835                        } 
     836                } 
     837                 
     838                // Ist ein Offizier an Bord? 
     839                Offizier offi = Offizier.getOffizierByDest('s', this.id); 
     840                if( offi != null ) { 
     841                        status.add("offizier"); 
     842                } 
     843                 
     844                ShipModules modules = (ShipModules)db.get(ShipModules.class, this.id); 
     845                if( modules != null ) { 
     846                        status.add("tblmodules"); 
     847                } 
     848                 
     849                this.status = Common.implode(" ", status); 
     850                         
     851                return this.status; 
     852        } 
     853         
     854        /** 
    731855         * Gibt die Liste aller Flags zurueck, ueber die der angegebene 
    732856         * Schiffstyp verfuegt 
  • src/net/driftingsouls/ds2/server/ships/Ships.java

    r23d6d8b r4e34802  
    3636import net.driftingsouls.ds2.server.cargo.modules.Modules; 
    3737import net.driftingsouls.ds2.server.config.Item; 
    38 import net.driftingsouls.ds2.server.config.ItemEffect; 
    3938import net.driftingsouls.ds2.server.config.Rassen; 
    4039import net.driftingsouls.ds2.server.config.StarSystem; 
     
    6867 */ 
    6968public class Ships implements Loggable { 
    70         private static final int MANGEL_TICKS = 9; 
    71          
    7269        /** 
    7370         * Repraesentiert ein in ein Schiff eingebautes Modul (oder vielmehr die Daten,  
     
    123120         */ 
    124121        public static String recalculateShipStatus(int shipID) { 
    125                 Database db = ContextMap.getContext().getDatabase(); 
     122                if( shipID < 0 ) { 
     123                        throw new IllegalArgumentException("shipID muss groesser 0 sein!"); 
     124                } 
     125                 
     126                org.hibernate.Session db = ContextMap.getContext().getDB(); 
    126127 
    127                 SQLResultRow ship = db.first("SELECT id,type,crew,status,cargo,owner,alarm,system,x,y FROM ships WHERE id>0 AND id='",shipID,"'"); 
    128                  
    129                 ShipTypeData type = Ship.getShipType(ship); 
    130                  
    131                 Cargo cargo = new Cargo( Cargo.Type.STRING, ship.getString("cargo") ); 
    132                  
    133                 List<String> status = new ArrayList<String>(); 
    134                  
    135                 // Alten Status lesen und ggf Elemente uebernehmen 
    136                 String[] oldstatus = StringUtils.split(ship.getString("status"), ' '); 
    137                  
    138                 if( oldstatus.length > 0 ) { 
    139                         for( int i=0; i < oldstatus.length; i++ ) { 
    140                                 String astatus = oldstatus[i]; 
    141                                 if( !astatus.equals("disable_iff") && !astatus.equals("mangel_nahrung") &&  
    142                                         !astatus.equals("mangel_reaktor") && !astatus.equals("offizier") &&  
    143                                         !astatus.equals("nocrew") && !astatus.equals("nebel") && !astatus.equals("tblmodules") ) { 
    144                                         status.add(astatus); 
    145                                 } 
    146                         } 
    147                 } 
    148                  
    149                 // Treibstoffverbrauch bereichnen 
    150                 if( type.getRm() > 0 ) { 
    151                         long ep = cargo.getResourceCount( Resources.URAN ) * type.getRu() +  
    152                                 cargo.getResourceCount( Resources.DEUTERIUM ) * type.getRd() +  
    153                                 cargo.getResourceCount( Resources.ANTIMATERIE ) * type.getRa(); 
    154                         long er = ep/type.getRm(); 
    155                          
    156                         int turns = 2; 
    157                         if( (ship.getInt("alarm") == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 
    158                                 turns = 4;       
    159                         } 
    160                          
    161                         if( er <= MANGEL_TICKS/turns ) { 
    162                                 status.add("mangel_reaktor"); 
    163                         } 
    164                 } 
    165                  
    166                 // Ist Crew an Bord? 
    167                 if( (type.getCrew() != 0) && (ship.getInt("crew") == 0) ) { 
    168                         status.add("nocrew");    
    169                 } 
    170          
    171                 // Die Items nach IFF und Hydros durchsuchen 
    172                 boolean disableIFF = false; 
    173          
    174                 if( cargo.getItemWithEffect(ItemEffect.Type.DISABLE_IFF) != null ) { 
    175                         disableIFF = true; 
    176                 } 
    177                  
    178                 if( disableIFF ) { 
    179                         status.add("disable_iff"); 
    180                 } 
    181                  
    182                 Cargo usercargo = new Cargo( Cargo.Type.STRING, db.first("SELECT cargo FROM users WHERE id='"+ship.getInt("owner")+"'").getString("cargo")); 
    183                  
    184                 // Den Nahrungsverbrauch berechnen 
    185                 if( ship.getInt("crew") > 0 ) { 
    186                         double scale = 1; 
    187                         if( (ship.getInt("alarm") == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 
    188                                 scale = 0.9;     
    189                         } 
    190                          
    191                         int nn = (int)Math.ceil(ship.getInt("crew")/scale) - type.getHydro(); 
    192                         if( (nn > 0) || ((nn == 0) && (type.getHydro() == 0)) ) { 
    193                                 if( nn == 0 ) nn = 1; 
    194                                 long nr = usercargo.getResourceCount( Resources.NAHRUNG )/nn; 
    195                                  
    196                                 if( nr <= MANGEL_TICKS ) { 
    197                                         status.add("mangel_nahrung"); 
    198                                 } 
    199                         } 
    200                 } 
    201                  
    202                 // Ist ein Offizier an Bord? 
    203                 Offizier offi = Offizier.getOffizierByDest('s', shipID); 
    204                 if( offi != null ) { 
    205                         status.add("offizier"); 
    206                 } 
    207                  
    208                 SQLResultRow modules = db.first("SELECT id FROM ships_modules WHERE id="+shipID); 
    209                 if( !modules.isEmpty() ) { 
    210                         status.add("tblmodules"); 
    211                 } 
    212                  
    213                 boolean savestatus = true; 
    214                  
    215                 String statusString = Common.implode(" ", status); 
    216                 if( ship.getString("status").equals(statusString) ) { 
    217                         savestatus = false; 
    218                 } 
    219          
    220                 if( savestatus ) { 
    221                         db.tUpdate(1, "UPDATE ships SET status='"+statusString+"' WHERE id>0 AND id='",shipID,"' AND status='",ship.getString("status")+"'"); 
    222                 } 
    223                  
    224                 return statusString; 
     128                Ship ship = (Ship)db.get(Ship.class, shipID); 
     129                 
     130                return ship.recalculateShipStatus(); 
    225131        } 
    226132         
  • src/net/driftingsouls/ds2/server/tick/AbstractTickExecuter.java

    r283e6c7 r4e34802  
    108108                tick.execute(); 
    109109                tick.dispose(); 
     110                 
     111                getDB().flush(); 
     112                getDB().clear(); 
    110113        } 
    111114         
  • src/net/driftingsouls/ds2/server/tick/TickController.java

    r3924571 r4e34802  
    129129         */ 
    130130        public void execute() { 
    131                 log("-----------------"+Common.date("d.m.Y H:i:s")+"-------------------"); 
    132                  
    133                 prepare(); 
    134                 if( getErrorList().length == 0 ) { 
    135                         tick(); 
    136                 } 
    137                  
    138                 if( getErrorList().length > 0 ) { 
     131                getDB().beginTransaction(); 
     132                try { 
     133                        log("-----------------"+Common.date("d.m.Y H:i:s")+"-------------------"); 
     134                         
     135                        prepare(); 
     136                        if( getErrorList().length == 0 ) { 
     137                                tick(); 
     138                        } 
     139                         
     140                        if( getErrorList().length > 0 ) { 
     141                                log(""); 
     142                                log("Fehlerliste:"); 
     143         
     144                                for( net.driftingsouls.ds2.server.framework.pipeline.Error error : getErrorList() ) { 
     145                                        slog("* "); 
     146                                        log(error.getDescription()); 
     147                                } 
     148                        } 
     149                         
     150                        if( context.getResponse().getContent().length() > 0 ) { 
     151                                log("\n-------------Weitere Ausgaben---------------\n"); 
     152                                log(context.getResponse().getContent().toString()); 
     153                        } 
     154                        context.getResponse().setContent(""); 
     155                         
    139156                        log(""); 
    140                         log("Fehlerliste:"); 
    141  
    142                         for( net.driftingsouls.ds2.server.framework.pipeline.Error error : getErrorList() ) { 
    143                                 slog("* "); 
    144                                 log(error.getDescription()); 
    145                         } 
    146                 } 
    147                  
    148                 if( context.getResponse().getContent().length() > 0 ) { 
    149                         log("\n-------------Weitere Ausgaben---------------\n"); 
    150                         log(context.getResponse().getContent().toString()); 
    151                 } 
    152                 context.getResponse().setContent(""); 
    153                  
    154                 log(""); 
    155                 log("QCount: "+getDatabase().getQCount()); 
    156                  
    157                 log("Execution-Time: "+(System.currentTimeMillis()-exectime)+"s"); 
     157                        log("QCount: "+getDatabase().getQCount()); 
     158                         
     159                        log("Execution-Time: "+(System.currentTimeMillis()-exectime)+"s"); 
     160                } 
     161                catch( Exception e ) { 
     162                        getDB().getTransaction().rollback(); 
     163                } 
     164                finally { 
     165                        getDB().flush(); 
     166                        if( getDB().getTransaction().isActive() && !getDB().getTransaction().wasRolledBack() ) { 
     167                                getDB().getTransaction().commit(); 
     168                        } 
     169                } 
    158170        } 
    159171         
  • src/net/driftingsouls/ds2/server/tick/regular/BaseTick.java

    r283e6c7 r4e34802  
    2424import java.util.Map; 
    2525 
     26import org.hibernate.FlushMode; 
     27 
    2628import net.driftingsouls.ds2.server.ContextCommon; 
    2729import net.driftingsouls.ds2.server.bases.AutoGTUAction; 
     
    3436import net.driftingsouls.ds2.server.comm.PM; 
    3537import net.driftingsouls.ds2.server.config.Faction; 
     38import net.driftingsouls.ds2.server.entities.GtuWarenKurse; 
    3639import net.driftingsouls.ds2.server.entities.User; 
    3740import net.driftingsouls.ds2.server.framework.Common; 
    3841import net.driftingsouls.ds2.server.framework.db.Database; 
    39 import net.driftingsouls.ds2.server.framework.db.PreparedQuery; 
    40 import net.driftingsouls.ds2.server.framework.db.SQLQuery; 
    4142import net.driftingsouls.ds2.server.framework.db.SQLResultRow; 
    4243import net.driftingsouls.ds2.server.tick.TickController; 
     
    5455        private Cargo usercargo; 
    5556        private int tick; 
    56         private int retries; 
    57         private PreparedQuery updateBaseQuery = null; 
    5857         
    5958        @Override 
    6059        protected void prepare() { 
    61                 Database db = getDatabase(); 
     60                getDB().setFlushMode(FlushMode.MANUAL); 
    6261                 
    6362                // Aktuelle Warenkurse fuer die Kommandozentrale laden 
    64                 String curse = db.first("SELECT kurse FROM gtu_warenkurse WHERE place='asti'").getString("kurse"); 
    65                 this.curse = new Cargo( Cargo.Type.STRING, curse ); 
     63                GtuWarenKurse kurs = (GtuWarenKurse)getDB().get(GtuWarenKurse.class, "asti"); 
     64                this.curse = kurs.getKurse(); 
    6665                 
    6766                this.pmcache = new StringBuilder(); 
     
    7069                this.gtustatslist = new HashMap<Integer,Cargo>(); 
    7170                this.tick = getContext().get(ContextCommon.class).getTick(); 
    72                 this.retries = 0; 
    7371        } 
    7472         
     
    7674                Database db = getContext().getDatabase(); 
    7775                 
    78                 long usercargostart = this.usercargo.getResourceCount(Resources.NAHRUNG); 
    7976                Map<Integer,Cargo> oldgtustatslist = new HashMap<Integer,Cargo>(); 
    8077                for( Integer sysid : this.gtustatslist.keySet() ) { 
    8178                        oldgtustatslist.put(sysid, (Cargo)gtustatslist.get(sysid).clone() ); 
    8279                } 
    83                 StringBuilder oldpmcache = new StringBuilder(this.pmcache); 
    84                 Base oldbase = (Base)base.clone(); 
    85                  
     80 
    8681                Cargo cargo = (Cargo)base.getCargo().clone(); 
    8782                cargo.setOption( Cargo.Option.NOHTML, true ); 
     
    273268                                get += get2; 
    274269                        } 
    275                          
    276                         db.tBegin(true); 
    277                          
     270 
    278271                        // Haben wir was verkauft? Wenn ja nun das Geld ueberweisen 
    279272                        if( get > 0 ) { 
     
    282275                        } 
    283276                         
    284                         if( (basedata.getArbeiter() != oldbase.getArbeiter()) || (bewohner != oldbase.getBewohner()) || 
    285                                 (e != oldbase.getEnergy()) || !nc.save().equals(oldbase.getCargo().save()) ) { 
    286                                          
    287                                 updateBaseQuery.tUpdate(1, basedata.getArbeiter(), bewohner, newe, nc.save(),  
    288                                                 base.getID(), oldbase.getArbeiter(), oldbase.getBewohner(), oldbase.getEnergy(), oldbase.getCargo().save() ); 
    289                                 base.setCargo(nc); 
    290                         } 
    291                         if( !db.tCommit() ) { 
    292                                 this.log("\t++++++++++++++ COMMIT ERROR - RETRYING ++++++++++++++"); 
    293                                 this.usercargo.setResource(Resources.NAHRUNG, usercargostart); 
    294                                 this.gtustatslist = oldgtustatslist; 
    295                                 this.pmcache = oldpmcache; 
    296                                  
    297                                 this.retries--; 
    298                                 if( this.retries > 0 ) { 
    299                                         base = new Base(db.first("SELECT * FROM bases WHERE id=",oldbase.getID())); 
    300                                                                                   
    301                                         tickBase( base ); 
    302                                         return;  
    303                                 } 
    304                                 this.log("\t+++++++++++++++ GEBE AUF +++++++++++++++");  
    305                         } 
     277                        base.setArbeiter(basedata.getArbeiter()); 
     278                        base.setBewohner(bewohner); 
     279                        base.setEnergy(newe); 
     280                        base.setCargo(nc); 
    306281                } 
    307282                // Offenbar haben wir es mit chaotischen Zustaenden zu tun.... 
     
    314289                                this.usercargo.setResource(Resources.NAHRUNG, 0); 
    315290                        } 
    316          
    317                         db.tBegin(true); 
    318          
    319                         if( (basedata.getArbeiter() != oldbase.getArbeiter()) || (basedata.getBewohner() != oldbase.getBewohner()) ||  
    320                                 (newe != oldbase.getEnergy()) || !cargo.save().equals(oldbase.getCargo().save()) ) { 
    321                                  
    322                                 this.log("Schreibe neue Werte..."); 
    323  
    324                                 updateBaseQuery.tUpdate(1, basedata.getArbeiter(), basedata.getBewohner(), newe, cargo.save(),  
    325                                                 base.getID(), oldbase.getArbeiter(), oldbase.getBewohner(), oldbase.getEnergy(), oldbase.getCargo().save() ); 
    326                                 base.setCargo(cargo); 
    327                         } 
    328          
     291 
     292                        base.setArbeiter(basedata.getArbeiter()); 
     293                        base.setBewohner(basedata.getBewohner()); 
     294                        base.setEnergy(newe); 
     295                        base.setCargo(cargo); 
     296                         
    329297                        this.pmcache.append("[b]"); 
    330298                        this.pmcache.append(base.getName()); 
     
    349317                                } 
    350318                                base.setCoreActive(false); 
    351                                  
    352                                 if( (arbeiter != oldbase.getArbeiter()) || (arbeiter != oldbase.getBewohner()) ) {       
    353                                         this.log("Schreibe neue Werte [hungersnot]..."); 
    354                                          
    355                                         db.tUpdate(1,"UPDATE bases " , 
    356                                                 "SET arbeiter=",arbeiter,"," , 
    357                                                         "bewohner=",arbeiter,"," , 
    358                                                         "active='",Common.implode("|",bebon),"'," , 
    359                                                         "coreactive='",base.isCoreActive() ? 1 : 0,"' " , 
    360                                                 "WHERE id='",base.getID(),"' AND " , 
    361                                                         "arbeiter='",basedata.getArbeiter(),"' AND " , 
    362                                                         "bewohner='",basedata.getBewohner(),"' AND " , 
    363                                                         "active='",Common.implode("|", oldbase.getActive()),"' AND " , 
    364                                                         "coreactive='",oldbase.isCoreActive() ? 1 : 0,"'"); 
    365                                 } 
    366                         } 
    367                          
    368                         if( !db.tCommit() ) { 
    369                                 this.log("\t++++++++++++++ COMMIT ERROR - RETRYING ++++++++++++++"); 
    370                                 this.usercargo.setResource(Resources.NAHRUNG, usercargostart); 
    371                                 this.gtustatslist = oldgtustatslist; 
    372                                 this.pmcache = oldpmcache; 
    373                                  
    374                                 this.retries--; 
    375                                 if( this.retries > 0 ) { 
    376                                         base = new Base(db.first("SELECT * FROM bases WHERE id=",oldbase.getID())); 
    377                                                                                   
    378                                         tickBase( base ); 
    379                                         return;  
    380                                 } 
    381                                 this.log("\t+++++++++++++++ GEBE AUF +++++++++++++++");  
    382                         } 
    383                 } 
     319                                base.setArbeiter(arbeiter); 
     320                                base.setBewohner(arbeiter); 
     321                                base.setActive(bebon); 
     322                                base.setCoreActive(false); 
     323                        } 
     324                } 
     325                getDB().saveOrUpdate(base); 
    384326                this.log(""); 
    385327        } 
     
    390332                 
    391333                // Da wir als erstes mit dem Usercargo rumspielen -> sichern der alten Nahrungswerte 
    392                 SQLQuery auser = db.query("SELECT id,cargo FROM users WHERE id!=0 AND (vaccount=0 OR wait4vac!=0)"); 
    393                 while( auser.next() ) { 
    394                         Cargo cargo = new Cargo( Cargo.Type.STRING, auser.getString("cargo") ); 
    395                          
    396                         db.update("UPDATE users SET nstat='",cargo.getResourceCount(Resources.NAHRUNG),"' WHERE id='",auser.getInt("id"),"'"); 
    397                 } 
    398                 auser.free(); 
     334                List users = getDB().createQuery("from User where id!=0 and (vaccount=0 or wait4vac!=0)").list(); 
     335                for( Iterator iter = users.iterator(); iter.hasNext(); ) { 
     336                        User auser = (User)iter.next(); 
     337                         
     338                        auser.setNahrungsStat(Long.toString(new Cargo(Cargo.Type.STRING, auser.getCargo()).getResourceCount(Resources.NAHRUNG))); 
     339                } 
    399340                 
    400341                // User-Accs sperren 
    401342                block(0); 
    402                  
    403                 PreparedQuery updateUserCargo = db.prepare("UPDATE users SET cargo= ? WHERE id= ?"); 
    404                 updateBaseQuery = db.prepare("UPDATE bases " , 
    405                                 "SET arbeiter= ? ," , 
    406                                         "bewohner= ? ," , 
    407                                         "e= ? ," , 
    408                                         "cargo= ?  " , 
    409                                 "WHERE id= ? AND " , 
    410                                         "arbeiter= ? AND " , 
    411                                         "bewohner= ? AND " , 
    412                                         "e= ? AND " , 
    413                                         "cargo= ? "); 
    414                  
     343                                 
    415344                // Nun holen wir uns mal die Basen... 
    416                 SQLQuery base = db.query("SELECT b.* " + 
    417                                 "FROM bases b JOIN users u ON b.owner=u.id " + 
    418                                 "WHERE b.owner!=0 AND (u.vaccount=0 OR u.wait4vac!=0) " + 
    419                                 "ORDER BY b.owner"); 
    420                  
    421                 log("Kolonien: "+base.numRows()); 
     345                List bases = getDB().createQuery("from Base b join fetch b.owner where b.owner!=0 and (b.owner.vaccount=0 or b.owner.wait4vac!=0) order by b.owner").list(); 
     346                         
     347                log("Kolonien: "+bases.size()); 
    422348                log(""); 
    423349                 
    424                 while( base.next() ) { 
     350                int index = 0; 
     351                 
     352                for( Iterator iter = bases.iterator(); iter.hasNext(); ) { 
     353                        Base base = (Base)iter.next(); 
    425354                        // Muessen ggf noch alte Userdaten geschrieben und neue geladen werden? 
    426                         if( base.getInt("owner") != this.lastowner ) { 
    427                                 log(base.getInt("owner")+":"); 
     355                        if( base.getOwner().getID() != this.lastowner ) { 
     356                                log(base.getOwner().getID()+":"); 
    428357                                if( this.pmcache.length() != 0 ) { 
    429358                                        PM.send(getContext(),-1, this.lastowner, "Basis-Tick", this.pmcache.toString(),false); 
    430359                                        this.pmcache.setLength(0); 
    431360                                } 
     361                                                                 
     362                                this.usercargo = new Cargo( Cargo.Type.STRING, base.getOwner().getCargo()); 
     363                        } 
     364                        this.lastowner = base.getOwner().getID(); 
     365                        try {                            
     366                                // Nun wollen wir die Basis mal berechnen.... 
     367                                this.tickBase(base); 
     368                                getDB().flush(); 
     369                                getDB().getTransaction().commit(); 
     370                        } 
     371                        catch( Exception e ) { 
     372                                getDB().getTransaction().rollback(); 
     373                                this.log("Base "+base.getID()+" failed: "+e); 
     374                                e.printStackTrace(); 
     375                                Common.mailThrowable(e, "BaseTick Exception", "Base: "+base.getID()); 
    432376                                 
    433                                 if( this.usercargo != null ) { 
    434                                         updateUserCargo.update(this.usercargo.save(), this.lastowner); 
    435                                 } 
    436                                  
    437                                 this.usercargo = new Cargo( Cargo.Type.STRING, db.first("SELECT cargo FROM users WHERE id='",base.getInt("owner"),"'").getString("cargo")); 
    438                         } 
    439                         this.lastowner = base.getInt("owner"); 
    440                  
    441                         this.retries = 5; // Max 5 versuche. Wenn die Basis dann noch immer nicht korrekt berechnet wurde: aufgeben 
    442  
    443                         try { 
    444                                 // Nun wollen wir die Basis mal berechnen.... 
    445                                 this.tickBase(new Base(base.getRow())); 
    446                         } 
    447                         catch( Exception e ) { 
    448                                 this.log("Base "+base.getInt("id")+" failed: "+e); 
    449                                 e.printStackTrace(); 
    450                                 Common.mailThrowable(e, "BaseTick Exception", "Base: "+base.getInt("id")); 
    451