doeskeyvalue 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
data/doeskeyvalue.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{doeskeyvalue}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Awexome Labs"]
@@ -13,7 +13,7 @@ module DoesKeyValue
13
13
  raise DoesKeyValue::KeyAndIndexOptionsMustBeHash unless opts.is_a?(Hash)
14
14
 
15
15
  search_key = "#{key_value_column}.#{key_name}"
16
- raise DoesKeyValue::NoKeyForThatIndex if !self.respond_to?(key_name) || !self.respond_to?("#{key_name}=")
16
+ # TODO: raise DoesKeyValue::NoKeyForThatIndex if !self.respond_to?(key_name) || !self.respond_to?("#{key_name}=")
17
17
 
18
18
  class_name = self.name.underscore
19
19
  class_table_name = self.table_name
@@ -61,9 +61,26 @@ module DoesKeyValue
61
61
  define_method("update_index_#{key_value_column}_#{key_name}_after_save") do
62
62
  class_name = self.class.name.underscore
63
63
  class_table_name = self.class.table_name
64
- index_table_name = "key_value_indexes"
64
+ index_table_name = "key_value_index"
65
+
65
66
  # TODO: Restrict value to 255 characters, the table-enforced limit
66
- idx_id = ActiveRecord::Base.connection.insert("INSERT INTO `#{index_table_name}` (`obj_type`,`obj_id`,`key_name`,`value`) VALUES (\""+self.class.to_s+"\","+self.id.to_s+", \""+search_key.to_s+"\", \"#{self.send(key_name).to_s}\")")
67
+
68
+ # TODO: Serialize value in such a nils to be properly represented
69
+ # Sample JSON Serialization: tab.to_json
70
+ # Sample JSON Reconstruction: Tab.new( JSON.parse(tab.to_json)["tab"] )
71
+
72
+ new_value = self.send(key_name)
73
+ up_count = ActiveRecord::Base.connection.update("
74
+ UPDATE `#{index_table_name}` SET `value` = \"#{new_value}\", `updated_at` = NOW()
75
+ WHERE `obj_type`=\"#{self.class}\" AND `obj_id`=#{self.id} AND `key_name`=\"#{search_key}\"
76
+ ")
77
+ if !new_value.nil? && up_count == 0
78
+ idx_id = ActiveRecord::Base.connection.insert(
79
+ "INSERT INTO `#{index_table_name}` (`obj_type`,`obj_id`,`key_name`,`value`,`created_at`,`updated_at`) VALUES (\"#{self.class}\", #{self.id}, \"#{search_key}\", \"#{new_value}\", NOW(), NOW())
80
+ ")
81
+ return idx_id
82
+ end
83
+
67
84
  end
68
85
  after_save "update_index_#{key_value_column}_#{key_name}_after_save"
69
86
 
@@ -71,7 +88,7 @@ module DoesKeyValue
71
88
  define_method("update_index_#{key_value_column}_#{key_name}_after_destroy") do
72
89
  class_name = self.class.name.underscore
73
90
  class_table_name = self.class.table_name
74
- index_table_name = "key_value_indexes"
91
+ index_table_name = "key_value_index"
75
92
  num_del = ActiveRecord::Base.connection.delete("DELETE FROM `#{index_table_name}` WHERE `obj_type` = \"#{self.class}\" AND `obj_id` = #{self.id}")
76
93
  end
77
94
  after_destroy "update_index_#{key_value_column}_#{key_name}_after_destroy"
@@ -10,17 +10,21 @@ module DoesKeyValue
10
10
  raise DoesKeyValue::NoColumnNameSpecified unless key_value_column
11
11
  raise DoesKeyValue::NoKeyNameSpecified unless key_name
12
12
  raise DoesKeyValue::KeyAndIndexOptionsMustBeHash unless opts.is_a?(Hash)
13
-
13
+
14
+ # TODO: Allow :type option to set an enforced data type
15
+ # TODO: Allow :default option to set a default return value
16
+
14
17
  # Define accessors for the key column in the AR class:
15
18
  class_eval <<-EOS
16
19
  def #{key_name}
17
- return (self.send(:#{key_value_column}) || Hash.new)[:#{key_name}]
20
+ all_keys = self.send(:read_attribute, :#{key_value_column}) || Hash.new
21
+ return all_keys[:#{key_name}]
18
22
  end
19
23
 
20
24
  def #{key_name}=(value)
21
- key_set = self.send(:#{key_value_column}) || Hash.new
22
- key_set[:#{key_name}] = value
23
- self.send("#{key_value_column}=", key_set)
25
+ all_keys = self.send(:read_attribute, :#{key_value_column}) || Hash.new
26
+ all_keys[:#{key_name}] = value
27
+ self.send(:write_attribute, :#{key_value_column}, all_keys)
24
28
  end
25
29
  EOS
26
30
 
@@ -30,6 +34,8 @@ module DoesKeyValue
30
34
  end
31
35
 
32
36
  end
37
+
38
+
33
39
 
34
40
  end # Keys
35
41
  end # DoesKeyValue
@@ -6,17 +6,11 @@
6
6
  class CreateKeyValueIndex < ActiveRecord::Migration
7
7
  def self.up
8
8
  create_table :key_value_index do |t|
9
- # The key is a composite of the grouping and key name (e.g., "settings.user_id")
9
+ t.string :obj_type
10
10
  t.string :key_name
11
-
12
- # The stored value is saved as varchar(255), which limits indexability slightly:
13
11
  t.string :value
14
-
15
- # Store details about the target object:
16
- t.string :obj_type
17
12
  t.integer :obj_id
18
13
 
19
- # Track all touches:
20
14
  t.timestamps
21
15
  end
22
16
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: doeskeyvalue
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.1
5
+ version: 0.1.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Awexome Labs
@@ -73,7 +73,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - ">="
75
75
  - !ruby/object:Gem::Version
76
- hash: 136860461958198637
76
+ hash: -1554093929383851164
77
77
  segments:
78
78
  - 0
79
79
  version: "0"