composite_primary_keys 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/Rakefile CHANGED
@@ -88,7 +88,7 @@ end
88
88
 
89
89
  # Create compressed packages
90
90
 
91
- dist_dirs = [ "lib", "test", "examples", "dev-utils" ]
91
+ dist_dirs = [ "lib", "test", "website", "scripts" ]
92
92
 
93
93
  spec = Gem::Specification.new do |s|
94
94
  s.name = PKG_NAME
@@ -135,12 +135,11 @@ module CompositePrimaryKeys
135
135
  raise CompositeKeyError, "Composite keys do not generated ids from sequences, you must provide id values"
136
136
  end
137
137
 
138
- self.id = connection.insert(
138
+ connection.insert(
139
139
  "INSERT INTO #{self.class.table_name} " +
140
140
  "(#{quoted_column_names.join(', ')}) " +
141
141
  "VALUES(#{attributes_with_quotes.values.join(', ')})",
142
- "#{self.class.name} Create",
143
- self.class.primary_key, self.id
142
+ "#{self.class.name} Create"
144
143
  )
145
144
  @new_record = false
146
145
  return true
@@ -148,10 +147,11 @@ module CompositePrimaryKeys
148
147
 
149
148
  # Updates the associated record with values matching those of the instance attributes.
150
149
  def update_without_callbacks
150
+ where_class = [self.class.primary_key, quoted_id].transpose.each {|key,id| "(#{key} = #{id})"}.join(" AND ")
151
151
  connection.update(
152
152
  "UPDATE #{self.class.table_name} " +
153
153
  "SET #{quoted_comma_pair_list(connection, attributes_with_quotes(false))} " +
154
- "WHERE (#{self.class.primary_key}) = (#{quoted_id})",
154
+ "WHERE #{where_class}",
155
155
  "#{self.class.name} Update"
156
156
  )
157
157
  return true
@@ -2,7 +2,7 @@ module CompositePrimaryKeys
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 7
5
- TINY = 0
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # RENAME THIS to rubyorge, and change username/password below to your rubyforge details.
4
+ # Set rubyforge file to Ignore on Subversion.
5
+ # libs
6
+ #
7
+ $VERBOSE = nil
8
+ require "getoptlong"
9
+ require "enumerator"
10
+ require "http-access2"
11
+ #
12
+ # config
13
+ #
14
+ config = {
15
+ "username" => "nicwilliams", # this must be your username
16
+ "password" => "UHUst0ck", # this must be your password
17
+
18
+ "group_id" => 1953, # see source of http://rubyforge.org/frs/admin/qrs.php?package=&group_id=1953
19
+
20
+ "package_ids" => { # configure shortcuts for your packages here
21
+ "compositekeys" => 2327,
22
+ },
23
+
24
+ "uri" => "http://rubyforge.org",
25
+ "cookie_jar" => File::join(File::expand_path("~"), ".rubyforge.cookie_jar"),
26
+ }
27
+
28
+ opts =
29
+ GetoptLong::new(
30
+ [ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
31
+ [ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
32
+ [ "--cookie_jar" , "-c" , GetoptLong::REQUIRED_ARGUMENT ]
33
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
34
+
35
+ username = opts['username'] || config['username']
36
+ password = opts['password'] || config['password']
37
+ cookie_jar = opts["cookie_jar"] || config['cookie_jar']
38
+ #
39
+ # setup
40
+ #
41
+ mode = ARGV.shift
42
+ abort "#{ $0 } [login|create_package (package_name)|add_package (package_id release_name release.ext)]" unless mode
43
+
44
+ page, form, method = nil
45
+ extheader = {}
46
+
47
+ case mode
48
+
49
+ when %r/login/
50
+ page = "/account/login.php"
51
+ method = "post_content"
52
+
53
+ form = {
54
+ "return_to" => "",
55
+ "form_loginname" => username,
56
+ "form_pw" => password,
57
+ "login" => "Login"
58
+ }
59
+
60
+ when %r/create_package/
61
+ page = "/frs/admin/index.php"
62
+ method = "post_content"
63
+
64
+ opts =
65
+ GetoptLong::new(
66
+ [ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
67
+ [ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ]
68
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
69
+
70
+ package_name = ARGV.shift
71
+ abort "#{ $0 } package_name" unless package_name
72
+
73
+ group_id = opts["group_id"] || config["group_id"]
74
+ is_public = opts["is_private"] ? 0 : 1
75
+
76
+ form = {
77
+ "group_id" => group_id,
78
+ "package_name" => package_name,
79
+ "func" => "add_package",
80
+ "is_public" => is_public,
81
+ "submit" => "Create This Package",
82
+ }
83
+
84
+ when %r/add_release/
85
+ page = "/frs/admin/qrs.php"
86
+ method = "post_content"
87
+
88
+ opts =
89
+ GetoptLong::new(
90
+ [ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
91
+ [ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
92
+ [ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
93
+ [ "--processor_id" , "-P" , GetoptLong::REQUIRED_ARGUMENT ] ,
94
+ [ "--release_nots" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
95
+ [ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ]
96
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
97
+
98
+ package_id, release_name, userfile, ignored = ARGV
99
+ abort "#{ $0 } package_name" unless
100
+ package_id and release_name and userfile
101
+
102
+ package_id = config["package_ids"][package_id] unless
103
+ package_id =~ %r/^\d+$/
104
+
105
+ group_id = opts["group_id"] || config["group_id"]
106
+ release_date = opts["release_date"] || Time::now.strftime('%Y-%m-%d %H:%M')
107
+
108
+ type_id = opts['type_id'] || userfile[%r|\.[^\./]+$|]
109
+ type_id = {
110
+ ".deb" => 1000,
111
+ ".rpm" => 2000,
112
+ ".zip" => 3000,
113
+ ".bz2" => 3100,
114
+ ".gz" => 3110,
115
+ ".src.zip" => 5000,
116
+ ".src.bz2" => 5010,
117
+ ".src.gz" => 5020,
118
+ ".src.rpm" => 5100,
119
+ ".src" => 5900,
120
+ ".jpg" => 8000,
121
+ ".txt" => 8100,
122
+ ".text" => 8100,
123
+ ".htm" => 8200,
124
+ ".html" => 8200,
125
+ ".pdf" => 8300,
126
+ ".oth" => 9999,
127
+ ".ebuild" => 1300,
128
+ ".exe" => 1100,
129
+ ".dmg" => 1200,
130
+ ".tar.gz" => 5000,
131
+ ".tgz" => 5000,
132
+ ".gem" => 1400,
133
+ ".pgp" => 8150,
134
+ ".sig" => 8150,
135
+ }[type_id]
136
+
137
+ processor_id = opts['processor_id'] || 'Any'
138
+ processor_id = {
139
+ "i386" => 1000,
140
+ "IA64" => 6000,
141
+ "Alpha" => 7000,
142
+ "Any" => 8000,
143
+ "PPC" => 2000,
144
+ "MIPS" => 3000,
145
+ "Sparc" => 4000,
146
+ "UltraSparc" => 5000,
147
+ "Other" => 9999,
148
+ }[processor_id]
149
+
150
+ release_notes = opts['release_notes'] || nil
151
+ release_notes = open(release_notes) if release_notes
152
+
153
+ release_changes = opts['release_changes'] || nil
154
+ release_changes = open(release_changes) if release_changes
155
+
156
+ userfile = open(userfile)
157
+
158
+ preformatted = '1'
159
+
160
+ form = {
161
+ "group_id" => group_id,
162
+ "package_id" => package_id,
163
+ "release_name" => release_name,
164
+ "release_date" => release_date,
165
+ "type_id" => type_id,
166
+ "processor_id" => processor_id,
167
+ "preformatted" => preformatted,
168
+ "userfile" => userfile,
169
+ "submit" => "Release File"
170
+ }
171
+
172
+ boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
173
+ extheader['content-type'] = "multipart/form-data; boundary=___#{ boundary }___"
174
+
175
+ else
176
+ abort "#{ $0 } login create_package add_release"
177
+
178
+ end
179
+ #
180
+ # http transaction
181
+ #
182
+ client = HTTPAccess2::Client::new ENV['HTTP_PROXY']
183
+ client.debug_dev = STDERR if ENV['DEBUG']
184
+
185
+ client.set_cookie_store cookie_jar
186
+
187
+ # fixes http-access2 bug
188
+ client.redirect_uri_callback = lambda do |res|
189
+ page = res.header['location'].first
190
+ page = page =~ %r/http/ ? page : "#{ config['uri'] }/#{ page }"
191
+ page
192
+ end
193
+
194
+ response = client.send "#{ method }", "#{ config['uri'] }/#{ page }", form, extheader
195
+
196
+ client.save_cookie_store
197
+
198
+ # fixes http-access2 bug
199
+ BEGIN {
200
+ require "http-access2"
201
+ module WebAgent::CookieUtils
202
+ def domain_match(host, domain)
203
+ case domain
204
+ when /\d+\.\d+\.\d+\.\d+/
205
+ return (host == domain)
206
+ when '.'
207
+ return true
208
+ when /^\./
209
+ #return tail_match?(domain, host)
210
+ return tail_match?(host, domain)
211
+ else
212
+ return (host == domain)
213
+ end
214
+ end
215
+ end
216
+
217
+ }
@@ -0,0 +1,217 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # RENAME THIS to rubyorge, and change username/password below to your rubyforge details.
4
+ # Set rubyforge file to Ignore on Subversion.
5
+ # libs
6
+ #
7
+ $VERBOSE = nil
8
+ require "getoptlong"
9
+ require "enumerator"
10
+ require "http-access2"
11
+ #
12
+ # config
13
+ #
14
+ config = {
15
+ "username" => "username", # this must be your username
16
+ "password" => "password", # this must be your password
17
+
18
+ "group_id" => 1953, # see source of http://rubyforge.org/frs/admin/qrs.php?package=&group_id=1953
19
+
20
+ "package_ids" => { # configure shortcuts for your packages here
21
+ "compositekeys" => 2327,
22
+ },
23
+
24
+ "uri" => "http://rubyforge.org",
25
+ "cookie_jar" => File::join(File::expand_path("~"), ".rubyforge.cookie_jar"),
26
+ }
27
+
28
+ opts =
29
+ GetoptLong::new(
30
+ [ "--username" , "-u" , GetoptLong::REQUIRED_ARGUMENT ] ,
31
+ [ "--password" , "-p" , GetoptLong::REQUIRED_ARGUMENT ] ,
32
+ [ "--cookie_jar" , "-c" , GetoptLong::REQUIRED_ARGUMENT ]
33
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
34
+
35
+ username = opts['username'] || config['username']
36
+ password = opts['password'] || config['password']
37
+ cookie_jar = opts["cookie_jar"] || config['cookie_jar']
38
+ #
39
+ # setup
40
+ #
41
+ mode = ARGV.shift
42
+ abort "#{ $0 } [login|create_package (package_name)|add_package (package_id release_name release.ext)]" unless mode
43
+
44
+ page, form, method = nil
45
+ extheader = {}
46
+
47
+ case mode
48
+
49
+ when %r/login/
50
+ page = "/account/login.php"
51
+ method = "post_content"
52
+
53
+ form = {
54
+ "return_to" => "",
55
+ "form_loginname" => username,
56
+ "form_pw" => password,
57
+ "login" => "Login"
58
+ }
59
+
60
+ when %r/create_package/
61
+ page = "/frs/admin/index.php"
62
+ method = "post_content"
63
+
64
+ opts =
65
+ GetoptLong::new(
66
+ [ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
67
+ [ "--is_private" , "-P" , GetoptLong::REQUIRED_ARGUMENT ]
68
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
69
+
70
+ package_name = ARGV.shift
71
+ abort "#{ $0 } package_name" unless package_name
72
+
73
+ group_id = opts["group_id"] || config["group_id"]
74
+ is_public = opts["is_private"] ? 0 : 1
75
+
76
+ form = {
77
+ "group_id" => group_id,
78
+ "package_name" => package_name,
79
+ "func" => "add_package",
80
+ "is_public" => is_public,
81
+ "submit" => "Create This Package",
82
+ }
83
+
84
+ when %r/add_release/
85
+ page = "/frs/admin/qrs.php"
86
+ method = "post_content"
87
+
88
+ opts =
89
+ GetoptLong::new(
90
+ [ "--group_id" , "-g" , GetoptLong::REQUIRED_ARGUMENT ] ,
91
+ [ "--release_date" , "-r" , GetoptLong::REQUIRED_ARGUMENT ] ,
92
+ [ "--type_id" , "-t" , GetoptLong::REQUIRED_ARGUMENT ] ,
93
+ [ "--processor_id" , "-P" , GetoptLong::REQUIRED_ARGUMENT ] ,
94
+ [ "--release_nots" , "-n" , GetoptLong::REQUIRED_ARGUMENT ] ,
95
+ [ "--release_changes" , "-a" , GetoptLong::REQUIRED_ARGUMENT ]
96
+ ).enum_for.inject({}){|h,kv| h.update Hash[*kv]}
97
+
98
+ package_id, release_name, userfile, ignored = ARGV
99
+ abort "#{ $0 } package_name" unless
100
+ package_id and release_name and userfile
101
+
102
+ package_id = config["package_ids"][package_id] unless
103
+ package_id =~ %r/^\d+$/
104
+
105
+ group_id = opts["group_id"] || config["group_id"]
106
+ release_date = opts["release_date"] || Time::now.strftime('%Y-%m-%d %H:%M')
107
+
108
+ type_id = opts['type_id'] || userfile[%r|\.[^\./]+$|]
109
+ type_id = {
110
+ ".deb" => 1000,
111
+ ".rpm" => 2000,
112
+ ".zip" => 3000,
113
+ ".bz2" => 3100,
114
+ ".gz" => 3110,
115
+ ".src.zip" => 5000,
116
+ ".src.bz2" => 5010,
117
+ ".src.gz" => 5020,
118
+ ".src.rpm" => 5100,
119
+ ".src" => 5900,
120
+ ".jpg" => 8000,
121
+ ".txt" => 8100,
122
+ ".text" => 8100,
123
+ ".htm" => 8200,
124
+ ".html" => 8200,
125
+ ".pdf" => 8300,
126
+ ".oth" => 9999,
127
+ ".ebuild" => 1300,
128
+ ".exe" => 1100,
129
+ ".dmg" => 1200,
130
+ ".tar.gz" => 5000,
131
+ ".tgz" => 5000,
132
+ ".gem" => 1400,
133
+ ".pgp" => 8150,
134
+ ".sig" => 8150,
135
+ }[type_id]
136
+
137
+ processor_id = opts['processor_id'] || 'Any'
138
+ processor_id = {
139
+ "i386" => 1000,
140
+ "IA64" => 6000,
141
+ "Alpha" => 7000,
142
+ "Any" => 8000,
143
+ "PPC" => 2000,
144
+ "MIPS" => 3000,
145
+ "Sparc" => 4000,
146
+ "UltraSparc" => 5000,
147
+ "Other" => 9999,
148
+ }[processor_id]
149
+
150
+ release_notes = opts['release_notes'] || nil
151
+ release_notes = open(release_notes) if release_notes
152
+
153
+ release_changes = opts['release_changes'] || nil
154
+ release_changes = open(release_changes) if release_changes
155
+
156
+ userfile = open(userfile)
157
+
158
+ preformatted = '1'
159
+
160
+ form = {
161
+ "group_id" => group_id,
162
+ "package_id" => package_id,
163
+ "release_name" => release_name,
164
+ "release_date" => release_date,
165
+ "type_id" => type_id,
166
+ "processor_id" => processor_id,
167
+ "preformatted" => preformatted,
168
+ "userfile" => userfile,
169
+ "submit" => "Release File"
170
+ }
171
+
172
+ boundary = Array::new(8){ "%2.2d" % rand(42) }.join('__')
173
+ extheader['content-type'] = "multipart/form-data; boundary=___#{ boundary }___"
174
+
175
+ else
176
+ abort "#{ $0 } login create_package add_release"
177
+
178
+ end
179
+ #
180
+ # http transaction
181
+ #
182
+ client = HTTPAccess2::Client::new ENV['HTTP_PROXY']
183
+ client.debug_dev = STDERR if ENV['DEBUG']
184
+
185
+ client.set_cookie_store cookie_jar
186
+
187
+ # fixes http-access2 bug
188
+ client.redirect_uri_callback = lambda do |res|
189
+ page = res.header['location'].first
190
+ page = page =~ %r/http/ ? page : "#{ config['uri'] }/#{ page }"
191
+ page
192
+ end
193
+
194
+ response = client.send "#{ method }", "#{ config['uri'] }/#{ page }", form, extheader
195
+
196
+ client.save_cookie_store
197
+
198
+ # fixes http-access2 bug
199
+ BEGIN {
200
+ require "http-access2"
201
+ module WebAgent::CookieUtils
202
+ def domain_match(host, domain)
203
+ case domain
204
+ when /\d+\.\d+\.\d+\.\d+/
205
+ return (host == domain)
206
+ when '.'
207
+ return true
208
+ when /^\./
209
+ #return tail_match?(domain, host)
210
+ return tail_match?(host, domain)
211
+ else
212
+ return (host == domain)
213
+ end
214
+ end
215
+ end
216
+
217
+ }