]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[5096] Updated flex/bison parsers for databases
authorFrancis Dupont <fdupont@isc.org>
Tue, 10 Jan 2017 15:08:06 +0000 (16:08 +0100)
committerFrancis Dupont <fdupont@isc.org>
Tue, 10 Jan 2017 15:08:06 +0000 (16:08 +0100)
src/bin/dhcp4/dhcp4_lexer.ll
src/bin/dhcp4/dhcp4_parser.yy
src/bin/dhcp4/parser_context.cc
src/bin/dhcp4/parser_context.h
src/bin/dhcp6/dhcp6_lexer.ll
src/bin/dhcp6/dhcp6_parser.yy
src/bin/dhcp6/parser_context.cc
src/bin/dhcp6/parser_context.h

index 003fb0de86b5be9f18888672340d16e6c1be758f..82558c2f9283a2fc7cdd13bfc8461d95c2cf3e18 100644 (file)
@@ -243,6 +243,33 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"memfile\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DATABASE_TYPE:
+        return isc::dhcp::Dhcp4Parser::make_MEMFILE(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("memfile", driver.loc_);
+    }
+}
+
+\"mysql\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DATABASE_TYPE:
+        return isc::dhcp::Dhcp4Parser::make_MYSQL(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("mysql", driver.loc_);
+    }
+}
+
+\"postgresql\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::DATABASE_TYPE:
+        return isc::dhcp::Dhcp4Parser::make_POSTGRESQL(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("postgresql", driver.loc_);
+    }
+}
+
 \"user\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::LEASE_DATABASE:
@@ -293,6 +320,16 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"connect-timeout\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::LEASE_DATABASE:
+    case isc::dhcp::Parser4Context::HOSTS_DATABASE:
+        return isc::dhcp::Dhcp4Parser::make_CONNECT_TIMEOUT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("connect-timeout", driver.loc_);
+    }
+}
+
 \"valid-lifetime\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::DHCP4:
index 3c1a4d9179173dadf681a485851070cc96dd7fdd..ebc785af966be9e6d45ab4d520d709a4b2682793 100644 (file)
@@ -63,12 +63,16 @@ using namespace std;
   LEASE_DATABASE "lease-database"
   HOSTS_DATABASE "hosts-database"
   TYPE "type"
+  MEMFILE "memfile"
+  MYSQL "mysql"
+  POSTGRESQL "postgresql"
   USER "user"
   PASSWORD "password"
   HOST "host"
   PERSIST "persist"
   LFC_INTERVAL "lfc-interval"
   READONLY "readonly"
+  CONNECT_TIMEOUT "connect-timeout"
 
   VALID_LIFETIME "valid-lifetime"
   RENEW_TIMER "renew-timer"
@@ -179,6 +183,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> db_type
 
 %printer { yyoutput << $$; } <*>;
 
@@ -476,17 +481,22 @@ database_map_param: database_type
                   | persist
                   | lfc_interval
                   | readonly
+                  | connect_timeout
                   | unknown_map_entry
 ;
 
 database_type: TYPE {
-    ctx.enter(ctx.NO_KEYWORD);
-} COLON STRING {
-    ElementPtr prf(new StringElement($4, ctx.loc2pos(@4)));
-    ctx.stack_.back()->set("type", prf);
+    ctx.enter(ctx.DATABASE_TYPE);
+} COLON db_type {
+    ctx.stack_.back()->set("type", $4);
     ctx.leave();
 };
 
+db_type: MEMFILE { $$ = ElementPtr(new StringElement("memfile", ctx.loc2pos(@1))); }
+       | MYSQL { $$ = ElementPtr(new StringElement("mysql", ctx.loc2pos(@1))); }
+       | POSTGRESQL { $$ = ElementPtr(new StringElement("postgresql", ctx.loc2pos(@1))); }
+       ;
+
 user: USER {
     ctx.enter(ctx.NO_KEYWORD);
 } COLON STRING {
@@ -534,9 +544,9 @@ readonly: READONLY COLON BOOLEAN {
     ctx.stack_.back()->set("readonly", n);
 };
 
-duid_id : DUID {
-    ElementPtr duid(new StringElement("duid", ctx.loc2pos(@1)));
-    ctx.stack_.back()->add(duid);
+connect_timeout: CONNECT_TIMEOUT COLON INTEGER {
+    ElementPtr n(new IntElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("connect-timeout", n);
 };
 
 host_reservation_identifiers: HOST_RESERVATION_IDENTIFIERS {
@@ -559,6 +569,11 @@ host_reservation_identifier: duid_id
                            | client_id
                            ;
 
+duid_id : DUID {
+    ElementPtr duid(new StringElement("duid", ctx.loc2pos(@1)));
+    ctx.stack_.back()->add(duid);
+};
+
 hw_address_id : HW_ADDRESS {
     ElementPtr hwaddr(new StringElement("hw-address", ctx.loc2pos(@1)));
     ctx.stack_.back()->add(hwaddr);
index 909e6e5192f38884b485bdf9400330ef7dd63c3d..c87b0a3ebd165edabfd145b3905d67ef444e3956 100644 (file)
@@ -131,6 +131,8 @@ Parser4Context::contextName()
         return ("lease-database");
     case HOSTS_DATABASE:
         return ("hosts-database");
+    case DATABASE_TYPE:
+        return ("database-type");
     case HOST_RESERVATION_IDENTIFIERS:
         return ("host-reservation-identifiers");
     case HOOKS_LIBRARIES:
index 2a3ae9ec273f5bbf60f2ff78cc9d4805f3080ce6..329062d86327bb8b157dc02ec858022e5e677ee6 100644 (file)
@@ -199,6 +199,9 @@ public:
         /// Used while parsing Dhcp4/hosts-database structures.
         HOSTS_DATABASE,
 
+        /// Used while parsing Dhcp4/*-database/type.
+        DATABASE_TYPE,
+
         /// Used while parsing Dhcp4/host-reservation-identifiers.
         HOST_RESERVATION_IDENTIFIERS,
 
index 340cc20caee23247ffcace98c679e2bd4a03acfa..5d2d2b5752d7071c7cc393859c48a77835d73344 100644 (file)
@@ -237,6 +237,33 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"memfile\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::DATABASE_TYPE:
+        return isc::dhcp::Dhcp6Parser::make_MEMFILE(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("memfile", driver.loc_);
+    }
+}
+
+\"mysql\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::DATABASE_TYPE:
+        return isc::dhcp::Dhcp6Parser::make_MYSQL(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("mysql", driver.loc_);
+    }
+}
+
+\"postgresql\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::DATABASE_TYPE:
+        return isc::dhcp::Dhcp6Parser::make_POSTGRESQL(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("postgresql", driver.loc_);
+    }
+}
+
 \"user\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::LEASE_DATABASE:
@@ -288,6 +315,16 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"connect-timeout\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::LEASE_DATABASE:
+    case isc::dhcp::Parser6Context::HOSTS_DATABASE:
+        return isc::dhcp::Dhcp6Parser::make_CONNECT_TIMEOUT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("connect-timeout", driver.loc_);
+    }
+}
+
 \"preferred-lifetime\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::DHCP6:
index 32548f43ae74d3e23e42737ab8fcfb0af2fa8b4c..f93d62788bafb441e590800bb77bd6efe5e42fa5 100644 (file)
@@ -56,12 +56,16 @@ using namespace std;
   LEASE_DATABASE "lease-database"
   HOSTS_DATABASE "hosts-database"
   TYPE "type"
+  MEMFILE "memfile"
+  MYSQL "mysql"
+  POSTGRESQL "postgresql"
   USER "user"
   PASSWORD "password"
   HOST "host"
   PERSIST "persist"
   LFC_INTERVAL "lfc-interval"
   READONLY "readonly"
+  CONNECT_TIMEOUT "connect-timeout"
 
   PREFERRED_LIFETIME "preferred-lifetime"
   VALID_LIFETIME "valid-lifetime"
@@ -188,6 +192,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> db_type
 %type <ElementPtr> duid_type
 
 %printer { yyoutput << $$; } <*>;
@@ -466,17 +471,22 @@ database_map_param: database_type
                   | persist
                   | lfc_interval
                   | readonly
+                  | connect_timeout
                   | unknown_map_entry
 ;
 
 database_type: TYPE {
-    ctx.enter(ctx.NO_KEYWORD);
-} COLON STRING {
-    ElementPtr prf(new StringElement($4, ctx.loc2pos(@4)));
-    ctx.stack_.back()->set("type", prf);
+    ctx.enter(ctx.DATABASE_TYPE);
+} COLON db_type {
+    ctx.stack_.back()->set("type", $4);
     ctx.leave();
 };
 
+db_type: MEMFILE { $$ = ElementPtr(new StringElement("memfile", ctx.loc2pos(@1))); }
+       | MYSQL { $$ = ElementPtr(new StringElement("mysql", ctx.loc2pos(@1))); }
+       | POSTGRESQL { $$ = ElementPtr(new StringElement("postgresql", ctx.loc2pos(@1))); }
+       ;
+
 user: USER {
     ctx.enter(ctx.NO_KEYWORD);
 } COLON STRING {
@@ -524,6 +534,11 @@ readonly: READONLY COLON BOOLEAN {
     ctx.stack_.back()->set("readonly", n);
 };
 
+connect_timeout: CONNECT_TIMEOUT COLON INTEGER {
+    ElementPtr n(new IntElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("connect-timeout", n);
+};
+
 mac_sources: MAC_SOURCES {
     ElementPtr l(new ListElement(ctx.loc2pos(@1)));
     ctx.stack_.back()->set("mac-sources", l);
index 8b1687711f04ebf68ad84228eaa2e6804e35e5de..961d48b982acac8ad7634da46b6704bb52a1f84b 100644 (file)
@@ -131,6 +131,8 @@ Parser6Context::contextName()
         return ("lease-database");
     case HOSTS_DATABASE:
         return ("hosts-database");
+    case DATABASE_TYPE:
+        return ("database-type");
     case MAC_SOURCES:
         return ("mac-sources");
     case HOST_RESERVATION_IDENTIFIERS:
index 1e10fca2afca0fafd21152888573f06be7869bd7..ded4bd5d508e39e00396cdaae032c5f499d8293b 100644 (file)
@@ -202,6 +202,9 @@ public:
         /// Used while parsing Dhcp6/hosts-database structures.
         HOSTS_DATABASE,
 
+        /// Used while parsing Dhcp6/*-database/type.
+        DATABASE_TYPE,
+
         /// Used while parsing Dhcp6/mac-sources structures.
         MAC_SOURCES,