DbMotion 0.0.6 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,3 +8,4 @@ Motion::Project::App.setup do |app|
8
8
  app.files = Dir.glob(File.join(File.dirname(__FILE__), 'DbMotion/**/*.rb')) | app.files
9
9
  app.frameworks += ['CoreData']
10
10
  end
11
+
@@ -1,90 +1,179 @@
1
1
  module DbMotion
2
- class Database
2
+ class Database
3
3
 
4
- def self.run
5
- @@db
6
- end
4
+ def self.shared
5
+ @@db
6
+ end
7
7
 
8
- def create_entry(_name)
9
- NSEntityDescription.insertNewObjectForEntityForName(_name, inManagedObjectContext:@context)
10
- end
8
+ def self.setSharedSession(_db)
9
+ @@db=_db
10
+ end
11
11
 
12
- # Example: _sort=[NSSortDescriptor.alloc.initWithKey('name', ascending:true)]
13
- def find_entry(_name, _sort=[])
14
- request = NSFetchRequest.alloc.init
15
- request.entity = NSEntityDescription.entityForName(_name, inManagedObjectContext:@context)
16
- request.sortDescriptors = _sort
17
- error_ptr = Pointer.new(:object)
18
- @context.executeFetchRequest(request, error:error_ptr)
19
- end
12
+ def create_entry(_name)
13
+ NSEntityDescription.insertNewObjectForEntityForName(_name, inManagedObjectContext:@context)
14
+ end
15
+
16
+ def get_obj_id_from_url(_url)
17
+ @context.persistentStoreCoordinator.managedObjectIDForURIRepresentation(url)
18
+ end
19
+
20
+ def get_url_from_obj_id(_obj_id)
21
+ _obj_id.URIRepresentation
22
+ end
23
+
24
+ def find_by_obj_id(_obj_id)
25
+ error_ptr = Pointer.new(:object)
26
+ @context.existingObjectWithID(_obj_id, error:error_ptr)
27
+ end
28
+
29
+ # Example: _sort=[NSSortDescriptor.alloc.initWithKey('name', ascending:true)]
30
+ def find_entry(_name, _sort=[])
31
+ request = NSFetchRequest.alloc.init
32
+ request.entity = NSEntityDescription.entityForName(_name, inManagedObjectContext:@context)
33
+ request.sortDescriptors = _sort
34
+ error_ptr = Pointer.new(:object)
35
+ @context.executeFetchRequest(request, error:error_ptr)
36
+ end
20
37
 
21
- def delete_entry(_obj)
22
- @context.deleteObject(_obj)
23
- end
38
+ def delete_entry(_obj)
39
+ @context.deleteObject(_obj)
40
+ end
24
41
 
25
- def save
26
- error_ptr = Pointer.new(:object)
27
- @context.save(error_ptr)
28
- end
42
+ def save
43
+ error_ptr = Pointer.new(:object)
44
+ @context.save(error_ptr)
45
+ end
29
46
 
30
- def open(_mom_file, _db_file)
31
- @mom_file=_mom_file % "cur"
32
- @mom_url = NSURL.fileURLWithPath("#{NSBundle.mainBundle.resourcePath}/#{@mom_file}")
33
- @model=NSManagedObjectModel.alloc.initWithContentsOfURL(@mom_url)
34
- @store = NSPersistentStoreCoordinator.alloc.initWithManagedObjectModel(@model)
35
- @store_file = File.join(NSHomeDirectory(), 'Documents', _db_file)
36
- @store_url = NSURL.fileURLWithPath(@store_file)
37
- unless compatible?
38
- migrate(_mom_file)
39
- end
40
- @context = NSManagedObjectContext.alloc.init
41
- @context.persistentStoreCoordinator = @store
42
- error_ptr = Pointer.new(:object)
43
- unless @store.addPersistentStoreWithType(NSSQLiteStoreType, configuration:nil, URL:@store_url, options:nil, error:error_ptr)
44
- raise "Can't add persistent SQLite store: #{error_ptr[0].description}"
45
- end
46
- @@db=self
47
- self
48
- end
47
+ def open(_db_file, withModel: _model)
48
+ @model=_model.versions.last
49
+ @store = NSPersistentStoreCoordinator.alloc.initWithManagedObjectModel(@model)
50
+ @store_file = File.join(NSHomeDirectory(), 'Documents', _db_file)
51
+ @store_url = NSURL.fileURLWithPath(@store_file)
52
+ unless compatible?
53
+ migrate(_model.versions)
54
+ end
55
+ @context = NSManagedObjectContext.alloc.init
56
+ @context.persistentStoreCoordinator = @store
57
+ error_ptr = Pointer.new(:object)
58
+ unless @store.addPersistentStoreWithType(NSSQLiteStoreType, configuration:nil, URL:@store_url, options:nil, error:error_ptr)
59
+ raise "Can't add persistent SQLite store: #{error_ptr[0].description}"
60
+ end
61
+ self
62
+ end
49
63
 
50
- def compatible?
51
- error_ptr = Pointer.new(:object)
52
- metadata=NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType, URL:@store_url, error:error_ptr)
53
- compatible=true
54
- if metadata
55
- compatible=@model.isConfiguration(nil, compatibleWithStoreMetadata:metadata)
64
+ def open(_db_file, withMOMFile: _mom_file)
65
+ @mom_file=_mom_file % "cur"
66
+ @mom_url = NSURL.fileURLWithPath("#{NSBundle.mainBundle.resourcePath}/#{@mom_file}")
67
+ @model=NSManagedObjectModel.alloc.initWithContentsOfURL(@mom_url)
68
+ @store = NSPersistentStoreCoordinator.alloc.initWithManagedObjectModel(@model)
69
+ @store_file = File.join(NSHomeDirectory(), 'Documents', _db_file)
70
+ @store_url = NSURL.fileURLWithPath(@store_file)
71
+ unless compatible?
72
+ migrate_mom(_mom_file)
73
+ end
74
+ @context = NSManagedObjectContext.alloc.init
75
+ @context.persistentStoreCoordinator = @store
76
+ error_ptr = Pointer.new(:object)
77
+ unless @store.addPersistentStoreWithType(NSSQLiteStoreType, configuration:nil, URL:@store_url, options:nil, error:error_ptr)
78
+ raise "Can't add persistent SQLite store: #{error_ptr[0].description}"
79
+ end
80
+ self
56
81
  end
57
- compatible
58
- end
59
82
 
60
- def migrate(_old_mom_files)
61
- old_mom_files=_old_mom_files % '%03d'
62
- error_ptr = Pointer.new(:object)
63
- metadata=NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType, URL:@store_url, error:error_ptr)
64
- return false unless metadata
65
- 0.upto(999) do |version|
66
- old_mom_file=old_mom_files % version
67
- p old_mom_file
68
- old_mom_url = NSURL.fileURLWithPath("#{NSBundle.mainBundle.resourcePath}/#{old_mom_file}")
69
- p old_mom_url
70
- old_model=NSManagedObjectModel.alloc.initWithContentsOfURL(old_mom_url)
71
- compatible=old_model.isConfiguration(nil, compatibleWithStoreMetadata:metadata)
72
- next unless compatible
73
- p "Found version #{version}"
74
- migmgr=NSMigrationManager.alloc.initWithSourceModel(old_model, destinationModel:@model)
75
- mapping_model = NSMappingModel.inferredMappingModelForSourceModel(old_model, destinationModel:@model, error:error_ptr)
83
+ def compatible?
84
+ error_ptr = Pointer.new(:object)
85
+ metadata=NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType, URL:@store_url, error:error_ptr)
86
+ compatible=true
87
+ if metadata
88
+ compatible=@model.isConfiguration(nil, compatibleWithStoreMetadata:metadata)
89
+ end
90
+ compatible
91
+ end
92
+
93
+ def migrate_mom_model(_old_mom_url, _new_mom_url)
94
+ error_ptr = Pointer.new(:object)
95
+ new_model=NSManagedObjectModel.alloc.initWithContentsOfURL(_new_mom_url)
96
+ old_model=NSManagedObjectModel.alloc.initWithContentsOfURL(_old_mom_url)
97
+ migmgr=NSMigrationManager.alloc.initWithSourceModel(old_model, destinationModel:new_model)
98
+ mapping_model = NSMappingModel.inferredMappingModelForSourceModel(old_model, destinationModel:new_model, error:error_ptr)
76
99
  new_store_url = NSURL.fileURLWithPath(@store_url.path+".new")
77
- p migmgr.migrateStoreFromURL(@store_url, type:NSSQLiteStoreType, options:nil,
100
+ ret=migmgr.migrateStoreFromURL(@store_url, type:NSSQLiteStoreType, options:nil,
78
101
  withMappingModel:mapping_model, toDestinationURL:new_store_url,
79
102
  destinationType:NSSQLiteStoreType, destinationOptions:nil,
80
103
  error:error_ptr)
104
+ NSLog "Migration result #{ret}."
81
105
  NSFileManager.defaultManager.removeItemAtPath(@store_url.path, error:error_ptr)
82
- #-TODO: evtl. move statt loeschen
83
106
  NSFileManager.defaultManager.moveItemAtPath(new_store_url.path, toPath:@store_url.path, error:error_ptr)
84
- break
85
107
  end
86
- end
87
108
 
88
- end
109
+ def migrate_mom(_old_mom_files)
110
+ old_mom_files=_old_mom_files % '%03d'
111
+ error_ptr = Pointer.new(:object)
112
+ metadata=NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType, URL:@store_url, error:error_ptr)
113
+ return false unless metadata
114
+ db_version=-1
115
+ 0.upto(999) do |version|
116
+ old_mom_file=old_mom_files % version
117
+ NSLog [:migrate, "old mom file", old_mom_file].inspect
118
+ old_mom_url = NSURL.fileURLWithPath("#{NSBundle.mainBundle.resourcePath}/#{old_mom_file}")
119
+ NSLog [:migrate, "old mom url", old_mom_url].inspect
120
+ old_model=NSManagedObjectModel.alloc.initWithContentsOfURL(old_mom_url)
121
+ compatible=old_model.isConfiguration(nil, compatibleWithStoreMetadata:metadata)
122
+ next unless compatible
123
+ db_version=version
124
+ NSLog "Found version #{version}"
125
+ break
126
+ end
127
+ db_version.upto(999) do |version|
128
+ old_mom_file=old_mom_files % version
129
+ old_mom_url = NSURL.fileURLWithPath("#{NSBundle.mainBundle.resourcePath}/#{old_mom_file}")
130
+ new_mom_file=old_mom_files % (version+1)
131
+ new_mom_file="#{NSBundle.mainBundle.resourcePath}/#{new_mom_file}"
132
+ last=false
133
+ unless NSFileManager.defaultManager.fileExistsAtPath(new_mom_file)
134
+ new_mom_file=_old_mom_files % "cur"
135
+ new_mom_file="#{NSBundle.mainBundle.resourcePath}/#{new_mom_file}"
136
+ last=true
137
+ end
138
+ NSLog [:migrate_from_to, old_mom_file, new_mom_file].inspect
139
+ migrate_mom_model(old_mom_url, NSURL.fileURLWithPath(new_mom_file))
140
+ break if last
141
+ end
142
+ end
143
+
144
+ def migrate_model(_old_model, _new_model)
145
+ error_ptr = Pointer.new(:object)
146
+ migmgr=NSMigrationManager.alloc.initWithSourceModel(_old_model, destinationModel:_new_model)
147
+ mapping_model = NSMappingModel.inferredMappingModelForSourceModel(_old_model, destinationModel:_new_model, error:error_ptr)
148
+ new_store_url = NSURL.fileURLWithPath(@store_url.path+".new")
149
+ ret=migmgr.migrateStoreFromURL(@store_url, type:NSSQLiteStoreType, options:nil,
150
+ withMappingModel:mapping_model, toDestinationURL:new_store_url,
151
+ destinationType:NSSQLiteStoreType, destinationOptions:nil,
152
+ error:error_ptr)
153
+ NSLog "Migration result #{ret}."
154
+ NSFileManager.defaultManager.removeItemAtPath(@store_url.path, error:error_ptr)
155
+ NSFileManager.defaultManager.moveItemAtPath(new_store_url.path, toPath:@store_url.path, error:error_ptr)
156
+ end
157
+
158
+ def migrate(_models)
159
+ error_ptr = Pointer.new(:object)
160
+ metadata=NSPersistentStoreCoordinator.metadataForPersistentStoreOfType(NSSQLiteStoreType, URL:@store_url, error:error_ptr)
161
+ return false unless metadata
162
+ found=false
163
+ old_model=nil
164
+ _models.each do |model|
165
+ unless found
166
+ found=model.isConfiguration(nil, compatibleWithStoreMetadata:metadata)
167
+ if found
168
+ old_model=model
169
+ NSLog "Found version #{model}"
170
+ end
171
+ else
172
+ migrate_model(old_mode, model)
173
+ end
174
+ end
175
+ end
176
+
177
+ end
89
178
  end
90
179
 
@@ -0,0 +1,128 @@
1
+ module DbMotion
2
+ class Model
3
+
4
+ def self.get_version(_version)
5
+ @@models["#{sprintf "%03d", _version}"]
6
+ end
7
+
8
+ def self.versions
9
+ @@models.keys.sort.map do |v|
10
+ @@models[v]
11
+ end
12
+ end
13
+
14
+ def self.version(_version, &block)
15
+ @@models||={}
16
+ e = Entities.new(&block)
17
+ model = NSManagedObjectModel.alloc.init
18
+ model.entities=e.entities.values
19
+ @@models["#{sprintf "%03d", _version}"]=model
20
+ end
21
+
22
+ end
23
+
24
+ class Entities
25
+ attr_reader :entities
26
+
27
+ def initialize(&block)
28
+ @entities = {}
29
+ block.call(self)
30
+ end
31
+
32
+ def entity(_name, &block)
33
+ e = Entity.new(&block)
34
+ entity = NSEntityDescription.alloc.init
35
+ entity.name = _name
36
+ entity.managedObjectClassName = _name
37
+ entity.properties = e.attributes.map do |type, name|
38
+ property = NSAttributeDescription.alloc.init
39
+ property.name = name
40
+ property.attributeType = type
41
+ property.optional = true
42
+ property
43
+ end
44
+ @entities[_name]=entity
45
+ end
46
+
47
+ def relation(_relation)
48
+ # Example "model1 <->> model2"
49
+ relation=_relation.split(/ /)
50
+ if relation.size!=3
51
+ puts "Unknown relation"
52
+ return
53
+ end
54
+ if (relation[1]=~/^<{1,2}\->{1,2}$/).nil?
55
+ puts "Unknown relation type"
56
+ return
57
+ end
58
+ model1_info=relation[0].split(/:/)
59
+ model2_info=relation[2].split(/:/)
60
+ unless @entities.has_key?(model1_info[0]) and @entities.has_key?(model2_info[0])
61
+ puts "Relation partner not found #{relation}"
62
+ return
63
+ end
64
+
65
+ model1 = NSRelationshipDescription.alloc.init
66
+ model2 = NSRelationshipDescription.alloc.init
67
+
68
+ model1.name = model1_info[1]
69
+ model1.destinationEntity = @entities[model2_info[0]]
70
+ model1.inverseRelationship = model2
71
+ model1.deleteRule = NSNullifyDeleteRule
72
+ if relation[1]=~/>>$/
73
+ # ->>
74
+ model1.minCount = 0
75
+ model1.maxCount = -1
76
+ else
77
+ # ->
78
+ model1.minCount = 1
79
+ model1.maxCount = 1
80
+ model1.optional = true
81
+ end
82
+
83
+ model2.name = model2_info[1]
84
+ model2.destinationEntity = @entities[model1_info[0]]
85
+ model2.inverseRelationship = model1
86
+ model2.deleteRule = NSNullifyDeleteRule
87
+ if relation[1]=~/^<</
88
+ # <<-
89
+ model2.minCount = 0
90
+ model2.maxCount = -1
91
+ else
92
+ # <-
93
+ model2.minCount = 1
94
+ model2.maxCount = 1
95
+ model2.optional = true
96
+ end
97
+
98
+ @entities[model1_info[0]].properties=@entities[model1_info[0]].properties+[model1]
99
+ @entities[model2_info[0]].properties=@entities[model2_info[0]].properties+[model2]
100
+ end
101
+
102
+ end
103
+
104
+ class Entity
105
+ attr_reader :attributes
106
+
107
+ MAPPING={
108
+ string: NSStringAttributeType,
109
+ integer: NSInteger16AttributeType,
110
+ double: NSDoubleAttributeType,
111
+ date: NSDateAttributeType,
112
+ bindata: NSBinaryDataAttributeType
113
+ }
114
+
115
+ def initialize(&block)
116
+ @attributes = []
117
+ block.call(self)
118
+ end
119
+
120
+ def method_missing(meth, *args, &block)
121
+ if MAPPING.has_key?(meth.to_sym)
122
+ @attributes << [MAPPING[meth.to_sym], args[0]]
123
+ else
124
+ puts "Key #{meth} not found"
125
+ end
126
+ end
127
+ end
128
+ end
@@ -1,3 +1,3 @@
1
1
  module DbMotion
2
- VERSION = "0.0.6" unless defined?(DbMotion::VERSION)
2
+ VERSION = "0.1.0" unless defined?(DbMotion::VERSION)
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: DbMotion
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-16 00:00:00.000000000 Z
12
+ date: 2013-05-13 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: DbMotion a simple adaption of CoreData.
15
15
  email:
@@ -26,6 +26,7 @@ files:
26
26
  - README.md
27
27
  - lib/DbMotion.rb
28
28
  - lib/DbMotion/database.rb
29
+ - lib/DbMotion/model.rb
29
30
  - lib/DbMotion/version.rb
30
31
  homepage: https://github.com/rheoli/DbMotion
31
32
  licenses: []