From 79226efa5e1eb799191b7e334de5be0ca8aed5d6 Mon Sep 17 00:00:00 2001 From: cxl Date: Mon, 26 Dec 2011 10:38:19 +0000 Subject: [PATCH] Sql: GetSchColumn now guaranteed to be uppercase git-svn-id: svn://ultimatepp.org/upp/trunk@4345 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/Sql/IntroSch.cpp | 266 ++++++++++++++++++------------------- uppsrc/Sql/Sql.cpp | 2 - uppsrc/SqlCtrl/SqlCtrl.cpp | 2 - uppsrc/SqlCtrl/SqlDlg.cpp | 4 +- 4 files changed, 135 insertions(+), 139 deletions(-) diff --git a/uppsrc/Sql/IntroSch.cpp b/uppsrc/Sql/IntroSch.cpp index 522e078f6..966c676ab 100644 --- a/uppsrc/Sql/IntroSch.cpp +++ b/uppsrc/Sql/IntroSch.cpp @@ -1,133 +1,133 @@ -#include "Sql.h" - -NAMESPACE_UPP - - -struct SchTableInfo { - Vector column; - Vector ref_table; - Vector ref_column; - String primary_key; - String prefix; -}; - -ArrayMap& sSchTableInfo() -{ - static ArrayMap x; - return x; -} - -void SchDbInfoTable(const char *table) -{ - sSchTableInfo().GetAdd(table); -} - -void SchDbInfoColumn(const char *name) -{ - SchTableInfo& f = sSchTableInfo().Top(); - f.column.Add(f.prefix + name); - f.ref_table.Add(); - f.ref_column.Add(); - if(IsNull(f.primary_key)) - f.primary_key = name; -} - -void SchDbInfoVar(void (*fn)(), const char *name) -{ - SchTableInfo& f = sSchTableInfo().Top(); - String h = f.prefix; - f.prefix << name << '$'; - (*fn)(); - f.prefix = h; -} - -void SchDbInfoReferences(const char *table) -{ - sSchTableInfo().Top().ref_table.Top() = table; -} - -void SchDbInfoReferences(const char *table, const char *column) -{ - SchDbInfoReferences(table); - sSchTableInfo().Top().ref_column.Top() = column; -} - -void SchDbInfoPrimaryKey() -{ - SchTableInfo& f = sSchTableInfo().Top(); - f.primary_key = f.column.Top(); -} - -void SchDbInfoColumnArray(const char *name, int items) -{ - for(int i = 0; i < items; i++) - SchDbInfoColumn(String().Cat() << name << i); -} - -const SchTableInfo& GetSchTableInfo(const String& table) -{ - static SchTableInfo sSchTableInfoZero; - return sSchTableInfo().Get(~table, sSchTableInfoZero); -} - -SqlBool Join(const String& tab1, const String& as1, const String& tab2, const String& as2) -{ - const SchTableInfo& t1 = GetSchTableInfo(tab1); - const SchTableInfo& t2 = GetSchTableInfo(tab2); - for(int i = 0; i < t1.ref_table.GetCount(); i++) - if(t1.ref_table[i] == tab2) - return SqlId(t1.column[i]).Of(SqlId(as1)) == SqlId(t2.primary_key).Of(SqlId(as2)); - for(int i = 0; i < t2.ref_table.GetCount(); i++) - if(t2.ref_table[i] == tab1) - return SqlId(t2.column[i]).Of(SqlId(as1)) == SqlId(t1.primary_key).Of(SqlId(as2)); - return SqlBool::False(); -} - -int sChrf(int c) -{ - return c < 32 ? ' ' : c; -} - -StaticMutex sM; - -Vector GetSchColumns(const String& table) -{ - Mutex::Lock __(sM); - return Vector(GetSchTableInfo(table).column, 0); -} - -SqlBool FindSchJoin(const String& tables) -{ - Mutex::Lock __(sM); - static VectorMap cache; - if(cache.GetCount() > 20000) // Defend against unlikely dynamic Join permutations - cache.Clear(); - int q = cache.Find(tables); - if(q >= 0) - return cache[q]; - Vector s = Split(Filter(tables, sChrf), ','); - Vector as; - Vector table; - for(int i = 0; i < s.GetCount(); i++) { - Vector ss = Split(s[i], ' '); - if(ss.GetCount()) { - table.Add(ss[0]); - as.Add(ss.Top()); - } - } - if(table.GetCount() >= 2) { - String tab1 = table.Top(); - String as1 = as.Top(); - for(int i = 0; i < table.GetCount() - 1; i++) { - SqlBool b = Join(tab1, as1, table[i], as[i]); - if(!b.IsFalse()) { - cache.Add(tables, b); - return b; - } - } - } - NEVER_("Schema join not found"); - return SqlBool::False(); -} - -END_UPP_NAMESPACE +#include "Sql.h" + +NAMESPACE_UPP + + +struct SchTableInfo { + Vector column; + Vector ref_table; + Vector ref_column; + String primary_key; + String prefix; +}; + +ArrayMap& sSchTableInfo() +{ + static ArrayMap x; + return x; +} + +void SchDbInfoTable(const char *table) +{ + sSchTableInfo().GetAdd(table); +} + +void SchDbInfoColumn(const char *name) +{ + SchTableInfo& f = sSchTableInfo().Top(); + f.column.Add(ToUpper(f.prefix + name)); + f.ref_table.Add(); + f.ref_column.Add(); + if(IsNull(f.primary_key)) + f.primary_key = name; +} + +void SchDbInfoVar(void (*fn)(), const char *name) +{ + SchTableInfo& f = sSchTableInfo().Top(); + String h = f.prefix; + f.prefix << name << '$'; + (*fn)(); + f.prefix = h; +} + +void SchDbInfoReferences(const char *table) +{ + sSchTableInfo().Top().ref_table.Top() = table; +} + +void SchDbInfoReferences(const char *table, const char *column) +{ + SchDbInfoReferences(table); + sSchTableInfo().Top().ref_column.Top() = column; +} + +void SchDbInfoPrimaryKey() +{ + SchTableInfo& f = sSchTableInfo().Top(); + f.primary_key = f.column.Top(); +} + +void SchDbInfoColumnArray(const char *name, int items) +{ + for(int i = 0; i < items; i++) + SchDbInfoColumn(String().Cat() << name << i); +} + +const SchTableInfo& GetSchTableInfo(const String& table) +{ + static SchTableInfo sSchTableInfoZero; + return sSchTableInfo().Get(~table, sSchTableInfoZero); +} + +SqlBool Join(const String& tab1, const String& as1, const String& tab2, const String& as2) +{ + const SchTableInfo& t1 = GetSchTableInfo(tab1); + const SchTableInfo& t2 = GetSchTableInfo(tab2); + for(int i = 0; i < t1.ref_table.GetCount(); i++) + if(t1.ref_table[i] == tab2) + return SqlId(t1.column[i]).Of(SqlId(as1)) == SqlId(t2.primary_key).Of(SqlId(as2)); + for(int i = 0; i < t2.ref_table.GetCount(); i++) + if(t2.ref_table[i] == tab1) + return SqlId(t2.column[i]).Of(SqlId(as1)) == SqlId(t1.primary_key).Of(SqlId(as2)); + return SqlBool::False(); +} + +int sChrf(int c) +{ + return c < 32 ? ' ' : c; +} + +StaticMutex sM; + +Vector GetSchColumns(const String& table) +{ + Mutex::Lock __(sM); + return Vector(GetSchTableInfo(table).column, 0); +} + +SqlBool FindSchJoin(const String& tables) +{ + Mutex::Lock __(sM); + static VectorMap cache; + if(cache.GetCount() > 20000) // Defend against unlikely dynamic Join permutations + cache.Clear(); + int q = cache.Find(tables); + if(q >= 0) + return cache[q]; + Vector s = Split(Filter(tables, sChrf), ','); + Vector as; + Vector table; + for(int i = 0; i < s.GetCount(); i++) { + Vector ss = Split(s[i], ' '); + if(ss.GetCount()) { + table.Add(ss[0]); + as.Add(ss.Top()); + } + } + if(table.GetCount() >= 2) { + String tab1 = table.Top(); + String as1 = as.Top(); + for(int i = 0; i < table.GetCount() - 1; i++) { + SqlBool b = Join(tab1, as1, table[i], as[i]); + if(!b.IsFalse()) { + cache.Add(tables, b); + return b; + } + } + } + NEVER_("Schema join not found"); + return SqlBool::False(); +} + +END_UPP_NAMESPACE diff --git a/uppsrc/Sql/Sql.cpp b/uppsrc/Sql/Sql.cpp index a63796cc6..8953fdb29 100644 --- a/uppsrc/Sql/Sql.cpp +++ b/uppsrc/Sql/Sql.cpp @@ -286,7 +286,6 @@ bool Sql::Fetch(ValueMap& row) { } struct sReadFields : public FieldOperator { - int pi; Sql *sql; void Field(const char *name, Ref f) { @@ -298,7 +297,6 @@ void Sql::Get(Fields fo) { sReadFields ff; ff.sql = this; - ff.pi = 0; fo(ff); } diff --git a/uppsrc/SqlCtrl/SqlCtrl.cpp b/uppsrc/SqlCtrl/SqlCtrl.cpp index 6e8733305..ab7a0cdfd 100644 --- a/uppsrc/SqlCtrl/SqlCtrl.cpp +++ b/uppsrc/SqlCtrl/SqlCtrl.cpp @@ -69,8 +69,6 @@ void SqlCtrls::Add(SqlId id, Ctrl& ctrl) { void SqlCtrls::Table(Ctrl& dlg, SqlId table) { Vector col = GetSchColumns(~table); - for(int i = 0; i < col.GetCount(); i++) - col[i] = ToUpper(col[i]); for(Ctrl *q = dlg.GetFirstChild(); q; q = q->GetNext()) { String id = ToUpper(q->GetLayoutId()); if(!dynamic_cast