give SWFs real, unique ID numbers

Lots of scary bugs were being caused by the fact that the possibly-duplicate Neopets ID
was being treated as an SWF's real primary key, meaning that a save meant for object swf
number 123 could be saved to biology swf number 123. Which is awful.

This update gives SWFs their own unique internal ID numbers. All external lookups still use
the remote ID and the type, meaning that the client side remains totally unchanged (phew).
However, all database relationships with SWFs use the new ID numbers, making everything
cleaner. Yay.

There are probably a few places where it would be appropriate to optimize certain lookups
that still depend on remote ID and type. Whatever. Today's goal was to remove crazy
glitches that have been floating around like mad. And I think that goal has been met.
This commit is contained in:
Emi Matchu 2012-01-12 17:17:59 -06:00
parent bdb2dfd97a
commit 696b2aedaf
94 changed files with 222 additions and 164 deletions

View file

@ -1,6 +1,6 @@
source 'http://rubygems.org'
gem 'rails', '3.0.4'
gem 'rails', '3.0.5'
#gem 'sqlite3-ruby', '~> 1.3.1', :require => 'sqlite3'
gem 'compass', '~> 0.10.1'

View file

@ -1,55 +1,61 @@
GIT
remote: git://github.com/eventmachine/eventmachine.git
revision: 1d9b28eae110457ef3915aef380319a95697a167
revision: 69151c3ebb3e4ecf2bb9b6e2fab2022dc34f8541
specs:
eventmachine (1.0.0.beta.2)
eventmachine (1.0.0.beta.4)
GIT
remote: git://github.com/igrigorik/em-http-request.git
revision: bbf9c11e02aaa91f5d1149319dcab59f410426e8
revision: ce50f322ce08d43a4a747cf333ea576765d764c4
specs:
em-http-request (0.3.0)
addressable (>= 2.0.0)
escape_utils
eventmachine (>= 0.12.9)
em-http-request (1.0.1)
addressable (>= 2.2.3)
cookiejar
em-socksify
eventmachine (>= 1.0.0.beta.4)
http_parser.rb (>= 0.5.3)
GIT
remote: git://github.com/igrigorik/em-mysqlplus.git
revision: 35320562abc914cc7d9fd203abb746f99796739e
revision: 11d6e1123654b948c1d0a8c9d9077e82420b2846
specs:
em-mysqlplus (0.1.5)
eventmachine (>= 0.12.9)
GIT
remote: git://github.com/igrigorik/em-synchrony.git
revision: f59169c5c8f893336802f1de2970ee9dd8755158
revision: c7209a58f9eb92e1dc81fb141297f9f257c2fdcb
specs:
em-synchrony (0.2.0)
eventmachine (>= 0.12.9)
em-synchrony (1.0.0)
eventmachine (>= 1.0.0.beta.1)
GIT
remote: git://github.com/oldmoe/mysqlplus.git
revision: 2daef86c487ec1c531ecfe84ed342d15a1c89554
revision: 3dbaa7c00ff0bb75ad9538cdef176c72de35d231
specs:
mysqlplus (0.1.1)
GIT
remote: git://github.com/rubyamf/rocketamf.git
revision: fdef9d836f1ed27b06ce669ea05122fa0dec4a12
revision: ed82db7659f624d6c3ca244e4127dad270a484c7
specs:
RocketAMF (1.0.0)
GEM
remote: http://rubygems.org/
specs:
POpen4 (0.1.4)
Platform (>= 0.4.0)
open4
Platform (0.4.0)
aaronh-chronic (0.3.9)
abstract (1.0.0)
actionmailer (3.0.4)
actionpack (= 3.0.4)
actionmailer (3.0.5)
actionpack (= 3.0.5)
mail (~> 2.2.15)
actionpack (3.0.4)
activemodel (= 3.0.4)
activesupport (= 3.0.4)
actionpack (3.0.5)
activemodel (= 3.0.5)
activesupport (= 3.0.5)
builder (~> 2.1.2)
erubis (~> 2.6.6)
i18n (~> 0.4)
@ -57,83 +63,88 @@ GEM
rack-mount (~> 0.6.13)
rack-test (~> 0.5.7)
tzinfo (~> 0.3.23)
activemodel (3.0.4)
activesupport (= 3.0.4)
activemodel (3.0.5)
activesupport (= 3.0.5)
builder (~> 2.1.2)
i18n (~> 0.4)
activerecord (3.0.4)
activemodel (= 3.0.4)
activesupport (= 3.0.4)
activerecord (3.0.5)
activemodel (= 3.0.5)
activesupport (= 3.0.5)
arel (~> 2.0.2)
tzinfo (~> 0.3.23)
activeresource (3.0.4)
activemodel (= 3.0.4)
activesupport (= 3.0.4)
activesupport (3.0.4)
addressable (2.2.4)
arel (2.0.8)
activeresource (3.0.5)
activemodel (= 3.0.5)
activesupport (= 3.0.5)
activesupport (3.0.5)
addressable (2.2.6)
arel (2.0.10)
bcrypt-ruby (2.1.4)
builder (2.1.2)
character-encodings (0.4.1)
closure-compiler (1.0.0)
closure-compiler (1.1.4)
compass (0.10.6)
haml (>= 3.0.4)
devise (1.1.5)
cookiejar (0.3.0)
devise (1.1.9)
bcrypt-ruby (~> 2.1.2)
warden (~> 1.0.2)
diff-lcs (1.1.2)
diff-lcs (1.1.3)
em-socksify (0.1.0)
eventmachine
erubis (2.6.6)
abstract (>= 1.0.0)
escape_utils (0.1.9)
factory_girl (1.3.3)
factory_girl_rails (1.0.1)
factory_girl (~> 1.3)
factory_girl (2.3.2)
activesupport
factory_girl_rails (1.4.0)
factory_girl (~> 2.3.0)
railties (>= 3.0.0)
haml (3.0.25)
hoptoad_notifier (2.4.5)
hoptoad_notifier (2.4.11)
activesupport
builder
i18n (0.5.0)
http_parser.rb (0.5.3)
i18n (0.6.0)
jammit (0.5.4)
closure-compiler (>= 0.1.0)
yui-compressor (>= 0.9.1)
json (1.4.6)
mail (2.2.15)
mail (2.2.19)
activesupport (>= 2.3.6)
i18n (>= 0.4.0)
mime-types (~> 1.16)
treetop (~> 1.4.8)
memcache-client (1.8.5)
mime-types (1.16)
msgpack (0.4.4)
mysql2 (0.2.6)
mime-types (1.17.2)
msgpack (0.4.6)
mysql2 (0.3.11)
nokogiri (1.5.0)
open4 (1.3.0)
openneo-auth-signatory (0.1.0)
ruby-hmac
polyglot (0.3.1)
rack (1.2.3)
rack-fiber_pool (0.9.1)
rack-mount (0.6.13)
polyglot (0.3.3)
rack (1.2.5)
rack-fiber_pool (0.9.2)
rack-mount (0.6.14)
rack (>= 1.0.0)
rack-test (0.5.7)
rack (>= 1.0)
rails (3.0.4)
actionmailer (= 3.0.4)
actionpack (= 3.0.4)
activerecord (= 3.0.4)
activeresource (= 3.0.4)
activesupport (= 3.0.4)
rails (3.0.5)
actionmailer (= 3.0.5)
actionpack (= 3.0.5)
activerecord (= 3.0.5)
activeresource (= 3.0.5)
activesupport (= 3.0.5)
bundler (~> 1.0)
railties (= 3.0.4)
railties (3.0.4)
actionpack (= 3.0.4)
activesupport (= 3.0.4)
railties (= 3.0.5)
railties (3.0.5)
actionpack (= 3.0.5)
activesupport (= 3.0.5)
rake (>= 0.8.7)
thor (~> 0.14.4)
rake (0.8.7)
rake (0.9.2.2)
rdiscount (1.6.8)
redis (2.2.1)
redis-namespace (1.0.3)
redis (2.2.2)
redis-namespace (1.1.0)
redis (< 3.0.0)
resque (1.15.0)
json (~> 1.4.6)
@ -143,9 +154,9 @@ GEM
resque-retry (0.1.0)
resque (>= 1.8.0)
resque-scheduler (>= 1.8.0)
resque-scheduler (2.0.0.d)
resque-scheduler (2.0.0.e)
redis (>= 2.0.1)
resque (>= 1.8.0)
resque (>= 1.15.0)
rufus-scheduler
right_aws (2.1.0)
right_http_connection (>= 1.2.5)
@ -163,28 +174,30 @@ GEM
rspec-rails (2.0.1)
rspec (~> 2.0.0)
ruby-hmac (0.4.0)
rufus-scheduler (2.0.9)
rufus-scheduler (2.0.16)
tzinfo (>= 0.3.23)
sanitize (2.0.3)
nokogiri (< 1.6, >= 1.4.4)
sinatra (1.2.6)
sinatra (1.2.8)
rack (~> 1.1)
tilt (< 2.0, >= 1.2.2)
tilt (>= 1.2.2, < 2.0)
swf_converter (0.0.3)
thor (0.14.6)
tilt (1.3.2)
treetop (1.4.9)
tilt (1.3.3)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.28)
tzinfo (0.3.31)
vegas (0.1.8)
rack (>= 1.0.0)
warden (1.0.3)
rack (>= 1.0.0)
whenever (0.6.2)
warden (1.0.6)
rack (>= 1.0)
whenever (0.6.8)
aaronh-chronic (>= 0.3.9)
activesupport (>= 2.3.4)
will_paginate (3.0.pre2)
yui-compressor (0.9.3)
will_paginate (3.0.2)
yui-compressor (0.9.6)
POpen4 (>= 0.1.4)
PLATFORMS
ruby
@ -210,7 +223,7 @@ DEPENDENCIES
nokogiri (~> 1.5.0)
openneo-auth-signatory (~> 0.1.0)
rack-fiber_pool
rails (= 3.0.4)
rails (= 3.0.5)
rdiscount (~> 1.6.5)
resque (~> 1.15.0)
resque-retry (~> 0.1.0)

View file

@ -3,14 +3,16 @@ class BrokenImageReportsController < ApplicationController
ids = params[:asset_ids]
assets = SwfAsset.arel_table
@swf_assets = SwfAsset.where(:has_image => true).where((
assets[:id].in(ids[:biology]).and(assets[:type].eq('biology'))
assets[:remote_id].in(ids[:biology]).and(assets[:type].eq('biology'))
).or(
assets[:id].in(ids[:object]).and(assets[:type].eq('object'))
assets[:remote_id].in(ids[:object]).and(assets[:type].eq('object'))
))
end
def create
swf_asset = SwfAsset.find params[:swf_asset_id]
swf_asset = SwfAsset.where(:type => params[:swf_asset_type]).
find_by_remote_id(params[:swf_asset_remote_id])
if swf_asset.report_broken
flash[:success] = "Thanks! This image will be reconverted soon. If it " +

View file

@ -29,10 +29,10 @@ class SwfAssetsController < ApplicationController
elsif params[:ids]
@swf_assets = []
if params[:ids][:biology]
@swf_assets += SwfAsset.biology_assets.where(:id => params[:ids][:biology]).all
@swf_assets += SwfAsset.biology_assets.where(:remote_id => params[:ids][:biology]).all
end
if params[:ids][:object]
@swf_assets += SwfAsset.object_assets.where(:id => params[:ids][:object]).all
@swf_assets += SwfAsset.object_assets.where(:remote_id => params[:ids][:object]).all
end
end
if @swf_assets

View file

@ -8,8 +8,8 @@ class AssetImageConversionRequest
@queue = :requested_asset_images
def self.perform(asset_type, asset_id)
asset = SwfAsset.where(:type => asset_type).find(asset_id)
def self.perform(asset_id)
asset = SwfAsset.find(asset_id)
asset.convert_swf_if_not_converted!
end

View file

@ -7,10 +7,8 @@ class Item < ActiveRecord::Base
has_many :closet_hangers
has_one :contribution, :as => :contributed
has_many :parent_swf_asset_relationships, :foreign_key => 'parent_id',
:conditions => {:swf_asset_type => SwfAssetType}
has_many :swf_assets, :through => :parent_swf_asset_relationships, :source => :object_asset,
:conditions => {:type => SwfAssetType}
has_many :parent_swf_asset_relationships, :as => :parent
has_many :swf_assets, :through => :parent_swf_asset_relationships
attr_writer :current_body_id, :owned, :wanted
@ -29,14 +27,7 @@ class Item < ActiveRecord::Base
scope :alphabetize, order('name ASC')
scope :join_swf_assets, joins("INNER JOIN #{ParentSwfAssetRelationship.table_name} psa ON psa.swf_asset_type = 'object' AND psa.parent_id = objects.id").
joins("INNER JOIN #{SwfAsset.table_name} swf_assets ON swf_assets.id = psa.swf_asset_id").
group('objects.id')
scope :without_swf_assets, joins(
"LEFT JOIN #{ParentSwfAssetRelationship.table_name} psa ON psa.swf_asset_type = 'object' AND psa.parent_id = #{table_name}.id " +
"LEFT JOIN #{SwfAsset.table_name} sa ON sa.type = 'object' AND sa.id = psa.swf_asset_id"
).where('sa.id IS NULL')
scope :join_swf_assets, joins(:swf_assets).group('objects.id')
scope :newest, order(arel_table[:created_at].desc) if arel_table[:created_at]
@ -191,15 +182,13 @@ class Item < ActiveRecord::Base
# but doesn't in this sample, the two have been unbound. Delete the
# relationship.
ids_to_delete = self.parent_swf_asset_relationships.
select(:id).
joins(:object_asset).
select(:remote_id).
joins(:swf_asset).
where(rels[:swf_asset_id].not_in(new_swf_asset_ids)).
where(swf_assets[:body_id].in([@current_body_id, 0])).
map(&:id)
map(&:remote_id)
unless ids_to_delete.empty?
ParentSwfAssetRelationship.
where(rels[:parent_id].eq(self.id)).
where(rels[:swf_asset_type].eq(SwfAssetType)).
self.parent_swf_asset_relationships.
where(rels[:swf_asset_id].in(ids_to_delete)).
delete_all
end
@ -241,7 +230,10 @@ class Item < ActiveRecord::Base
swf_assets_by_id[id] = swf_asset
swf_asset_ids << id
end
SwfAsset.select('id, parent_id').object_assets.joins(:object_asset_relationships).
SwfAsset.select([
SwfAsset.arel_table[:id],
ParentSwfAssetRelationship.arel_table[:parent_id]
]).object_assets.joins(:parent_swf_asset_relationships).
where(SwfAsset.arel_table[:id].in(swf_asset_ids)).each do |row|
item_id = row.parent_id.to_i
swf_assets_by_parent_id[item_id] ||= []
@ -291,7 +283,7 @@ class Item < ActiveRecord::Base
asset_registry.each do |asset_id, asset_data|
swf_asset_ids << asset_id.to_i if asset_data
end
existing_swf_assets = SwfAsset.object_assets.find_all_by_id swf_asset_ids
existing_swf_assets = SwfAsset.object_assets.find_all_by_remote_id swf_asset_ids
existing_swf_assets_by_id = {}
existing_swf_assets.each do |swf_asset|
existing_swf_assets_by_id[swf_asset.id] = swf_asset
@ -318,7 +310,7 @@ class Item < ActiveRecord::Base
swf_asset = existing_swf_assets_by_id[swf_asset_id]
unless swf_asset
swf_asset = SwfAsset.new
swf_asset.id = swf_asset_id
swf_asset.remote_id = swf_asset_id
end
swf_asset.origin_object_data = asset_data
swf_asset.origin_pet_type = pet_type
@ -327,11 +319,10 @@ class Item < ActiveRecord::Base
relationship = existing_relationships_by_item_id_and_swf_asset_id[item.id][swf_asset_id] rescue nil
unless relationship
relationship = ParentSwfAssetRelationship.new
relationship.parent_id = item.id
relationship.swf_asset_type = SwfAssetType
relationship.parent = item
relationship.swf_asset_id = swf_asset.id
end
relationship.object_asset = swf_asset
relationship.swf_asset = swf_asset
relationships_by_item_id[item_id] ||= []
relationships_by_item_id[item_id] << relationship
end
@ -787,7 +778,7 @@ class Item < ActiveRecord::Base
# the zone requirement. If that max was NULL, return the object.
item_ids = select(arel_table[:id]).joins(
"LEFT JOIN #{ParentSwfAssetRelationship.table_name} #{psa.name} ON " +
psa[:swf_asset_type].eq(SwfAssetType).
psa[:parent_type].eq(self.name).
and(psa[:parent_id].eq(arel_table[:id])).
to_sql
).

View file

@ -1,17 +1,12 @@
class ParentSwfAssetRelationship < ActiveRecord::Base
set_table_name 'parents_swf_assets'
belongs_to :item, :foreign_key => 'parent_id'
belongs_to :parent, :polymorphic => true
belongs_to :biology_asset, :class_name => 'SwfAsset', :foreign_key => 'swf_asset_id', :conditions => {:type => 'biology'}
belongs_to :object_asset, :class_name => 'SwfAsset', :foreign_key => 'swf_asset_id', :conditions => {:type => 'object'}
def swf_asset
self.swf_asset_type == 'biology' ? self.biology_asset : self.object_asset
end
belongs_to :swf_asset
def item=(replacement)
self.parent_id = replacement.id
self.parent = replacement
end
def pet_state
@ -19,6 +14,6 @@ class ParentSwfAssetRelationship < ActiveRecord::Base
end
def pet_state=(replacement)
self.parent_id = replacement.id
self.parent = replacement
end
end

View file

@ -1,12 +1,10 @@
class PetState < ActiveRecord::Base
SwfAssetType = 'biology'
has_many :contributions, :as => :contributed # in case of duplicates being merged
has_many :outfits
has_many :parent_swf_asset_relationships, :foreign_key => 'parent_id',
:conditions => {:swf_asset_type => SwfAssetType}
has_many :swf_assets, :through => :parent_swf_asset_relationships, :source => :biology_asset,
:conditions => {:type => SwfAssetType}
has_many :parent_swf_asset_relationships, :foreign_key => 'parent_id'
has_many :swf_assets, :through => :parent_swf_asset_relationships
belongs_to :pet_type
@ -14,9 +12,9 @@ class PetState < ActiveRecord::Base
bio_effect_zone_id = 4
scope :emotion_order, joins(:parent_swf_asset_relationships).
joins("LEFT JOIN swf_assets effect_assets ON effect_assets.id = parents_swf_assets.swf_asset_id AND effect_assets.type = 'biology' AND effect_assets.zone_id = #{bio_effect_zone_id}").
joins("LEFT JOIN swf_assets effect_assets ON effect_assets.remote_id = parents_swf_assets.swf_asset_id AND effect_assets.zone_id = #{bio_effect_zone_id}").
group("pet_states.id").
order("COUNT(effect_assets.id) ASC, COUNT(parents_swf_assets.swf_asset_id) DESC, SUM(parents_swf_assets.swf_asset_id) ASC")
order("COUNT(effect_assets.remote_id) ASC, COUNT(parents_swf_assets.swf_asset_id) DESC, SUM(parents_swf_assets.swf_asset_id) ASC")
def reassign_children_to!(main_pet_state)
self.contributions.each do |contribution|
@ -76,7 +74,7 @@ class PetState < ActiveRecord::Base
swf_asset_ids_str
)
end
existing_swf_assets = SwfAsset.biology_assets.find_all_by_id(swf_asset_ids)
existing_swf_assets = SwfAsset.biology_assets.find_all_by_remote_id(swf_asset_ids)
existing_swf_assets_by_id = {}
existing_swf_assets.each do |swf_asset|
existing_swf_assets_by_id[swf_asset.id] = swf_asset
@ -95,18 +93,17 @@ class PetState < ActiveRecord::Base
swf_asset = existing_swf_assets_by_id[swf_asset_id]
unless swf_asset
swf_asset = SwfAsset.new
swf_asset.id = swf_asset_id
swf_asset.remote_id = swf_asset_id
end
swf_asset.origin_biology_data = asset_info
swf_asset.origin_pet_type = pet_type
relationship = existing_relationships_by_swf_asset_id[swf_asset_id]
unless relationship
relationship ||= ParentSwfAssetRelationship.new
relationship.parent_id = pet_state.id
relationship.swf_asset_type = SwfAssetType
relationship.parent = pet_state
relationship.swf_asset_id = swf_asset.id
end
relationship.biology_asset = swf_asset
relationship.swf_asset = swf_asset
relationships << relationship
end
end

View file

@ -41,7 +41,11 @@ class PetType < ActiveRecord::Base
def as_json(options={})
if options[:for] == 'wardrobe'
{:id => id, :body_id => body_id, :pet_state_ids => pet_states.select('pet_states.id').emotion_order.map(&:id)}
{
:id => id,
:body_id => body_id,
:pet_state_ids => pet_state_ids
}
else
{:image_hash => image_hash}
end
@ -103,7 +107,8 @@ class PetType < ActiveRecord::Base
species_condition = condition
end
end
unneeded_item_ids = Item.select(items[:id]).joins(:parent_swf_asset_relationships => :object_asset).
unneeded_item_ids = Item.select(items[:id]).
joins(:parent_swf_asset_relationships => :swf_asset).
where(SwfAsset.arel_table[:body_id].in([0, self.body_id])).map(&:id)
Item.where(items[:id].not_in(unneeded_item_ids)).
where(species_condition)
@ -113,6 +118,10 @@ class PetType < ActiveRecord::Base
pet_state = PetState.from_pet_type_and_biology_info(self, biology)
pet_state
end
def pet_state_ids
pet_states.select('pet_states.id').emotion_order.map(&:id)
end
before_save do
if @origin_pet && @origin_pet.name =~ IMAGE_CPN_ACCEPTABLE_NAME

View file

@ -57,7 +57,7 @@ class SwfAsset < ActiveRecord::Base
end
def s3_path
"#{self['type']}/#{s3_partition_path}#{self.id}"
"#{self['type']}/#{s3_partition_path}#{self.remote_id}"
end
def s3_url(size)
@ -68,7 +68,7 @@ class SwfAsset < ActiveRecord::Base
PARTITION_DIGITS = 3
PARTITION_ID_LENGTH = PARTITION_COUNT * PARTITION_DIGITS
def s3_partition_path
(id / 10**PARTITION_DIGITS).to_s.rjust(PARTITION_ID_LENGTH, '0').tap do |id_str|
(remote_id / 10**PARTITION_DIGITS).to_s.rjust(PARTITION_ID_LENGTH, '0').tap do |id_str|
PARTITION_COUNT.times do |n|
id_str.insert(PARTITION_ID_LENGTH - (n * PARTITION_DIGITS), '/')
end
@ -88,7 +88,7 @@ class SwfAsset < ActiveRecord::Base
if image_requested?
false
else
Resque.enqueue(AssetImageConversionRequest, self.type, self.id)
Resque.enqueue(AssetImageConversionRequest, self.id)
self.image_requested = true
save!
true
@ -100,7 +100,7 @@ class SwfAsset < ActiveRecord::Base
return false
end
Resque.enqueue(AssetImageConversionRequest::OnBrokenImageReport, self.type, self.id)
Resque.enqueue(AssetImageConversionRequest::OnBrokenImageReport, self.id)
self.reported_broken_at = Time.now
self.save
end
@ -119,8 +119,7 @@ class SwfAsset < ActiveRecord::Base
attr_accessor :item
has_one :contribution, :as => :contributed
has_many :object_asset_relationships, :class_name => 'ParentSwfAssetRelationship',
:conditions => {:swf_asset_type => 'object'}
has_many :parent_swf_asset_relationships
delegate :depth, :to => :zone
@ -144,7 +143,7 @@ class SwfAsset < ActiveRecord::Base
scope :biology_assets, where(:type => PetState::SwfAssetType)
scope :object_assets, where(:type => Item::SwfAssetType)
scope :for_item_ids, lambda { |item_ids|
joins(:object_asset_relationships).
joins(:parent_swf_asset_relationships).
where(ParentSwfAssetRelationship.arel_table[:parent_id].in(item_ids))
}
@ -154,7 +153,7 @@ class SwfAsset < ActiveRecord::Base
def as_json(options={})
json = {
:id => id,
:id => remote_id,
:type => type,
:depth => depth,
:body_id => body_id,
@ -236,7 +235,7 @@ class SwfAsset < ActiveRecord::Base
end
after_commit :on => :create do
Resque.enqueue(AssetImageConversionRequest::OnCreation, self.type, self.id)
Resque.enqueue(AssetImageConversionRequest::OnCreation, self.id)
end
class DownloadError < Exception;end

View file

@ -1,12 +0,0 @@
module SwfAssetParent
def swf_assets
rels = ParentSwfAssetRelationship.arel_table
type = self.class::SwfAssetType
ids = ParentSwfAssetRelationship.
where(rels[:parent_id].eq(id).and(rels[:swf_asset_type].eq(type))).
select(rels[:swf_asset_id]).
all.map(&:swf_asset_id)
assets = SwfAsset.arel_table
SwfAsset.where(assets[:id].in(ids).and(assets[:type].eq(type)))
end
end

View file

@ -15,7 +15,8 @@
= link_to image_tag(swf_asset.s3_url([150, 150])), swf_asset.url
- unless swf_asset.image_pending_repair?
= form_tag(:action => :create) do
= hidden_field_tag 'swf_asset_id', swf_asset.id
= hidden_field_tag 'swf_asset_remote_id', swf_asset.remote_id
= hidden_field_tag 'swf_asset_type', swf_asset.type
= submit_tag 'Report as broken'
- if swf_asset.converted_at?

View file

@ -0,0 +1,7 @@
<p class="warning">
Dress to Impress is scheduled to go down for maintenance
<strong>tonight at 6 PM NST</strong>.
The <a href="http://oldimpress.openneo.net/">old server</a> will still be
online, and we expect to be done in less than an hour.
Thanks for understanding.
</p>

View file

@ -0,0 +1,55 @@
class RenameSwfAssetsIdToRemoteId < ActiveRecord::Migration
def self.up
rename_column :swf_assets, :id, :remote_id
add_column :swf_assets, :id, :primary_key
Contribution.where(:contributed_type => 'SwfAsset').find_each do |c|
# Use real IDs instead of remote IDs
swf_asset = SwfAsset.object_assets.
find_by_remote_id(c.contributed_id)
c.contributed_id = swf_asset.id
c.save!
end
puts "Updated contributions"
add_column :parents_swf_assets, :id, :primary_key
add_column :parents_swf_assets, :parent_type, :string, :null => false,
:limit => 8
ParentSwfAssetRelationship.all.each do |rel|
swf_asset = SwfAsset.where(:type => rel.swf_asset_type).
find_by_remote_id(rel.swf_asset_id)
rel.swf_asset_id = swf_asset.id
rel.parent_type = (rel.swf_asset_type == 'biology') ? 'PetState' : 'Item'
rel.save!
end
puts "Updated parent/asset relationships"
remove_column :parents_swf_assets, :swf_asset_type
end
def self.down
add_column :parents_swf_assets, :swf_asset_type, :string,
:null => false, :limit => 7
ParentSwfAssetRelationship.all.each do |rel|
swf_asset = SwfAsset.find(rel.swf_asset_id)
rel.swf_asset_id = swf_asset.remote_id
rel.swf_asset_type = swf_asset.type
rel.save!
end
remove_column :parents_swf_assets, :parent_type
remove_column :parents_swf_assets, :id
puts "Updated parent/asset relationships"
Contribution.where(:contributed_type => 'SwfAsset').find_each do |c|
# Use remote IDs instead of real IDs
swf_asset = SwfAsset.find(c.swf_asset_id)
c.contributed_id = swf_asset.remote_id
c.save!
end
puts "Updated contributions"
remove_column :swf_assets, :id
rename_column :swf_assets, :remote_id, :id
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended to check this file into your version control system.
ActiveRecord::Schema.define(:version => 20110807212936) do
ActiveRecord::Schema.define(:version => 20120112204234) do
create_table "auth_servers", :force => true do |t|
t.string "short_name", :limit => 10, :null => false
@ -40,6 +40,11 @@ ActiveRecord::Schema.define(:version => 20110807212936) do
t.integer "visibility", :default => 1, :null => false
end
create_table "colors", :force => true do |t|
t.string "name"
t.boolean "basic", :default => false, :null => false
end
create_table "contributions", :force => true do |t|
t.string "contributed_type", :limit => 8, :null => false
t.integer "contributed_id", :null => false
@ -102,13 +107,13 @@ ActiveRecord::Schema.define(:version => 20110807212936) do
t.boolean "starred", :default => false, :null => false
end
create_table "parents_swf_assets", :id => false, :force => true do |t|
t.integer "parent_id", :limit => 3, :null => false
t.integer "swf_asset_id", :limit => 3, :null => false
t.string "swf_asset_type", :limit => 7, :null => false
create_table "parents_swf_assets", :force => true do |t|
t.integer "parent_id", :limit => 3, :null => false
t.integer "swf_asset_id", :limit => 3, :null => false
t.string "parent_type", :limit => 8, :null => false
end
add_index "parents_swf_assets", ["parent_id", "swf_asset_id", "swf_asset_type"], :name => "unique_parents_swf_assets", :unique => true
add_index "parents_swf_assets", ["parent_id", "swf_asset_id"], :name => "unique_parents_swf_assets", :unique => true
add_index "parents_swf_assets", ["parent_id"], :name => "parent_swf_assets_parent_id"
add_index "parents_swf_assets", ["swf_asset_id"], :name => "parents_swf_assets_swf_asset_id"
@ -151,13 +156,9 @@ ActiveRecord::Schema.define(:version => 20110807212936) do
t.datetime "updated_at"
end
create_table "schema_info", :id => false, :force => true do |t|
t.integer "version", :default => 0, :null => false
end
create_table "swf_assets", :id => false, :force => true do |t|
create_table "swf_assets", :force => true do |t|
t.string "type", :limit => 7, :null => false
t.integer "id", :limit => 3, :null => false
t.integer "remote_id", :limit => 3, :null => false
t.text "url", :limit => 16777215, :null => false
t.integer "zone_id", :limit => 1, :null => false
t.text "zones_restrict", :null => false
@ -170,7 +171,7 @@ ActiveRecord::Schema.define(:version => 20110807212936) do
end
add_index "swf_assets", ["body_id"], :name => "swf_assets_body_id_and_object_id"
add_index "swf_assets", ["type", "id"], :name => "swf_assets_type_and_id"
add_index "swf_assets", ["type", "remote_id"], :name => "swf_assets_type_and_id"
add_index "swf_assets", ["zone_id"], :name => "idx_swf_assets_zone_id"
create_table "topics", :force => true do |t|

BIN
vendor/cache/POpen4-0.1.4.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/Platform-0.4.0.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/actionmailer-3.0.5.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/actionpack-3.0.5.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/activemodel-3.0.5.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/activerecord-3.0.5.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/activesupport-3.0.5.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/addressable-2.2.6.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/arel-2.0.10.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/closure-compiler-1.1.4.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/cookiejar-0.3.0.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/devise-1.1.9.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/diff-lcs-1.1.3.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/em-socksify-0.1.0.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/factory_girl-2.3.2.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/hoptoad_notifier-2.4.11.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/http_parser.rb-0.5.3.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/i18n-0.6.0.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/mail-2.2.19.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/mime-types-1.17.2.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/msgpack-0.4.6.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/mysql2-0.3.11.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/open4-1.3.0.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/polyglot-0.3.3.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/rack-1.2.5.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/rack-fiber_pool-0.9.2.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/rake-0.9.2.2.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/redis-2.2.2.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/redis-namespace-1.1.0.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/rufus-scheduler-2.0.16.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/sinatra-1.2.8.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/tilt-1.3.3.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/treetop-1.4.10.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/tzinfo-0.3.31.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/warden-1.0.6.gem vendored Normal file

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/whenever-0.6.8.gem vendored Normal file

Binary file not shown.

BIN
vendor/cache/will_paginate-3.0.2.gem vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
vendor/cache/yui-compressor-0.9.6.gem vendored Normal file

Binary file not shown.