diff --git a/spec/mapping_spec.cr b/spec/mapping_spec.cr index dc8f7e6..8f425ac 100644 --- a/spec/mapping_spec.cr +++ b/spec/mapping_spec.cr @@ -63,6 +63,12 @@ class MappingWithConverter }) end +class MappingWithCaseInsensitivity + DB.mapping({ + foo: {type: Int32, key: "C0"}, + }, case_sensitive: false) +end + macro from_dummy(query, type) with_dummy do |db| rs = db.query({{ query }}) @@ -146,6 +152,10 @@ describe "DB.mapping" do expect_mapping("Zm9v,a", MappingWithConverter, {c0: "foo".to_slice, c1: "a"}) end + it "should perform column name to property name match with case insensitivity" do + expect_mapping("1", MappingWithCaseInsensitivity, {foo: 1}) + end + it "should initialize multiple instances from a single resultset" do with_dummy do |db| db.query("1,a 2,b") do |rs| diff --git a/src/db/mapping.cr b/src/db/mapping.cr index 8c07499..323ea35 100644 --- a/src/db/mapping.cr +++ b/src/db/mapping.cr @@ -57,7 +57,7 @@ module DB # it and initializes this type's instance variables. # # This macro also declares instance variables of the types given in the mapping. - macro mapping(properties, strict = true) + macro mapping(properties, strict = true, case_sensitive = true) include ::DB::Mappable {% for key, value in properties %} @@ -102,9 +102,9 @@ module DB {% end %} %rs.each_column do |col_name| - case col_name + case col_name{% if !case_sensitive %}.downcase{% end %} {% for key, value in properties %} - when {{value[:key] || key.id.stringify}} + when {{value[:key] || key.id.stringify}}{% if !case_sensitive %}.downcase{% end %} %found{key.id} = true %var{key.id} = {% if value[:converter] %}