OSDN Git Service

Entityをジェネリクスにし、それに伴いCoreData関連もジェネリクスにした
[kcd/KCD.git] / KCD / ServerDataStore.swift
1 //
2 //  ServerDataStore.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/07.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 extension CoreDataIntormation {
12     static let kcd = CoreDataIntormation(
13         modelName: "KCD",
14         storeFileName: "KCD.storedata",
15         storeOptions:[NSMigratePersistentStoresAutomaticallyOption: true,
16                       NSInferMappingModelAutomaticallyOption: true],
17         storeType: NSSQLiteStoreType,
18         deleteAndRetry: true
19     )
20 }
21 extension CoreDataCore {
22     static let kcd = CoreDataCore(.kcd)
23 }
24
25
26 class ServerDataStore: CoreDataAccessor, CoreDataManager {
27     static var `default` = ServerDataStore(type: .reader)
28     class func oneTimeEditor() -> ServerDataStore {
29         return ServerDataStore(type: .editor)
30     }
31         
32     required init(type: CoreDataManagerType) {
33         managedObjectContext =
34             type == .reader ? core.parentManagedObjectContext
35             : core.editorManagedObjectContext()
36     }
37     deinit {
38         saveActionCore()
39     }
40     
41     let core = CoreDataCore.kcd
42     var managedObjectContext: NSManagedObjectContext
43 }
44
45 extension KCAirBase: EntityProvider {
46     override class var entityName: String { return "AirBase" }
47 }
48 extension KCAirBasePlaneInfo: EntityProvider {
49     override class var entityName: String { return "AirBasePlaneInfo" }
50 }
51 extension KCBasic: EntityProvider {
52     override class var entityName: String { return "Basic" }
53 }
54 extension KCDeck: EntityProvider {
55     override class var entityName: String { return "Deck" }
56 }
57 extension KCKenzoDock: EntityProvider {
58     override class var entityName: String { return "KenzoDock" }
59 }
60 extension MasterFurniture: EntityProvider {
61     override class var entityName: String { return "MasterFurniture" }
62 }
63 extension KCMasterMapArea: EntityProvider {
64     override class var entityName: String { return "MasterMapArea" }
65 }
66 extension KCMasterMapInfo: EntityProvider {
67     override class var entityName: String { return "MasterMapInfo" }
68 }
69 extension KCMasterMission: EntityProvider {
70     override class var entityName: String { return "MasterMission" }
71 }
72 extension KCMasterShipObject: EntityProvider {
73     override class var entityName: String { return "MasterShip" }
74 }
75 extension KCMasterSlotItemObject: EntityProvider {
76     override class var entityName: String { return "MasterSlotItem" }
77 }
78 extension KCMasterSType: EntityProvider {
79     override class var entityName: String { return "MasterSType" }
80 }
81 extension KCMasterSlotItemEquipTypeObject: EntityProvider {
82     override class var entityName: String { return "MasterSlotItemEquipType" }
83 }
84 extension MasterUseItem: EntityProvider {
85     override class var entityName: String { return "MasterUseItem" }
86 }
87 extension KCMaterial: EntityProvider {
88     override class var entityName: String { return "Material" }
89 }
90 extension KCNyukyoDock: EntityProvider {
91     override class var entityName: String { return "NyukyoDock" }
92 }
93 extension KCShipObject: EntityProvider {
94     override class var entityName: String { return "Ship" }
95 }
96 extension KCSlotItemObject: EntityProvider {
97     override class var entityName: String { return "SlotItem" }
98 }
99 extension KCQuest: EntityProvider {
100     override class var entityName: String { return "Quest" }
101 }
102
103 extension ServerDataStore {
104     func airBases() -> [KCAirBase] {
105         guard let airbase = try? objects(with: KCAirBase.entity)
106             else { return [] }
107         return airbase
108     }
109     func airBase(area: Int, base: Int) -> KCAirBase? {
110         let p = NSPredicate(format: "area_id == %ld AND rid == %ld", area, base)
111         guard let airBases = try? objects(with: KCAirBase.entity, predicate: p)
112             else { return nil }
113         return airBases.first
114     }
115     func createAirBasePlaneInfo() -> KCAirBasePlaneInfo? {
116         return insertNewObject(for: KCAirBasePlaneInfo.entity)
117     }
118     
119     func basic() -> KCBasic? {
120         guard let basics = try? objects(with: KCBasic.entity)
121             else { return nil }
122         return basics.first
123     }
124     func createBasic() -> KCBasic? {
125         return insertNewObject(for: KCBasic.entity)
126     }
127     
128     func decksSortedById() -> [KCDeck] {
129         let sortDec = NSSortDescriptor(key: "id", ascending: true)
130         guard let decks = try? objects(with: KCDeck.entity, sortDescriptors: [sortDec])
131             else { return [] }
132         return decks
133     }
134     func deck(byId id: Int) -> KCDeck? {
135         let p = NSPredicate(format: "id = %ld", id)
136         guard let decks = try? objects(with: KCDeck.entity, predicate: p)
137             else { return nil }
138         return decks.first
139     }
140     
141     func kenzoDock(byDockId dockId: Int) -> KCKenzoDock? {
142         let dockPredicate = NSPredicate(format: "id = %ld", dockId)
143         guard let kenzoDocks = try? objects(with: KCKenzoDock.entity, predicate: dockPredicate)
144             else { return nil }
145         return kenzoDocks.first
146     }
147     
148     func mapArea(byId id: Int) -> KCMasterMapArea? {
149         let predicate = NSPredicate(format: "id = %ld", id)
150         guard let mapAreas = try? objects(with: KCMasterMapArea.entity, predicate: predicate)
151             else { return nil }
152         return mapAreas.first
153     }
154     
155     func mapInfo(area: Int, no: Int) -> KCMasterMapInfo? {
156         let predicate = NSPredicate(format: "maparea_id = %ld AND %K = %ld", area, "no", no)
157         guard let mapInfos = try? objects(with: KCMasterMapInfo.entity, predicate: predicate)
158             else { return nil }
159         return mapInfos.first
160     }
161     
162     func masterMission(by id: Int) -> KCMasterMission? {
163         let p = NSPredicate(format: "id = %ld", id)
164         guard let missions = try? objects(with: KCMasterMission.entity, predicate: p)
165             else { return nil }
166         return missions.first
167     }
168     
169     func masterShips() -> [KCMasterShipObject] {
170         guard let ships = try? objects(with: KCMasterShipObject.entity)
171             else { return [] }
172         return ships
173     }
174     func sortedMasterShipsById() -> [KCMasterShipObject] {
175         let sortDesc = NSSortDescriptor(key: "id", ascending: true)
176         guard let ships = try? objects(with: KCMasterShipObject.entity, sortDescriptors: [sortDesc])
177             else { return [] }
178         return ships
179     }
180     func masterShip(byId id: Int) -> KCMasterShipObject? {
181         let p = NSPredicate(format: "id = %ld", id)
182         guard let ships = try? objects(with: KCMasterShipObject.entity, predicate: p)
183             else { return nil }
184         return ships.first
185     }
186     
187     func sortedMasterSlotItemsById() -> [KCMasterSlotItemObject] {
188         let sortDesc = NSSortDescriptor(key: "id", ascending: true)
189         guard let masterSlotItems = try? objects(with: KCMasterSlotItemObject.entity, sortDescriptors: [sortDesc])
190             else { return [] }
191         return masterSlotItems
192     }
193     func masterSlotItems() -> [KCMasterSlotItemObject] {
194         guard let masterSlotItems = try? objects(with: KCMasterSlotItemObject.entity)
195             else { return [] }
196         return masterSlotItems
197     }
198     func masterSlotItem(by id: Int) -> KCMasterSlotItemObject? {
199         let p = NSPredicate(format: "id = %ld", id)
200         guard let masterSlotItems = try? objects(with: KCMasterSlotItemObject.entity, predicate: p)
201             else { return nil }
202         return masterSlotItems.first
203     }
204     
205     func masterSlotItemEquipType(by id: Int) -> KCMasterSlotItemEquipTypeObject? {
206         let predicate = NSPredicate(format: "id = %ld", id)
207         guard let types = try? objects(with: KCMasterSlotItemEquipTypeObject.entity, predicate: predicate)
208             else { return nil }
209         return types.first
210     }
211     
212     func masterSTypes() -> [KCMasterSType] {
213         guard let masterSTypes = try? objects(with: KCMasterSType.entity)
214             else { return [] }
215         return masterSTypes
216     }
217     func sortedMasterSTypesById() -> [KCMasterSType] {
218         let sortDesc = NSSortDescriptor(key: "id", ascending: true)
219         guard let masterSTypes = try? objects(with: KCMasterSType.entity, sortDescriptors: [sortDesc])
220             else { return [] }
221         return masterSTypes
222     }
223     
224     func material() -> KCMaterial? {
225         guard let materials = try? objects(with: KCMaterial.entity)
226             else { return nil }
227         return materials.first
228     }
229     func createMaterial() -> KCMaterial? {
230         return insertNewObject(for: KCMaterial.entity)
231     }
232     
233     func nyukyoDock(by id: Int) -> KCNyukyoDock? {
234         let p = NSPredicate(format: "id = %ld", id)
235         guard let ndocks = try? objects(with: KCNyukyoDock.entity, predicate: p)
236             else { return nil }
237         return ndocks.first
238     }
239     
240     func ships(byDeckId deckId: Int) -> [KCShipObject] {
241         let predicate = NSPredicate(format: "id = %d", deckId)
242         guard let decks = try? objects(with: KCDeck.entity, predicate: predicate),
243             let deck = decks.first
244             else { return [] }
245         return (0..<6).flatMap { deck[$0] }
246     }
247     func ship(byId shipId: Int) -> KCShipObject? {
248         if shipId < 1 { return nil }
249         let predicate = NSPredicate(format: "id = %d", shipId)
250         guard let ships = try? objects(with: KCShipObject.entity, predicate: predicate)
251             else { return nil }
252         return ships.first
253     }
254     func ships(byId shipId: Int) -> [KCShipObject] {
255         let predicate = NSPredicate(format: "id = %d", shipId)
256         guard let ships = try? objects(with: KCShipObject.entity, predicate: predicate)
257             else { return [] }
258         return ships
259     }
260     func ships(exclude shipIds: [Int]) -> [KCShipObject] {
261         let predicate = NSPredicate(format: "NOT id IN %@", shipIds)
262         guard let ships = try? objects(with: KCShipObject.entity, predicate: predicate)
263             else { return [] }
264         return ships
265     }
266     func shipsInFleet() -> [KCShipObject] {
267         let predicate = NSPredicate(format: "NOT fleet = 0")
268         guard let ships = try? objects(with: KCShipObject.entity, predicate: predicate)
269             else { return [] }
270         return ships
271     }
272     func createShip() -> KCShipObject? {
273         return insertNewObject(for: KCShipObject.entity)
274     }
275     
276     func masterSlotItemID(bySlotItemId slotItemId: Int) -> Int {
277         if slotItemId < 1 { return 0 }
278         let predicate = NSPredicate(format: "id = %d", argumentArray: [slotItemId])
279         guard let slotItems = try? objects(with: KCSlotItemObject.entity, predicate: predicate),
280             let slotItem = slotItems.first
281             else { return 0 }
282         return slotItem.master_slotItem.id
283     }
284     
285     func slotItem(byId itemId: Int) -> KCSlotItemObject? {
286         let p = NSPredicate(format: "id = %ld", itemId)
287         guard let slotItems = try? objects(with: KCSlotItemObject.entity, predicate: p)
288             else { return nil }
289         return slotItems.first
290     }
291     func sortedSlotItemsById() -> [KCSlotItemObject] {
292         let sortDesc = NSSortDescriptor(key: "id", ascending: true)
293         guard let slotItems = try? objects(with: KCSlotItemObject.entity, sortDescriptors: [sortDesc])
294             else { return [] }
295         return slotItems
296     }
297     func slotItems() -> [KCSlotItemObject] {
298         guard let slotItems = try? objects(with: KCSlotItemObject.entity)
299             else { return [] }
300         return slotItems
301     }
302     func slotItems(in itemIds: [Int]) -> [KCSlotItemObject] {
303         let predicate = NSPredicate(format: "id IN %@", itemIds)
304         guard let slotItems = try? objects(with: KCSlotItemObject.entity, predicate: predicate)
305             else { return [] }
306         return slotItems
307     }
308     func slotItems(exclude itemIds: [Int]) -> [KCSlotItemObject] {
309         let predicate = NSPredicate(format: "NOT id IN %@", itemIds)
310         guard let slotItems = try? objects(with: KCSlotItemObject.entity, predicate: predicate)
311             else { return [] }
312         return slotItems
313     }
314     func createSlotItem() -> KCSlotItemObject? {
315         return insertNewObject(for: KCSlotItemObject.entity)
316     }
317     
318     func quests() -> [KCQuest] {
319         guard let quests = try? objects(with: KCQuest.entity)
320             else { return [] }
321         return quests
322     }
323     func quest(by no: Int) -> KCQuest? {
324         let p = NSPredicate(format: "%K = %ld", "no", no)
325         guard let quests = try? objects(with: KCQuest.entity, predicate: p)
326             else { return nil }
327         return quests.first
328     }
329     func quests(in range: CountableClosedRange<Int>) -> [KCQuest] {
330         let p = NSPredicate(format: "%K In %@", "no", range.map {$0})
331         guard let quests = try? objects(with: KCQuest.entity, predicate: p)
332             else { return [] }
333         return quests
334     }
335     func sortedQuestByNo() -> [KCQuest] {
336         let sortDesc = NSSortDescriptor(key: "no", ascending: true)
337         guard let quests = try? objects(with: KCQuest.entity, sortDescriptors: [sortDesc])
338             else { return [] }
339         return quests
340     }
341     func createQuest() -> KCQuest? {
342         return insertNewObject(for: KCQuest.entity)
343     }
344 }