From bc71850e4713f73242ac3bcabbb2e283b28dc93a Mon Sep 17 00:00:00 2001 From: cxl Date: Wed, 13 Nov 2013 13:16:09 +0000 Subject: [PATCH] Sql: Fixed issues with S_* and BOOL git-svn-id: svn://ultimatepp.org/upp/trunk@6550 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Sql/S_info.cpp | 11 +++++++++-- uppsrc/Sql/Sql.cpp | 4 +++- uppsrc/Sql/SqlSchema.h | 2 +- uppsrc/Sql/Sqlexp.h | 5 +++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/uppsrc/Sql/S_info.cpp b/uppsrc/Sql/S_info.cpp index 5c0c45f35..ea331d5d3 100644 --- a/uppsrc/Sql/S_info.cpp +++ b/uppsrc/Sql/S_info.cpp @@ -2,8 +2,9 @@ NAMESPACE_UPP -void S_info_maker::Field(const char *name, Ref f) +void S_info_maker::Field(const char *name, Ref f, bool *b) { + if(b) f = Ref(*b); info.column.Add(name, MakeTuple((byte *)f.GetVoidPtr() - (byte *)s, f.GetManager())); } @@ -38,7 +39,13 @@ ValueMap S_info::Get(const void *s) const void S_info::Set(const void *s, int i, const Value& v) const { - GetRef(s, i) = v; + Ref f = GetRef(s, i); + if(f.Is() && IsString(v)) { + String h = v; + f = !(h == "0" || IsNull(h)); + } + else + f = v; } void S_info::Set(const void *s, const SqlId& id, const Value& v) const diff --git a/uppsrc/Sql/Sql.cpp b/uppsrc/Sql/Sql.cpp index 91882f357..0c4594340 100644 --- a/uppsrc/Sql/Sql.cpp +++ b/uppsrc/Sql/Sql.cpp @@ -24,9 +24,11 @@ void FieldOperator::Field(Ref f) {} void FieldOperator::Field(const char *name, Ref f) { Field(f); } +void FieldOperator::Field(const char *name, Ref f, bool *b) { Field(name, f); } + FieldOperator& FieldOperator::operator()(const char *name, bool& b) { String x = BoolToSql(b); - Field(name, x); + Field(name, x, &b); b = SqlToBool(x); return *this; } diff --git a/uppsrc/Sql/SqlSchema.h b/uppsrc/Sql/SqlSchema.h index 802fd1c10..86f8c82d3 100644 --- a/uppsrc/Sql/SqlSchema.h +++ b/uppsrc/Sql/SqlSchema.h @@ -159,7 +159,7 @@ struct S_info_maker : FieldOperator { S_info& info; void *s; - virtual void Field(const char *name, Ref f); + virtual void Field(const char *name, Ref f, bool *b); S_info_maker(S_info& f, void *s) : info(f), s(s) {} }; diff --git a/uppsrc/Sql/Sqlexp.h b/uppsrc/Sql/Sqlexp.h index 36aa6c31d..6dd361633 100644 --- a/uppsrc/Sql/Sqlexp.h +++ b/uppsrc/Sql/Sqlexp.h @@ -23,9 +23,10 @@ struct FieldOperator { virtual void Field(Ref f); virtual void Field(const char *name, Ref f); + virtual void Field(const char *name, Ref f, bool *b); // Ugly fix to resolve bool issue with S_info creation - FieldOperator& operator()(const char *name, Ref f) { Field(name, f); return *this; } - FieldOperator& operator()(const String& name, Ref f) { Field(name, f); return *this; } + FieldOperator& operator()(const char *name, Ref f) { Field(name, f, NULL); return *this; } + FieldOperator& operator()(const String& name, Ref f) { Field(name, f, NULL); return *this; } FieldOperator& operator()(Id id, Ref f) { Field(~id, f); return *this; } FieldOperator& operator()(const char *name, bool& b); FieldOperator& operator()(const String& name, bool& b) { return (*this)(~name, b); }