composite_primary_keys 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
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
+ }