[libgda] Use SQL standard reserved keywords if none set by database provider



commit a06c502ace8bf205d7a98dcced777eccdf10b4d1
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Jul 8 14:23:18 2009 +0200

    Use SQL standard reserved keywords if none set by database provider
    
    Also corrected the mkkeywordhash.c program to make all
    symbols static (generated file is #included)

 .gitignore                     |    4 ++-
 libgda/Makefile.am             |   14 +++++++++--
 libgda/gda-data-meta-wrapper.c |   11 +++++++-
 libgda/keywords.list           |   49 ++++++++++++++++++++++++++++++++++++++++
 libgda/sqlite/mkkeywordhash.c  |    6 ++--
 providers/.gitignore           |    2 -
 6 files changed, 75 insertions(+), 11 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index ed322b3..088be6c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -47,4 +47,6 @@ POTFILES
 .intltool-merge-cache
 *~
 stamp-it
-.gdb_history
\ No newline at end of file
+.gdb_history
+keywords_hash.c
+mkkeywordhash
diff --git a/libgda/Makefile.am b/libgda/Makefile.am
index ca13962..31270b5 100644
--- a/libgda/Makefile.am
+++ b/libgda/Makefile.am
@@ -27,6 +27,12 @@ gda-marshal.h: gda-marshal.list $(GLIB_GENMARSHAL)
 gda-marshal.c: gda-marshal.list $(GLIB_GENMARSHAL)
 	$(GLIB_GENMARSHAL) $< --body --prefix=_gda_marshal > $@
 
+mkkeywordhash$(EXEEXT_FOR_BUILD): $(top_srcdir)/libgda/sqlite/mkkeywordhash.c
+	$(CC_FOR_BUILD) -g -o mkkeywordhash$(EXEEXT_FOR_BUILD) $(GDA_DEBUG_FLAGS) $<
+
+keywords_hash.c: mkkeywordhash$(EXEEXT_FOR_BUILD) keywords.list
+	./mkkeywordhash$(EXEEXT_FOR_BUILD) keywords.list > keywords_hash.c
+
 gda_headers = \
 	gda-attributes-manager.h \
 	gda-batch.h \
@@ -196,7 +202,7 @@ libgda_built_headers = gda-marshal.h gda-enum-types.h
 libgda_built_cfiles = gda-enum-types.c
 
 # Don't build the library until we have built the headers that it needs:
-$(OBJECTS) $(libgda_4_0_la_OBJECTS): gda-marshal.c $(libgda_built_headers) $(libgda_built_cfiles)
+$(OBJECTS) $(libgda_4_0_la_OBJECTS): gda-marshal.c $(libgda_built_headers) $(libgda_built_cfiles) keywords_hash.c
 
 libgda_4_0_la_SOURCES = \
 	$(libgda_built_cfiles) \
@@ -248,7 +254,8 @@ CLEANFILES = $(libgda_built_headers) $(libgda_built_cfiles) \
 	gda-enum-types.c \
 	s-enum-types-c \
 	libgda.def \
-	libgda-$(GDA_ABI_VERSION).lib
+	libgda-$(GDA_ABI_VERSION).lib \
+	mkkeywordhash$(EXEEXT_FOR_BUILD) keywords_hash.c
 
 dist-hook:
 	cd $(distdir); rm -f $(libgda_built_headers) $(libgda_built_cfiles)
@@ -263,6 +270,7 @@ EXTRA_DIST = \
 	$(DTD_FILES) \
 	$(xml_DATA) \
 	gda-marshal.list \
-	libgda.symbols
+	libgda.symbols \
+	keywords.list
 
 DISTCLEANFILES  = .deps/*.P
diff --git a/libgda/gda-data-meta-wrapper.c b/libgda/gda-data-meta-wrapper.c
index 9ca8f5c..f6355b9 100644
--- a/libgda/gda-data-meta-wrapper.c
+++ b/libgda/gda-data-meta-wrapper.c
@@ -27,6 +27,7 @@
 #include <libgda/gda-enums.h>
 #include <libgda/gda-data-model.h>
 #include <libgda/sql-parser/gda-statement-struct-util.h>
+#include "keywords_hash.c" /* this one is dynamically generated */
 
 /*
  * Each value in @values may be %NULL, a valid pointer, or 0x1
@@ -160,6 +161,10 @@ gda_data_meta_wrapper_class_init (GdaDataMetaWrapperClass *klass)
 	/* virtual functions */
 	object_class->dispose = gda_data_meta_wrapper_dispose;
 	object_class->finalize = gda_data_meta_wrapper_finalize;
+
+#ifdef GDA_DEBUG
+	test_keywords ();
+#endif
 }
 
 static void
@@ -488,7 +493,8 @@ compute_value (const GValue *value, GdaSqlIdentifierStyle mode, GdaSqlReservedKe
 					onechanged = TRUE;
 				}
 
-				if (reserved_keyword_func && reserved_keyword_func (sa[i])) {
+				if ((reserved_keyword_func && reserved_keyword_func (sa[i])) ||
+				    (! reserved_keyword_func && is_keyword (sa[i]))) {
 					gchar *tmp = gda_sql_identifier_add_quotes (sa[i]);
 					g_free (sa[i]);
 					sa[i] = tmp;
@@ -511,7 +517,8 @@ compute_value (const GValue *value, GdaSqlIdentifierStyle mode, GdaSqlReservedKe
 			if (! identifier_is_all_lower (str))
 				tmp = to_lower (g_strdup (str));
 
-			if (reserved_keyword_func && reserved_keyword_func (tmp ? tmp : str)) {
+			if ((reserved_keyword_func && reserved_keyword_func (tmp ? tmp : str)) ||
+			    (! reserved_keyword_func && is_keyword (tmp ? tmp : str))) {
 				gchar *tmp2 = gda_sql_identifier_add_quotes (tmp ? tmp : str);
 				if (tmp)
 					g_free (tmp);
diff --git a/libgda/keywords.list b/libgda/keywords.list
new file mode 100644
index 0000000..4978f36
--- /dev/null
+++ b/libgda/keywords.list
@@ -0,0 +1,49 @@
+ABSOLUTE,ACTION,ADD,ALL,ALLOCATE,ALTER,AND
+ANY,ARE,AS,ASC
+ASSERTION,AT,AUTHORIZATION,AVG
+BEGIN,BETWEEN,BIT,BIT_LENGTH,BOTH,BY
+CASCADE,CASCADED,CASE,CAST,CATALOG,CHAR,CHARACTER,CHAR_
+LENGTH
+CHARACTER_LENGTH,CHECK,CLOSE,COALESCE,COLLATE,COLLATION
+COLUMN,COMMIT,CONNECT,CONNECTION,CONSTRAINT
+CONSTRAINTS,CONTINUE
+CONVERT,CORRESPONDING,COUNT,CREATE,CROSS,CURRENT
+CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_
+USER,CURSOR
+DATE,DAY,DEALLOCATE,DEC,DECIMAL,DECLARE,DEFAULT,DEFERRABLE
+DEFERRED,DELETE,DESC,DESCRIBE,DESCRIPTOR,DIAGNOSTICS
+DISCONNECT,DISTINCT,DOMAIN,DOUBLE,DROP
+ELSE,END,END-EXEC,ESCAPE,EXCEPT,EXCEPTION
+EXEC,EXECUTE,EXISTS
+EXTERNAL,EXTRACT
+FALSE,FETCH,FIRST,FLOAT,FOR,FOREIGN,FOUND,FROM,FULL
+GET,GLOBAL,GO,GOTO,GRANT,GROUP
+HAVING,HOUR
+IDENTITY,IMMEDIATE,IN,INDICATOR,INITIALLY,INNER,INPUT
+INSENSITIVE,INSERT,INT,INTEGER,INTERSECT,INTERVAL,INTO,IS
+ISOLATION
+JOIN
+KEY
+LANGUAGE,LAST,LEADING,LEFT,LEVEL,LIKE,LOCAL,LOWER
+MATCH,MAX,MIN,MINUTE,MODULE,MONTH
+NAMES,NATIONAL,NATURAL,NCHAR,NEXT,NO,NOT,NULL
+NULLIF,NUMERIC
+OCTET_LENGTH,OF,ON,ONLY,OPEN,OPTION,OR
+ORDER,OUTER
+OUTPUT,OVERLAPS
+PAD,PARTIAL,POSITION,PRECISION,PREPARE,PRESERVE,PRIMARY
+PRIOR,PRIVILEGES,PROCEDURE,PUBLIC
+READ,REAL,REFERENCES,RELATIVE,RESTRICT,REVOKE,RIGHT
+ROLLBACK,ROWS
+SCHEMA,SCROLL,SECOND,SECTION,SELECT,SESSION,SESSION_
+USER,SET
+SIZE,SMALLINT,SOME,SPACE,SQL,SQLCODE,SQLERROR,SQLSTATE
+SUBSTRING,SUM,SYSTEM_USER
+TABLE,TEMPORARY,THEN,TIME,TIMESTAMP,TIMEZONE_
+HOUR,TIMEZONE_MINUTE
+TO,TRAILING,TRANSACTION,TRANSLATE,TRANSLATION,TRIM,TRUE
+UNION,UNIQUE,UNKNOWN,UPDATE,UPPER,USAGE,USER,USING
+VALUE,VALUES,VARCHAR,VARYING,VIEW
+WHEN,WHENEVER,WHERE,WITH,WORK,WRITE
+YEAR
+ZONE
diff --git a/libgda/sqlite/mkkeywordhash.c b/libgda/sqlite/mkkeywordhash.c
index 04e6fab..94bf8c6 100644
--- a/libgda/sqlite/mkkeywordhash.c
+++ b/libgda/sqlite/mkkeywordhash.c
@@ -239,7 +239,7 @@ parse_input (const char *filename)
 
 #ifdef TEST_RESERVED_WORDS
 	int i;
-	printf ("char *keywords[] = {\n");
+	printf ("static char *keywords[] = {\n");
 	for (i = 0; i < nKeyword; i++)
 		printf ("\t\"%s\",\n", aKeywordTable [i].zName);
 	printf ("};\n");
@@ -495,12 +495,12 @@ main (int argc, char **argv)
 	printf("  }\n");
 	printf("  return 0;\n");
 	printf("}\n");
-	printf("\ngboolean\nis_keyword (const char *z)\n{\n");
+	printf("\nstatic gboolean\nis_keyword (const char *z)\n{\n");
 	printf("\treturn keywordCode(z, strlen (z));\n");
 	printf("}\n");
 
 #ifdef TEST_RESERVED_WORDS
-	printf("\nvoid\ntest_keywords (void)\n{\n");
+	printf("\nstatic void\ntest_keywords (void)\n{\n");
 	printf("\tint i;\n");
 	printf("\tfor (i = 0; i < %d; i++) {\n", nKeyword);
 	printf("\t\tif (! is_keyword (keywords[i]))\n");
diff --git a/providers/.gitignore b/providers/.gitignore
index c7ae772..ea0412c 100644
--- a/providers/.gitignore
+++ b/providers/.gitignore
@@ -3,5 +3,3 @@ parser.c
 parser.h
 gen_def
 *token_types.h
-keywords_hash.c
-mkkeywordhash



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]