diff --git a/app/models/language.rb b/app/models/language.rb --- a/app/models/language.rb +++ b/app/models/language.rb @@ -1,2 +1,24 @@ class Language < ActiveRecord::Base + + @@languages_by_ext = {} + + def self.cache_ext_hash + @@languages_by_ext = {} + Language.find(:all).each do |language| + language.common_ext.split(',').each do |ext| + @@languages_by_ext[ext] = language + end + end + end + + def self.find_by_extension(ext) + if @@languages_by_ext.length == 0 + Language.cache_ext_hash + end + if @@languages_by_ext.has_key? ext + return @@languages_by_ext[ext] + else + return nil + end + end end diff --git a/app/models/submission.rb b/app/models/submission.rb --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -81,14 +81,17 @@ return nil end - def self.find_language_in_source(source) + def self.find_language_in_source(source, source_filename="") langopt = find_option_in_source(/^LANG:/,source) - if language = Language.find_by_name(langopt) - return language - elsif language = Language.find_by_pretty_name(langopt) - return language + if langopt + return (Language.find_by_name(langopt) || + Language.find_by_pretty_name(langopt)) else - return nil + if source_filename + return Language.find_by_extension(source_filename.split('.').last) + else + return nil + end end end @@ -114,7 +117,8 @@ end def assign_language - self.language = Submission.find_language_in_source(self.source) + self.language = Submission.find_language_in_source(self.source, + self.source_filename) end # validation codes diff --git a/db/migrate/20090416235658_add_common_ext_to_languages.rb b/db/migrate/20090416235658_add_common_ext_to_languages.rb new file mode 100644 --- /dev/null +++ b/db/migrate/20090416235658_add_common_ext_to_languages.rb @@ -0,0 +1,23 @@ +class AddCommonExtToLanguages < ActiveRecord::Migration + def self.up + # language.common_ext is a comma-separated list of common file + # extensions. + add_column :languages, :common_ext, :string + + # updating table information + Language.reset_column_information + common_ext = { + 'c' => 'c', + 'cpp' => 'cpp,cc', + 'pas' => 'pas' + } + Language.find(:all).each do |lang| + lang.common_ext = common_ext[lang.name] + lang.save + end + end + + def self.down + remove_column :languages, :common_ext + end +end diff --git a/db/schema.rb b/db/schema.rb --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20090206145016) do +ActiveRecord::Schema.define(:version => 20090416235658) do create_table "announcements", :force => true do |t| t.string "author" @@ -59,6 +59,7 @@ t.string "name", :limit => 10 t.string "pretty_name" t.string "ext", :limit => 10 + t.string "common_ext" end create_table "messages", :force => true do |t|