Sql: SQL_RENAME second try...

git-svn-id: svn://ultimatepp.org/upp/trunk@13963 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2020-02-01 10:49:50 +00:00
parent 74154d9dab
commit 3a70bbf65c
11 changed files with 96 additions and 75 deletions

View file

@ -19,14 +19,18 @@ ArrayMap<String, SchTableInfo>& sSchTableInfo()
return x;
}
static bool sColumn;
void SchDbInfoTable(const char *table)
{
sSchTableInfo().GetAdd(table).is_table = true;
sSchTableInfo().Add(table).is_table = true;
sColumn = false;
}
void SchDbInfoType(const char *table)
{
sSchTableInfo().GetAdd(table).is_table = false;
sSchTableInfo().Add(table).is_table = false;
sColumn = false;
}
void SchDbInfoColumn(const char *name)
@ -37,6 +41,7 @@ void SchDbInfoColumn(const char *name)
f.ref_column.Add();
if(IsNull(f.primary_key))
f.primary_key = name;
sColumn = true;
}
void SchDbInfoVar(void (*fn)(), const char *name)

View file

@ -53,21 +53,6 @@ String SqlId::Quoted() const
return id.ToString();
}
static SqlId *sLastSqlId;
SqlId::SqlId() { sLastSqlId = this; }
SqlId::SqlId(const char *s) : id(s) { sLastSqlId = this; }
SqlId::SqlId(const String& s) : id(s) { sLastSqlId = this; }
SqlId::SqlId(const Id& id) : id(id) { sLastSqlId = this; }
void SqlId::RenameLast(const char *s)
{
if(sLastSqlId) {
SqlId *h = sLastSqlId;
*h = s;
}
}
void SqlCompile(const char *&s, StringBuffer *r, byte dialect, Vector<SqlVal> *split)
{
char quote = dialect == MY_SQL ? '`' : '\"';

View file

@ -219,4 +219,29 @@ void operator*(SqlSchema& schema, const SqlInsert& insert) {
<< ";\n";
}
VectorMap<String, String>& sSqlRename()
{
static VectorMap<String, String> x;
return x;
}
const char *RegSqlName__;
void SqlRename__(const char *name)
{
static auto& rename = sSqlRename();
if(RegSqlName__)
rename.Add(RegSqlName__, name);
RegSqlName__ = NULL;
}
const char *SqlResolveId__(const char *id)
{
static auto& rename = sSqlRename();
int q;
if(rename.GetCount() && (q = rename.Find(id)) >= 0)
return rename[q];
return id; // cannot be conditional expression as we are returning const char * !
}
};

View file

@ -225,3 +225,15 @@ struct S_type {
S_type(const ValueMap& m);
};
#endif
// support for SQL_RENAME
extern const char *RegSqlName__;
struct RegSqlId__ {
RegSqlId__(const char *name) { RegSqlName__ = name; }
};
void SqlRename__(const char *name);
const char *SqlResolveId__(const char *id);

View file

@ -140,7 +140,7 @@ public:
SqlId operator()(SqlId p) const;
SqlId operator()(const S_info& table) const;
//$-SqlId operator()(SqlId p, SqlId p1, ...);
#define E__PutSqlId(I) PutOf(x, p##I)
#define E__SqlId(I) const SqlId& p##I
@ -156,12 +156,10 @@ __Expand(E__Of)
#undef E__PutSqlId
#undef E__SqlId
//$+
SqlId();
SqlId(const char *s);
SqlId(const String& s);
SqlId(const Id& id);
static void RenameLast(const char *s); // to support SQL_RENAME command
SqlId() {}
SqlId(const char *s) : id(s) {}
SqlId(const String& s) : id(s) {}
SqlId(const Id& id) : id(id) {}
};
typedef SqlId SqlCol; // Deprecated

View file

@ -8,7 +8,7 @@ private: \
static const S_info *info; \
\
public: \
static const char TableName[]; \
static String TableName; \
static const SqlSet& ColumnSet() { return GetInfo().set; } \
static SqlSet ColumnSet(const String& prefix) { return GetInfo().GetSet(prefix); } \
static SqlSet Of(SqlId table) { return GetInfo().GetOf(table); } \
@ -64,6 +64,8 @@ static SqlId colid_##name;
#define END_TYPE };
#define SQL_NAME(x)
#include SCHEMADIALECT
#undef CODETYPE
@ -72,7 +74,8 @@ static SqlId colid_##name;
// SqlId
#define DOID(x) extern SqlId ADD_SCHEMA_PREFIX_CPP(x);
//#define DOID(x) extern SqlId x;
#define DOID(x) extern SqlId ADD_SCHEMA_PREFIX_CPP(x);
#define SQL_NAME(x)
#include SCHEMADIALECT

View file

@ -160,11 +160,13 @@
#endif
#ifndef SQL_NAME
#define SQL_NAME(id)
#define SQL_NAME(x)
#endif
#include MODEL
#undef SQL_NAME
#undef __NIL
#undef STAMP
@ -200,4 +202,3 @@
#undef SCHEMA
#undef CONFIG
#undef UPGRADE
#undef SQL_NAME

View file

@ -1,9 +1,8 @@
// SCHEMA
#define VAR(type, x) schema.Var(SCHEMA_##type, #x);
#define COLUMN(type, ctype, name, width, prec) schema.Column(type, #name);
#define COLUMN_ARRAY(type, ctype, name, width, prec, items) schema.ColumnArray(type, #name, items);
#define SQL_NAME(name) schema.SqlName(name);
#define VAR(type, x) schema.Var(SCHEMA_##type, SqlResolveId__(#x));
#define COLUMN(type, ctype, name, width, prec) schema.Column(type, SqlResolveId__(#name));
#define COLUMN_ARRAY(type, ctype, name, width, prec, items) schema.ColumnArray(type, SqlResolveId__(#name), items);
#define INLINE_ATTRIBUTE(x) schema.InlineAttribute(x);
#define ATTRIBUTE(x, d) schema.Attribute(x, d);
#define TABLE_SUFFIX(s) schema.TableSuffix(s);
@ -37,7 +36,7 @@ TYPE_II(x, b1, b2) SCHEMA_##b3(schema);
// TABLE
#define TABLE(x)\
void TABLE_##x(SqlSchema& schema) { schema.Table(#x); SCHEMA_##x(schema); schema.EndTable(); }
void TABLE_##x(SqlSchema& schema) { schema.Table(SqlResolveId__(#x)); SCHEMA_##x(schema); schema.EndTable(); }
#define TABLE_I(x, b) TABLE(x)
#define TABLE_II(x, b1, b2) TABLE(x)

View file

@ -1,8 +1,14 @@
// SqlId renaming table
#define DOID(x) RegSqlId__ x##_rgs_(#x);
#define SQL_NAME(x) INITBLOCK { SqlRename__(x); }
#include SCHEMADIALECT
// SqlId
#define DOID(x) SqlId ADD_SCHEMA_PREFIX_CPP(x)(#x);
#define SQL_NAME(x) INITBLOCK { SqlId::RenameLast(x); }
#include SCHEMADIALECT
#define DOID(x) SqlId ADD_SCHEMA_PREFIX_CPP(x)(SqlResolveId__(#x));
//#define DOID(x) SqlId x(#x);
#include SCHEMADIALECT
@ -50,10 +56,10 @@ void S_##x::Clear() { S_##b1::Clear(); S_##b2::Clear(); S_##b3::Clear();
// TableName, FieldLayout and GetInfo
#define TYPE(x) \
const char S_##x::TableName[] = #x; \
String S_##x::TableName = SqlResolveId__(#x); \
\
void S_##x::FieldLayout(FieldOperator& fo) {\
fo.Table(#x);\
fo.Table(SqlResolveId__(#x));\
FieldLayoutRaw(fo);\
} \
\
@ -72,47 +78,34 @@ const S_info& S_##x::GetInfo() {\
#include SCHEMADIALECT
// FieldLayoutRawFn - needed because of SqlId scope, which is used because of SQL_NAME
#define TYPE(x) \
void FieldLayout_##x(S_##x& s, FieldOperator& fo, const String& prefix) {
#define COLUMN(type, ctype, name, width, prec) fo(~ADD_SCHEMA_PREFIX_CPP(name), s.ADD_SCHEMA_PREFIX_CPP(name)), fo.Width(width);
#define COLUMN_ARRAY(type, ctype, name, width, prec, items) \
{ \
for(int i = 0; i < items; i++)\
fo(Format("%s%s%d", ~prefix, ~ADD_SCHEMA_PREFIX_CPP(name), i), s.ADD_SCHEMA_PREFIX_CPP(name)[i]), fo.Width(width); \
}
#define VAR(type, x) s.x.FieldLayoutRaw(fo, prefix + #x + "$");
#define END_TYPE }
#include SCHEMADIALECT
// FieldLayoutRaw
#define TYPE(x) \
void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {\
FieldLayout_##x(*this, fo, prefix);
void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {
#define TYPE_I(x, b) \
void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {\
S_##b::FieldLayoutRaw(fo, prefix);\
FieldLayout_##x(*this, fo, prefix);
S_##b::FieldLayoutRaw(fo, prefix);
#define TYPE_II(x, b1, b2) \
void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {\
S_##b1::FieldLayoutRaw(fo, prefix);\
S_##b2::FieldLayoutRaw(fo, prefix);\
FieldLayout_##x(*this, fo, prefix);
S_##b2::FieldLayoutRaw(fo, prefix);
#define TYPE_III(x, b1, b2, b3) \
void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {\
S_##b1::FieldLayoutRaw(fo, prefix);\
S_##b2::FieldLayoutRaw(fo, prefix);\
S_##b3::FieldLayoutRaw(fo, prefix);\
FieldLayout_##x(*this, fo, prefix);
S_##b3::FieldLayoutRaw(fo, prefix);
#define COLUMN(type, ctype, name, width, prec) fo(prefix + SqlResolveId__(#name), ADD_SCHEMA_PREFIX_CPP(name)), fo.Width(width);
#define COLUMN_ARRAY(type, ctype, name, width, prec, items) \
{ \
for(int i = 0; i < items; i++)\
fo(Format("%s%s%d", ~prefix, SqlResolveId__(#name), i), ADD_SCHEMA_PREFIX_CPP(name)[i]), fo.Width(width); \
}
#define VAR(type, x) x.FieldLayoutRaw(fo, prefix + #x + "$");
#define END_TYPE }
@ -124,14 +117,14 @@ void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {\
#define TYPE_I(x, b) void SchDbInfo##x() { SchDbInfo##b();
#define TYPE_II(x, b1, b2) void SchDbInfo##x() { SchDbInfo##b1(); SchDbInfo##b2();
#define TYPE_III(x, b1, b2, b3) void SchDbInfo##x() { SchDbInfo##b1(); SchDbInfo##b2(); SchDbInfo##b3();
#define COLUMN(type, ctype, name, width, prec) SchDbInfoColumn(~ADD_SCHEMA_PREFIX_CPP(name));
#define VAR(type, name) SchDbInfoVar(SchDbInfo##type, ~ADD_SCHEMA_PREFIX_CPP(name));
#define REFERENCES(table) SchDbInfoReferences(#table);
#define REFERENCES_CASCADE(table) SchDbInfoReferences(#table);
#define REFERENCES_(table, column) SchDbInfoReferences(#table, ~ADD_SCHEMA_PREFIX_CPP(name));
#define REFERENCES_CASCADE_(table, column) SchDbInfoReferences(#table, ~ADD_SCHEMA_PREFIX_CPP(name));
#define COLUMN(type, ctype, name, width, prec) SchDbInfoColumn(SqlResolveId__(#name));
#define VAR(type, name) SchDbInfoVar(SchDbInfo##type, SqlResolveId__(#name));
#define REFERENCES(table) SchDbInfoReferences(SqlResolveId__(#table));
#define REFERENCES_CASCADE(table) SchDbInfoReferences(SqlResolveId__(#table));
#define REFERENCES_(table, column) SchDbInfoReferences(SqlResolveId__(#table), SqlResolveId__(#column));
#define REFERENCES_CASCADE_(table, column) SchDbInfoReferences(SqlResolveId__(#table), SqlResolveId__(#column));
#define PRIMARY_KEY SchDbInfoPrimaryKey();
#define COLUMN_ARRAY(type, ctype, name, width, prec, items) SchDbInfoColumnArray(~ADD_SCHEMA_PREFIX_CPP(name), items);
#define COLUMN_ARRAY(type, ctype, name, width, prec, items) SchDbInfoColumnArray(SqlResolveId__(#name), items);
#define END_TYPE }
#include SCHEMADIALECT
@ -143,7 +136,7 @@ void S_##x::FieldLayoutRaw(FieldOperator& fo, const String& prefix) {\
#define TYPE_III(x, b1, b2, b3) TYPE(x)
#define TABLE(x) struct SINS_##x##_ { SINS_##x##_(); } SINS_##x##__; SINS_##x##_::SINS_##x##_() {\
SchDbInfoTable(~ADD_SCHEMA_PREFIX_CPP(x)); SchDbInfo##x();
SchDbInfoTable(SqlResolveId__(#x)); SchDbInfo##x();
#define TABLE_I(x, b) TABLE(x)
#define TABLE_II(x, b1, b2) TABLE(x)
#define TABLE_III(x, b1, b2, b3) TABLE(x)

View file

@ -42,7 +42,7 @@ is not using any SQL engine array capabilities but rather inserts
array size count of items with special names to emulate the fixed
array.]&]
[s0;3 &]
[s0; [3 List of .sch file `"keywords`"]&]
[s0; [3 List of .sch file keywords:]&]
[s0;3 &]
[ {{5007:4993^ [s0; [* TABLE(][*/ table][* )]]
:: [s0; Defines a new table. This creates S`_ structures to map SQL

View file

@ -84,7 +84,7 @@ bool Ide::FindLineError(const String& ln, FindLineErrorCache& cache, ErrorInfo&
const char *ms = p.GetPtr();
if(ln.Find(": warning") >= 0)
f.kind = 2;
else if(ln.Find(": error") >= 0)
else if(ln.Find(": error") >= 0 || ln.Find(": fatal error") >= 0)
f.kind = 1;
else
f.kind = 3;