Index: trunk/psLib/src/db/psDB.c
===================================================================
--- trunk/psLib/src/db/psDB.c	(revision 12431)
+++ trunk/psLib/src/db/psDB.c	(revision 12552)
@@ -12,6 +12,6 @@
  *  @author Joshua Hoblitt
  *
- *  @version $Revision: 1.140 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2007-03-14 00:39:50 $
+ *  @version $Revision: 1.141 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2007-03-22 22:48:34 $
  *
  *  Copyright (C) 2005-2006  Joshua Hoblitt, University of Hawaii
@@ -33,4 +33,6 @@
 #include <math.h>
 #include <inttypes.h>
+#include <sys/types.h>
+#include <regex.h>
 #include <mysql.h>
 #include <mysql_com.h> // enum_field_types
@@ -1583,4 +1585,75 @@
     }
 
+    // Reset iterator to head of list
+    psListIteratorSet(cursor, 0);
+    // look for foreign keys after all other key types
+    while ((item = psListGetAndIncrement(cursor))) {
+        // don't compile a regex unless we have too
+        if (strcasestr(item->comment, "FKEY") == NULL) {
+            continue;
+        }
+        // find foreign key and references
+        regex_t         myregex;
+        regmatch_t      mymatch[3];     // match + 2 sub strings
+        int             errbuf_size = 1024;
+        char            errbuf[errbuf_size];
+        char            *pattern = "FKEY(.*)[:space:]*REF(.*)";
+
+        int status = regcomp(&myregex, pattern, REG_EXTENDED|REG_ICASE);
+        if (status != 0) {
+            regerror(status, &myregex, errbuf, errbuf_size);
+            psError(PS_ERR_UNKNOWN, true, "regcomp() failed: %s", errbuf);
+            psFree(query);
+            psFree(cursor);
+            return NULL;
+        }
+        
+        psTrace("psLib.db", 10, "trying regex pattern: %s against string: %s", pattern, item->comment);
+        status = regexec(&myregex, item->comment, 3, mymatch, 0);
+        if (status != 0) {
+            regerror(status, &myregex, errbuf, errbuf_size);
+            psError(PS_ERR_UNKNOWN, true, "regexec() failed: %s", errbuf);
+            psFree(query);
+            psFree(cursor);
+            return NULL;
+        }
+        
+        regfree(&myregex);
+
+        // sub string 1: foreign(.*)
+        size_t matchStart = (size_t)mymatch[1].rm_so;
+        size_t matchEnd   = (size_t)mymatch[1].rm_eo;
+        size_t matchLength = matchEnd - matchStart;
+
+        if (matchStart == -1) {
+            psError(PS_ERR_UNKNOWN, true, "substring 1 failed to match");
+            psFree(query);
+            psFree(cursor);
+            return NULL;
+        }
+
+        psString fkey = psStringNCopy(item->comment + matchStart, matchLength);
+        psTrace("psLib.db", 10, "regex $1 matched: %s", fkey);
+        psStringAppend(&query, ", FOREIGN KEY %s", fkey);
+        psFree(fkey);
+
+        // sub string 2: references(.*)
+        matchStart = (size_t)mymatch[2].rm_so;
+        matchEnd   = (size_t)mymatch[2].rm_eo;
+        matchLength = matchEnd - matchStart;
+
+        if (matchStart == -1) {
+            psError(PS_ERR_UNKNOWN, true, "substring 2 failed to match");
+            psFree(query);
+            psFree(cursor);
+            return NULL;
+        }
+
+        psString refs = psStringNCopy(item->comment + matchStart, matchLength);
+        psTrace("psLib.db", 10, "regex $2 matched: %s", refs);
+        psStringAppend(&query, " REFERENCES %s", refs);
+        psFree(refs);
+    }
+
     psFree(cursor);
 
