DatabaseManager.java 2.61 KB
Newer Older
Melledy's avatar
Melledy committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package emu.grasscutter.database;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCommandException;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;

import dev.morphia.Datastore;
import dev.morphia.Morphia;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.game.Account;
import emu.grasscutter.game.GenshinPlayer;
import emu.grasscutter.game.avatar.GenshinAvatar;
import emu.grasscutter.game.friends.Friendship;
import emu.grasscutter.game.inventory.GenshinItem;

KingRainbow44's avatar
KingRainbow44 committed
18
public final class DatabaseManager {
Melledy's avatar
Melledy committed
19
20
21
	private static MongoClient mongoClient;
	private static Datastore datastore;
	
KingRainbow44's avatar
KingRainbow44 committed
22
	private static final Class<?>[] mappedClasses = new Class<?>[] {
Melledy's avatar
Melledy committed
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
		DatabaseCounter.class, Account.class, GenshinPlayer.class, GenshinAvatar.class, GenshinItem.class, Friendship.class
	};
    
    public static MongoClient getMongoClient() {
        return mongoClient;
    }
    
    public static Datastore getDatastore() {
    	return datastore;
    }
    
    public static MongoDatabase getDatabase() {
    	return getDatastore().getDatabase();
    }
	
	public static void initialize() {
		// Initialize
		mongoClient = new MongoClient(new MongoClientURI(Grasscutter.getConfig().DatabaseUrl));
KingRainbow44's avatar
KingRainbow44 committed
41
		Morphia morphia = new Morphia();
Melledy's avatar
Melledy committed
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
		
		// TODO Update when migrating to Morphia 2.0
		morphia.getMapper().getOptions().setStoreEmpties(true);
		morphia.getMapper().getOptions().setStoreNulls(false);
		morphia.getMapper().getOptions().setDisableEmbeddedIndexes(true);
		
		// Map
		morphia.map(mappedClasses);
		
		// Build datastore
		datastore = morphia.createDatastore(mongoClient, Grasscutter.getConfig().DatabaseCollection);
		
		// Ensure indexes
		try {
			datastore.ensureIndexes();
		} catch (MongoCommandException e) {
			Grasscutter.getLogger().info("Mongo index error: ", e);
			// Duplicate index error
			if (e.getCode() == 85) {
				// Drop all indexes and re add them
				MongoIterable<String> collections = datastore.getDatabase().listCollectionNames();
				for (String name : collections) {
					datastore.getDatabase().getCollection(name).dropIndexes();
				}
				// Add back indexes
				datastore.ensureIndexes();
			}
		}
	}
	
	public static synchronized int getNextId(Class<?> c) {
		DatabaseCounter counter = getDatastore().createQuery(DatabaseCounter.class).field("_id").equal(c.getSimpleName()).find().tryNext();
		if (counter == null) {
			counter = new DatabaseCounter(c.getSimpleName());
		}
		try {
			return counter.getNextId();
		} finally {
			getDatastore().save(counter);
		}
	}
	
	public static synchronized int getNextId(Object o) {
		return getNextId(o.getClass());
	}
}