Fixed newline characters throughout the code
[com/gs-lite.git] / src / ftacmp / schemaparser.cc
index ceb16eb..246aae3 100644 (file)
-/* ------------------------------------------------\r
-Copyright 2014 AT&T Intellectual Property\r
-   Licensed under the Apache License, Version 2.0 (the "License");\r
-   you may not use this file except in compliance with the License.\r
-   You may obtain a copy of the License at\r
-\r
-     http://www.apache.org/licenses/LICENSE-2.0\r
-\r
-   Unless required by applicable law or agreed to in writing, software\r
-   distributed under the License is distributed on an "AS IS" BASIS,\r
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-   See the License for the specific language governing permissions and\r
-   limitations under the License.\r
- ------------------------------------------- */\r
-\r
-#include"schemaparser_impl.h"\r
-#include"schemaparser.h"\r
-#include <string>\r
-#include "parse_fta.h"\r
-#include "parse_schema.h"\r
-#include"generate_utils.h"\r
-\r
-#include"host_tuple.h"\r
-#include"lapp.h"\r
-\r
-#include <stdlib.h>\r
-#include <stdio.h>\r
-#include <string.h>\r
-\r
-\r
-//             Interface to FTA definition lexer and parser ...\r
-\r
-extern int FtaParserparse(void);\r
-extern FILE *FtaParserin;\r
-extern int FtaParserdebug;\r
-\r
-//                     This will need to be moved to a parse_fta.cc file.\r
-fta_parse_t *fta_parse_result;\r
-var_defs_t *fta_parse_defines;\r
-\r
-\r
-\r
-using namespace std;\r
-extern int errno;\r
-\r
-static gs_int8_t tmpstr[20000];                        // for returning const char* values.\r
-\r
-vector<query_rep *> schema_list;       //      The schemas parsed thus far.\r
-\r
-/////////////////////////////////////////////////////////////\r
-///                                    Version functions\r
-\r
-static gs_int32_t curr_version = 4;\r
-static gs_int32_t accepted_versions[] = { 4, 3, 2, 1, 0 };             // must end with zero.\r
-\r
-gs_int32_t get_schemaparser_version(){ return curr_version; }\r
-\r
-gs_int32_t *get_schemaparser_accepted_versions(){return accepted_versions;}\r
-\r
-gs_int32_t schemaparser_accepts_version(gs_int32_t v){\r
-       int i;\r
-       for(i=0;accepted_versions[i]>0;++i){\r
-               if(accepted_versions[i] == v) return 1;\r
-       }\r
-       return 0;\r
-}\r
-\r
-\r
-/////////////////////////////////////////////////////////////////////\r
-////////////           Utility Functions\r
-\r
-/*\r
-int fta_field_size(int dt, int *is_udef){\r
-       switch(dt){\r
-       case INT_TYPE:\r
-               return(sizeof(int));\r
-       case UINT_TYPE:\r
-       case USHORT_TYPE:\r
-       case BOOL_TYPE:\r
-               return(sizeof(unsigned int));\r
-       case ULLONG_TYPE:\r
-               return(sizeof(unsigned long long int));\r
-       case LLONG_TYPE:\r
-               return(sizeof(long long int));\r
-       case FLOAT_TYPE:\r
-               return(sizeof(double));\r
-       case TIMEVAL_TYPE:\r
-               return(sizeof(timeval));\r
-       case VSTR_TYPE:\r
-               return(sizeof(vstring));\r
-       default:\r
-               *is_udef = 1;\r
-               return(0);\r
-       }\r
-       return(0);\r
-};\r
-*/\r
-\r
-\r
-/////////////////////////////////////////////////////////////\r
-///                    Interface fcns\r
-\r
-\r
-////////////           Schema management\r
-\r
-static gs_schemahandle_t ftaschema_parse(int prot_ok);\r
-\r
-gs_schemahandle_t ftaschema_parse_string(gs_csp_t f){\r
-                       // prot_ok is by default false in schemaparser.h\r
-\r
-         fta_parse_result = new fta_parse_t();\r
-         gs_sp_t schema = strdup(f);\r
-\r
-//       FtaParserin = f;\r
-         FtaParser_setstringinput(schema);\r
-\r
-         if(FtaParserparse()){\r
-               fprintf(stderr,"FTA parse failed.\n");\r
-               free (schema);\r
-               return(-1);\r
-         }\r
-         free (schema);\r
-\r
-         return ftaschema_parse(false);\r
-}\r
-gs_schemahandle_t ftaschema_parse_string_prot(gs_csp_t f){\r
-                       // prot_ok is by default false in schemaparser.h\r
-\r
-         fta_parse_result = new fta_parse_t();\r
-         gs_sp_t schema = strdup(f);\r
-\r
-//       FtaParserin = f;\r
-         FtaParser_setstringinput(schema);\r
-\r
-         if(FtaParserparse()){\r
-               fprintf(stderr,"FTA parse failed.\n");\r
-               free (schema);\r
-               return(-1);\r
-         }\r
-         free (schema);\r
-\r
-         return ftaschema_parse(true);\r
-}\r
-\r
-gs_schemahandle_t ftaschema_parse_file(FILE *f){\r
-                       // prot_ok is by default false in schemaparser.h\r
-\r
-         fta_parse_result = new fta_parse_t();\r
-\r
-//       FtaParserin = f;\r
-         FtaParser_setfileinput(f);\r
-\r
-         if(FtaParserparse()){\r
-               fprintf(stderr,"FTA parse failed.\n");\r
-               return(-1);\r
-         }\r
-\r
-         return ftaschema_parse(false);\r
-}\r
-gs_schemahandle_t ftaschema_parse_file_prot(FILE *f){\r
-                       // prot_ok is by default false in schemaparser.h\r
-\r
-         fta_parse_result = new fta_parse_t();\r
-\r
-//       FtaParserin = f;\r
-         FtaParser_setfileinput(f);\r
-\r
-         if(FtaParserparse()){\r
-               fprintf(stderr,"FTA parse failed.\n");\r
-               return(-1);\r
-         }\r
-\r
-         return ftaschema_parse(true);\r
-}\r
-\r
-\r
-\r
-\r
-\r
-static gs_schemahandle_t ftaschema_parse(int prot_ok){\r
-\r
-       if(fta_parse_result->parse_type != STREAM_PARSE){\r
-               if(!(fta_parse_result->parse_type == TABLE_PARSE && prot_ok!=0)){\r
-                       fprintf(stderr,"ERROR, input is not a stream file.\n");\r
-                       return(-1);\r
-               }\r
-       }\r
-\r
-\r
-//                     Get the tuple information.\r
-         if(fta_parse_result->tables->size() != 1){\r
-               fprintf(stderr,"ERROR parsing schema file: %d tables, expecting 1.\n",\r
-                       fta_parse_result->tables->size() );\r
-               return(-1);\r
-         }\r
-\r
-         string table_name = fta_parse_result->tables->get_table_name(0);\r
-         vector<field_entry *> tuple_flds = fta_parse_result->tables->get_fields(table_name);\r
-         int n_tuples = tuple_flds.size();\r
-\r
-//                     get the parameter info.\r
-         int n_params = 0;\r
-         string query_name = table_name;\r
-         vector<var_pair_t *> query_params;\r
-         if(fta_parse_result->fta_parse_tree){\r
-               query_params = fta_parse_result->fta_parse_tree->query_params;\r
-               n_params = query_params.size();\r
-\r
-//                     Get the query name\r
-               if(fta_parse_result->fta_parse_tree->nmap.count("query_name") == 0){\r
-                       fprintf(stderr,"WARNING: query name is empty. using default_query.\n");\r
-                       query_name = "default_query";\r
-               }else{\r
-                       query_name = fta_parse_result->fta_parse_tree->nmap["query_name"];\r
-               }\r
-\r
-               if(query_name != table_name){\r
-                       fprintf(stderr,"WARNING table name (%s) is different than query name (%s).\n",\r
-                               table_name.c_str(), query_name.c_str() );\r
-               }\r
-\r
-         }\r
-\r
-//                     Construct the query representation.\r
-\r
-         query_rep *qrep = new query_rep(query_name, n_tuples, n_params);\r
-\r
-//                     Pack the tuple information.\r
-         int fi;\r
-         for(fi=0;fi<n_tuples;++fi){\r
-               if((qrep->set_field_info(fi,tuple_flds[fi])) == UNDEFINED_TYPE){\r
-                       fprintf(stderr,"ERROR tuple field %s (number %d) has undefined type %s.\n",\r
-                               tuple_flds[fi]->get_name().c_str(), fi, tuple_flds[fi]->get_type().c_str());\r
-               }\r
-         }\r
-         if(qrep->finalize_field_info()){\r
-               fprintf(stderr,"ERROR undefined type in tuple.\n");\r
-               return(-1);\r
-         }\r
-\r
-//                     Pack the param info\r
-         int pi;\r
-         for(pi=0;pi<n_params;++pi){\r
-               if((qrep->set_param_info(pi, query_params[pi])) == UNDEFINED_TYPE){\r
-                       fprintf(stderr,"ERROR parameter %s (number %d) has undefined type %s.\n",\r
-                               query_params[pi]->name.c_str(), pi, query_params[pi]->val.c_str());\r
-               }\r
-         }\r
-         if(qrep->finalize_param_info()){\r
-               fprintf(stderr,"ERROR undefined type in parameter block.\n");\r
-               return(-1);\r
-         }\r
-\r
-//                     finish up\r
-\r
-       schema_list.push_back(qrep);\r
-\r
-       return(schema_list.size()-1);\r
-}\r
-\r
-\r
-/*                     Release memory used by the schema representation.\r
-                       return non-zero on error.\r
-*/\r
-//                     Currently, do nothing.  I'll need to\r
-//                     systematically plug memory leaks and write destructors\r
-//                     to make implementing this function worth while.\r
-gs_int32_t ftaschema_free(gs_schemahandle_t sh){\r
-       return(0);\r
-}\r
-\r
-\r
-/* name of fta schema null terminated */\r
-/* Returns NULL if sh is out of bounds.        */\r
-/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */\r
-gs_sp_t ftaschema_name(gs_schemahandle_t sh){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(NULL);\r
-       }\r
-       strcpy(tmpstr,schema_list[sh]->name.c_str());\r
-       return(tmpstr);\r
-}\r
-\r
-\r
-/////////////          Tuple management\r
-\r
-\r
-/* number of entries in a tuple */\r
-/* Return -1 if the schema handle is out of range.     */\r
-gs_int32_t ftaschema_tuple_len(gs_schemahandle_t sh){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(-1);\r
-       }\r
-       return(schema_list[sh]->field_info.size());\r
-}\r
-\r
-/* field entry name */\r
-/* Returns NULL if sh or index is out of bounds.       */\r
-/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */\r
-gs_sp_t ftaschema_field_name(gs_schemahandle_t sh, gs_uint32_t index){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(NULL);\r
-       }\r
-       if(index >= schema_list[sh]->field_info.size()){\r
-               return(NULL);\r
-       }\r
-       strcpy(tmpstr,schema_list[sh]->field_info[index].field_name.c_str());\r
-       return( tmpstr);\r
-}\r
-\r
-/*                     Direct tuple access functions.\r
-*/\r
-gs_uint32_t fta_unpack_uint(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint32_t retval;\r
-       if(offset+sizeof(gs_uint32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-//     return(htonl(retval));\r
-       return(retval);\r
-}\r
-gs_uint32_t fta_unpack_uint_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_uint32_t fta_unpack_ushort(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint32_t retval;\r
-       if(offset+sizeof(gs_uint32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-//     return(htonl(retval));\r
-       return(retval);\r
-}\r
-gs_uint32_t fta_unpack_ushort_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_uint32_t fta_unpack_bool(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint32_t retval;\r
-       if(offset+sizeof(gs_uint32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-//     return(htonl(retval));\r
-       return(retval);\r
-}\r
-gs_uint32_t fta_unpack_bool_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-//     return(htonl(retval));\r
-       return(retval);\r
-}\r
-\r
-gs_int32_t fta_unpack_int(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_int32_t retval;\r
-       if(offset+sizeof(gs_int32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));\r
-//     return(htonl(retval));\r
-       return(retval);\r
-}\r
-gs_int32_t fta_unpack_int_nocheck(void *data, gs_uint32_t offset){\r
-       gs_int32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_uint64_t fta_unpack_ullong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint64_t retval;\r
-       if(offset+sizeof(gs_uint64_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));\r
-//     return(htonll(retval));\r
-       return(retval);\r
-}\r
-gs_uint64_t fta_unpack_ullong_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint64_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));\r
-       return(retval);\r
-}\r
-\r
-gs_int64_t fta_unpack_llong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_int64_t retval;\r
-       if(offset+sizeof( gs_int64_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));\r
-//     return(htonl(retval));\r
-       return(retval);\r
-}\r
-gs_int64_t fta_unpack_llong_nocheck(void *data, gs_uint32_t offset){\r
-       gs_int64_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));\r
-       return(retval);\r
-}\r
-\r
-gs_float_t fta_unpack_float(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_float_t retval;\r
-       if(offset+sizeof( gs_float_t) > len){\r
-               *problem = 1;\r
-               return(0.0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));\r
-//     return(ntohf(retval));\r
-       return(retval);\r
-}\r
-gs_float_t fta_unpack_float_nocheck(void *data, gs_uint32_t offset){\r
-       gs_float_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));\r
-       return(retval);\r
-}\r
-\r
-timeval fta_unpack_timeval(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       timeval retval;\r
-       if(offset+sizeof( timeval) > len){\r
-               *problem = 1;\r
-               return(retval);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));\r
-//     retval.tv_sec = htonl(retval.tv_sec);\r
-//     retval.tv_usec = htonl(retval.tv_usec);\r
-       retval.tv_sec = retval.tv_sec;\r
-       retval.tv_usec = retval.tv_usec;\r
-       return(retval);\r
-}\r
-timeval fta_unpack_timeval_nocheck(void *data, gs_uint32_t offset){\r
-       timeval retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));\r
-       retval.tv_sec = retval.tv_sec;\r
-       retval.tv_usec = retval.tv_usec;\r
-       return(retval);\r
-}\r
-\r
-vstring fta_unpack_vstr(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       vstring retval;\r
-       vstring32 unpack_s;\r
-\r
-       if(offset+sizeof( vstring32) > len){\r
-               *problem = 1;\r
-               return(retval);\r
-       }\r
-\r
-       memcpy(&unpack_s, ((gs_sp_t)data)+offset, sizeof(vstring32));\r
-\r
-//     retval.length = htonl(unpack_s.length);\r
-//     unpack_s.offset = htonl(unpack_s.offset);\r
-       retval.length = unpack_s.length;\r
-       unpack_s.offset = unpack_s.offset;\r
-       retval.reserved = SHALLOW_COPY;\r
-\r
-       if(unpack_s.offset + retval.length > len){\r
-               *problem = 1;\r
-               return(retval);\r
-       }\r
-       retval.offset = (gs_p_t)data + unpack_s.offset;\r
-       return(retval);\r
-}\r
-\r
-gs_sp_t fta_unpack_fstring(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       return( (gs_sp_t)(data)+offset);\r
-}\r
-\r
-struct hfta_ipv6_str fta_unpack_ipv6(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-        struct hfta_ipv6_str retval;\r
-        if(offset+sizeof(hfta_ipv6_str) > len){\r
-                *problem = 1;\r
-                return(retval);\r
-        }\r
-        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));\r
-//             htonl(retval.v[0]);\r
-//             htonl(retval.v[1]);\r
-//             htonl(retval.v[2]);\r
-//             htonl(retval.v[3]);\r
-        return(retval);\r
-}\r
-struct hfta_ipv6_str fta_unpack_ipv6_nocheck(void *data, gs_uint32_t offset){\r
-        struct hfta_ipv6_str retval;\r
-        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));\r
-        return(retval);\r
-}\r
-\r
-\r
-/*\r
-               Direct tuple access functions, but no ntoh xform.\r
-*/\r
-gs_uint32_t fta_unpack_uint_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint32_t retval;\r
-       if(offset+sizeof(gs_uint32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-gs_uint32_t fta_unpack_uint_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_uint32_t fta_unpack_ushort_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint32_t retval;\r
-       if(offset+sizeof(gs_uint32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-gs_uint32_t fta_unpack_ushort_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_uint32_t fta_unpack_bool_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_uint32_t retval;\r
-       if(offset+sizeof(gs_uint32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-gs_uint32_t fta_unpack_bool_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_int32_t fta_unpack_int_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_int32_t retval;\r
-       if(offset+sizeof(gs_int32_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));\r
-       return(retval);\r
-}\r
-gs_int32_t fta_unpack_int_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_int32_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));\r
-       return(retval);\r
-}\r
-\r
-gs_uint64_t fta_unpack_ullong_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_int64_t retval;\r
-       if(offset+sizeof( gs_uint64_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));\r
-       return(retval);\r
-}\r
-gs_uint64_t fta_unpack_ullong_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_uint64_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));\r
-       return(retval);\r
-}\r
-\r
-gs_int64_t fta_unpack_llong_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_int64_t retval;\r
-       if(offset+sizeof( gs_int64_t) > len){\r
-               *problem = 1;\r
-               return(0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));\r
-       return(retval);\r
-}\r
-gs_int64_t fta_unpack_llong_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_int64_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));\r
-       return(retval);\r
-}\r
-\r
-gs_float_t fta_unpack_float_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       gs_float_t retval;\r
-       if(offset+sizeof( gs_float_t) > len){\r
-               *problem = 1;\r
-               return(0.0);\r
-       }\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));\r
-       return(retval);\r
-}\r
-gs_float_t fta_unpack_float_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       gs_float_t retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));\r
-       return(retval);\r
-}\r
-\r
-timeval fta_unpack_timeval_noxf_nocheck(void *data, gs_uint32_t offset){\r
-       timeval retval;\r
-       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));\r
-       return(retval);\r
-}\r
-\r
-vstring fta_unpack_vstr_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       vstring retval;\r
-       vstring32 unpack_s;\r
-\r
-       if(offset+sizeof( vstring32) > len){\r
-               *problem = 1;\r
-               return(retval);\r
-       }\r
-\r
-       memcpy(&unpack_s, ((gs_sp_t)data)+offset, sizeof(vstring32));\r
-\r
-       retval.length = unpack_s.length;\r
-       retval.reserved = SHALLOW_COPY;\r
-\r
-       if(unpack_s.offset + unpack_s.length > len){\r
-               *problem = 1;\r
-               return(retval);\r
-       }\r
-       retval.offset = (gs_p_t)data + unpack_s.offset;\r
-       return(retval);\r
-}\r
-\r
-gs_sp_t fta_unpack_fstring_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){\r
-       return( (gs_sp_t)(data)+offset);\r
-}\r
-\r
-struct hfta_ipv6_str fta_unpack_ipv6_noxf_nocheck(void *data, gs_uint32_t offset){\r
-        struct hfta_ipv6_str retval;\r
-        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));\r
-        return(retval);\r
-}\r
-\r
-\r
-/* returns fields offset by name       */\r
-/* if sh is out of bounds, or if fieldname is not the name of a field,\r
-   or len is too small,\r
-   return value is -1\r
-*/\r
-gs_int32_t ftaschema_get_field_offset_by_name(gs_schemahandle_t sh, gs_csp_t fieldname){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(-1);\r
-       }\r
-\r
-       int f;\r
-       for(f=0;f<schema_list[sh]->field_info.size();++f){\r
-               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)\r
-                       return(schema_list[sh]->field_info[f].offset);\r
-       }\r
-\r
-//             Nothing found\r
-       return(-1);\r
-\r
-}\r
-/* field offset by index, return -1 if sh or idx is out-of-bounds */\r
-gs_int32_t ftaschema_get_field_offset_by_index(gs_schemahandle_t sh, gs_int32_t idx){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(-1);\r
-       }\r
-       if(idx < 0 || idx >= schema_list[sh]->field_info.size()){\r
-                       return(-1);\r
-       }\r
-\r
-       return(schema_list[sh]->field_info[idx].offset);\r
-\r
-}\r
-\r
-\r
-/* returns fields type by name */\r
-/* if sh is out of bounds, or if fieldname is not the name of a field,\r
-   or len is too small,\r
-   return value is UNDEFINED_TYPE\r
-*/\r
-gs_int32_t ftaschema_get_field_type_by_name(gs_schemahandle_t sh, gs_csp_t fieldname){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(UNDEFINED_TYPE);\r
-       }\r
-\r
-       int f;\r
-       for(f=0;f<schema_list[sh]->field_info.size();++f){\r
-               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)\r
-               return(schema_list[sh]->field_info[f].pdt->type_indicator());\r
-       }\r
-\r
-//             Nothing found\r
-       return( UNDEFINED_TYPE);\r
-}\r
-/* field type by index, rteturn value is UNDEFINED_TYPE if sh or idx \r
- * is out of bounds\r
-*/\r
-gs_int32_t ftaschema_get_field_type_by_index(gs_schemahandle_t sh, gs_int32_t idx){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(UNDEFINED_TYPE);\r
-       }\r
-       if(idx < 0 || idx >= schema_list[sh]->field_info.size()){\r
-                       return(UNDEFINED_TYPE);\r
-       }\r
-\r
-       return(schema_list[sh]->field_info[idx].pdt->type_indicator());\r
-}\r
-\r
-\r
-/* returns tuple value based on name */\r
-/* if sh is out of bounds, or if fieldname is not the name of a field,\r
-   or len is too small,\r
-   return value is of type UNDEFINED_TYPE\r
-*/\r
-access_result ftaschema_get_field_by_name(gs_schemahandle_t sh, gs_csp_t fieldname,\r
-                                         void * data, gs_uint32_t len){\r
-       access_result retval;\r
-       retval.field_data_type = UNDEFINED_TYPE;\r
-\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(retval);\r
-       }\r
-\r
-       int f;\r
-       for(f=0;f<schema_list[sh]->field_info.size();++f){\r
-               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)\r
-                       return(ftaschema_get_field_by_index(sh,f,data,len));\r
-       }\r
-\r
-//             Nothing found\r
-       return(retval);\r
-\r
-}\r
-\r
-/* return tuple value by index */\r
-/* if sh is out of bounds, or if fieldname is not the name of a field,\r
-   or len is too small,\r
-   return value is of type UNDEFINED_TYPE\r
-*/\r
-access_result ftaschema_get_field_by_index(gs_schemahandle_t sh, gs_uint32_t index,\r
-                                         void * data, gs_uint32_t len){\r
-       access_result retval;\r
-       retval.field_data_type = UNDEFINED_TYPE;\r
-       gs_int32_t problem = 0;\r
-\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(retval);\r
-       }\r
-       if(index >= schema_list[sh]->field_info.size()){\r
-               return(retval);\r
-       }\r
-\r
-       switch(schema_list[sh]->field_info[index].pdt->get_type()){\r
-       case u_int_t:\r
-               retval.r.ui = fta_unpack_uint(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = UINT_TYPE;\r
-               break;\r
-       case ip_t:\r
-               retval.r.ui = fta_unpack_uint(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = IP_TYPE;\r
-               break;\r
-       case int_t:\r
-               retval.r.i = fta_unpack_int(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = INT_TYPE;\r
-               break;\r
-       case u_llong_t:\r
-               retval.r.ul = fta_unpack_ullong(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = ULLONG_TYPE;\r
-               break;\r
-       case llong_t:\r
-               retval.r.l = fta_unpack_llong(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = LLONG_TYPE;\r
-               break;\r
-       case u_short_t:\r
-               retval.r.ui = fta_unpack_ushort(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = USHORT_TYPE;\r
-               break;\r
-       case floating_t:\r
-               retval.r.f = fta_unpack_float(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = FLOAT_TYPE;\r
-               break;\r
-       case bool_t:\r
-               retval.r.ui = fta_unpack_bool(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = BOOL_TYPE;\r
-               break;\r
-       case v_str_t:\r
-               retval.r.vs = fta_unpack_vstr(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = VSTR_TYPE;\r
-               break;\r
-       case fstring_t:\r
-               retval.r.fs.data = fta_unpack_fstring(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               retval.r.fs.size = schema_list[sh]->field_info[index].pdt->type_size();\r
-               if(!problem) retval.field_data_type = FSTRING_TYPE;\r
-       case timeval_t:\r
-               retval.r.t = fta_unpack_timeval(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = TIMEVAL_TYPE;\r
-               break;\r
-       case ipv6_t:\r
-               retval.r.ip6 = fta_unpack_ipv6(data,  len,\r
-                       schema_list[sh]->field_info[index].offset, &problem);\r
-               if(!problem) retval.field_data_type = IPV6_TYPE;\r
-               break;\r
-       case undefined_t:\r
-               break;\r
-       }\r
-       return(retval);\r
-}\r
-\r
-\r
-//             Get location of eof, temporal-tuple metadata.\r
-gs_int32_t ftaschema_get_tuple_metadata_offset(gs_schemahandle_t sh){\r
-        if(sh < 0 || sh >= schema_list.size())\r
-                return 0;               // probably need to return a error instead of just telling its not eof tuple\r
-\r
-        return ( schema_list[sh]->min_tuple_size);\r
-}\r
-\r
-\r
-/* checks whether tuple is temporal\r
-  return value 1 indicates that tuple istemporal, 0 - not temporal\r
-*/\r
-gs_int32_t ftaschema_is_temporal_tuple(gs_schemahandle_t sh, void *data) {\r
-\r
-       if(sh < 0 || sh >= schema_list.size())\r
-               return 0;               // probably need to return a error instead of just telling its not temporal\r
-\r
-       return (*((gs_sp_t)data + schema_list[sh]->min_tuple_size) == TEMPORAL_TUPLE);\r
-}\r
-//inline gs_int32_t ftaschema_is_temporal_tuple_offset(int metadata_offset, void *data) {\r
-//     return (*((gs_sp_t)data + metadata_offset) == TEMPORAL_TUPLE);\r
-//}\r
-\r
-\r
-\r
-/* checks whether tuple is special end-of_file tuple\r
-  return value 1 indicates that tuple is eof_tuple, 0 - otherwise\r
-*/\r
-gs_int32_t ftaschema_is_eof_tuple(gs_schemahandle_t sh, void *data) {\r
-        if(sh < 0 || sh >= schema_list.size())\r
-                return 0;               // probably need to return a error instead of just telling its not eof tuple\r
-\r
-        return (*((gs_sp_t)data + schema_list[sh]->min_tuple_size) == EOF_TUPLE);\r
-\r
-}\r
-inline gs_int32_t ftaschema_is_eof_tuple_offset(int metadata_offset, void *data) {\r
-        return (*((gs_sp_t)data + metadata_offset) == EOF_TUPLE);\r
-}\r
-\r
-\r
-/* extracts the trace from the temporal tuple\r
-  return value 0 indicates success, non-zero - error\r
-*/\r
-gs_int32_t ftaschema_get_trace(gs_schemahandle_t sh, void* data, gs_int32_t len,\r
-       gs_uint64_t* trace_id, gs_uint32_t* sz, fta_stat** trace ) {\r
-\r
-       if(sh < 0 || sh >= schema_list.size() || *((gs_sp_t)data + schema_list[sh]->min_tuple_size) != TEMPORAL_TUPLE)\r
-               return 1;\r
-\r
-       memcpy(trace_id, (gs_sp_t)data + schema_list[sh]->min_tuple_size + sizeof(gs_int8_t), sizeof(gs_uint64_t));\r
-       *trace = (fta_stat*)((gs_sp_t)data + schema_list[sh]->min_tuple_size + sizeof(gs_int8_t) + sizeof(gs_uint64_t));\r
-       *sz = (len - schema_list[sh]->min_tuple_size - sizeof(gs_int8_t)- sizeof(gs_uint64_t)) / sizeof(fta_stat);\r
-\r
-       return 0;\r
-}\r
-\r
-\r
-////////////   Param block management\r
-\r
-/* number of parameters */\r
-/*     Return -1 if sh is out of bounds        */\r
-gs_int32_t ftaschema_parameter_len(gs_schemahandle_t sh){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(-1);\r
-       }\r
-       return(schema_list[sh]->param_info.size());\r
-}\r
-\r
-/* parameter entry name */\r
-/*     Return NULL if sh or index is out of bounds.    */\r
-/*     NO COPYING IS PERFORMED */\r
-gs_sp_t ftaschema_parameter_name(gs_schemahandle_t sh, gs_uint32_t index){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(NULL);\r
-       }\r
-    if(index >= schema_list[sh]->param_info.size()){\r
-       return(NULL);\r
-    }\r
-       strcpy(tmpstr,schema_list[sh]->param_info[index].param_name.c_str());\r
-    return(tmpstr);\r
-}\r
-\r
-/* set parameter value for parameter handle */\r
-/*     Pass in the parameter in its char string representation. */\r
-/*  Return value is -1 on error, else 0        */\r
-gs_int32_t ftaschema_setparam_by_name(gs_schemahandle_t sh, gs_sp_t param_name,\r
-                              gs_sp_t param_val, gs_int32_t len){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-                       return(-1);\r
-       }\r
-\r
-       int f;\r
-       for(f=0;f<schema_list[sh]->param_info.size();++f){\r
-               if(strcmp(param_name, schema_list[sh]->param_info[f].param_name.c_str()) == 0)\r
-                       return(ftaschema_setparam_by_index(sh,f,param_val,len));\r
-       }\r
-\r
-//             not found\r
-       return(-1);\r
-}\r
-\r
-/* set parameter value for parameter handle */\r
-/*     Pass in the parameter in its char string representation. */\r
-/*  Return value is -1 on error, else 0        */\r
-gs_int32_t ftaschema_setparam_by_index(gs_schemahandle_t sh, gs_int32_t index,\r
-                               gs_sp_t param_val, gs_int32_t len){\r
-\r
-    void *tmp_ptr;\r
-       unsigned int ui,d1,d2,d3,d4;\r
-       int i;\r
-       unsigned long long int ulli;\r
-       long long int lli;\r
-       double f;\r
-\r
-\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(-1);\r
-       }\r
-    if(index >= schema_list[sh]->param_info.size()){\r
-       return(-1);\r
-    }\r
-\r
-    param_block_info *pb = &(schema_list[sh]->param_info[index]);\r
-       switch(pb->pdt->get_type()){\r
-               case int_t:\r
-                       if(sscanf(param_val,"%d",&i) == 1){\r
-                               pb->value.r.i=i;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-                       break;\r
-               case u_int_t:\r
-               case u_short_t:\r
-               case bool_t:\r
-                       if(sscanf(param_val,"%u",&ui) == 1){\r
-                               pb->value.r.ui=ui;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-                       break;\r
-               case ip_t:\r
-                       if(sscanf(param_val,"%d.%d.%d.%d",&d1,&d2,&d3,&d4) == 4){\r
-                               pb->value.r.ui = (d1 << 24)+(d2 << 16)+(d3 << 8)+d4;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-               case u_llong_t:\r
-                       if(sscanf(param_val,"%llu",&ulli) == 1){\r
-                               pb->value.r.ul=ulli;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-                       break;\r
-               case llong_t:\r
-                       if(sscanf(param_val,"%lld",&lli) == 1){\r
-                               pb->value.r.l=lli;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-                       break;\r
-               case floating_t:\r
-                       if(sscanf(param_val,"%lf",&f) == 1){\r
-                               pb->value.r.f=f;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-                       break;\r
-               case timeval_t:\r
-                       if(sscanf(param_val,"(%d,%d)",&d1, &d2) == 2){\r
-                               pb->value.r.t.tv_sec = d1;\r
-                               pb->value.r.t.tv_usec = d2;\r
-                               pb->value_set = true;\r
-                               return(0);\r
-                       }else\r
-                               return(-1);\r
-                       break;\r
-               case v_str_t:\r
-                       if(pb->value.r.vs.offset != 0){\r
-                               tmp_ptr = (void *)(pb->value.r.vs.offset);\r
-                               free(tmp_ptr);\r
-                       }\r
-                       tmp_ptr = malloc(len);\r
-                       pb->value.r.vs.offset = (gs_p_t)tmp_ptr;\r
-                       memcpy(tmp_ptr,param_val, len);\r
-                       pb->value.r.vs.length = len;\r
-//                     pb->value.r.vs.reserved = 0;\r
-                       pb->value.r.vs.reserved = INTERNAL;\r
-                       pb->value_set = true;\r
-                       return(0);\r
-                       break;\r
-               case fstring_t:\r
-                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");\r
-                       exit(1);\r
-                       break;\r
-               case ipv6_t:\r
-                       fprintf(stderr,"ERROR, ipv6_t parameters not supported.\n");\r
-                       exit(1);\r
-                       break;\r
-               case undefined_t:\r
-                       fprintf(stderr,"INTERNAL ERROR undefined_t type in ftaschema_setparam_by_index\n");\r
-                       exit(1);\r
-               default:\r
-                       fprintf(stderr,"INTERNAL ERROR unknown type in ftaschema_setparam_by_index\n");\r
-                       exit(1);\r
-       }\r
-\r
-       return(-1);\r
-}\r
-\r
-gs_int32_t ftaschema_create_param_block(gs_schemahandle_t sh, void ** block, gs_int32_t * size){\r
-       if(sh < 0 || sh >= schema_list.size()){\r
-               return(-1);\r
-       }\r
-\r
-       *size = schema_list[sh]->min_param_size;\r
-       int p;\r
-\r
-       for(p=0;p<schema_list[sh]->param_info.size();++p){\r
-               if(! schema_list[sh]->param_info[p].value_set) return 1;\r
-\r
-               switch(schema_list[sh]->param_info[p].pdt->get_type()){\r
-               case v_str_t:\r
-                       *size += schema_list[sh]->param_info[p].value.r.vs.length;\r
-                       break;\r
-               case fstring_t:\r
-                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");\r
-                       exit(1);\r
-                       break;\r
-               case undefined_t:\r
-                       return(-1);\r
-                       break;\r
-               default:\r
-                       break;\r
-               }\r
-       }\r
-\r
-       *block = malloc(*size);\r
-       if(*block == NULL) return(-1);\r
-\r
-       int data_pos = schema_list[sh]->min_param_size;\r
-\r
-       gs_int32_t tmp_int;\r
-       gs_uint32_t tmp_uint;\r
-       gs_int64_t tmp_ll;\r
-       gs_uint64_t tmp_ull;\r
-       gs_float_t tmp_f;\r
-       timeval tmp_tv;\r
-       vstring32 tmp_vstr;\r
-       void *tmp_ptr;\r
-\r
-       for(p=0;p<schema_list[sh]->param_info.size();++p){\r
-               param_block_info *pb = &(schema_list[sh]->param_info[p]);\r
-               switch(pb->pdt->get_type()){\r
-                       case int_t:\r
-//                             tmp_int = htonl(pb->value.r.i);\r
-                               tmp_int = pb->value.r.i;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_int,sizeof(gs_int32_t));\r
-                               break;\r
-                       case u_int_t:\r
-                       case u_short_t:\r
-                       case bool_t:\r
-                       case ip_t:\r
-//                             tmp_uint = htonl(pb->value.r.ui);\r
-                               tmp_uint = pb->value.r.ui;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_uint,sizeof(gs_uint32_t));\r
-                               break;\r
-                       case u_llong_t:\r
-//                             tmp_ull = htonll(pb->value.r.ul);\r
-                               tmp_ull = pb->value.r.ul;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_ull,sizeof(gs_uint64_t));\r
-                               break;\r
-                       case llong_t:\r
-//                             tmp_ll = htonll(pb->value.r.l);\r
-                               tmp_ll = pb->value.r.l;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_ll,sizeof(gs_int64_t));\r
-                               break;\r
-                       case floating_t:\r
-//                             tmp_f = ntohf(pb->value.r.f);\r
-                               tmp_f = pb->value.r.f;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_f,sizeof(gs_float_t));\r
-                               break;\r
-                       case timeval_t:\r
-//                             tmp_tv.tv_sec = htonl(pb->value.r.t.tv_sec);\r
-//                             tmp_tv.tv_usec = htonl(pb->value.r.t.tv_usec);\r
-                               tmp_tv.tv_sec = pb->value.r.t.tv_sec;\r
-                               tmp_tv.tv_usec =pb->value.r.t.tv_usec;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_tv,sizeof(timeval));\r
-                               break;\r
-                       case v_str_t:\r
-//                             tmp_vstr.offset = htonl(data_pos);\r
-//                             tmp_vstr.length = htonl(pb->value.r.vs.length);\r
-                               tmp_vstr.offset = data_pos;\r
-                               tmp_vstr.length = pb->value.r.vs.length;\r
-//                             tmp_vstr.reserved = htonl(pb->value.r.vs.reserved);\r
-//                             tmp_vstr.reserved = htonl(PACKED);\r
-                               tmp_vstr.reserved = PACKED;\r
-                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_vstr,sizeof(vstring32));\r
-                               tmp_ptr = (void *)(pb->value.r.vs.offset);\r
-                               memcpy(((gs_sp_t)(*block))+data_pos, tmp_ptr, pb->value.r.vs.length);\r
-                               data_pos += pb->value.r.vs.length;\r
-                               break;\r
-               case fstring_t:\r
-                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");\r
-                       exit(1);\r
-                       break;\r
-               case ipv6_t:\r
-                       fprintf(stderr,"ERROR, ipv6_t parameters not supported.\n");\r
-                       exit(1);\r
-                       break;\r
-               case undefined_t:\r
-                       fprintf(stderr,"INTERNAL ERROR undefined_t type in ftaschema_setparam_by_index\n");\r
-                       exit(1);\r
-               default:\r
-                       fprintf(stderr,"INTERNAL ERROR unknown type in ftaschema_create_param_block\n");\r
-                       exit(1);\r
-               }\r
-       }\r
-       return(0);\r
-\r
-}\r
-\r
-\r
-///////////////////////////////////////////////////////////////\r
-//             Diagnostic functions\r
-\r
-void ftaschema_debugdump(gs_int32_t handle){\r
-       if(handle<0){\r
-               printf("ftaschema_debugdump: handle is negative.\n");\r
-               return;\r
-       }\r
-       if(handle >= schema_list.size()){\r
-               printf("ftaschema_debugdump: handle out of bounds (%d, max is %lu)\n",\r
-                               handle, schema_list.size());\r
-       }\r
-\r
-       query_rep *q = schema_list[handle];\r
-\r
-       printf("Handle is %d, query name is <%s>\n",handle,q->name.c_str());\r
-       printf("Output tuple has %lu fields:\n",q->field_info.size());\r
-       int f;\r
-       for(f=0;f<q->field_info.size();++f){\r
-               printf("\t%s (%s) : %d\n",q->field_info[f].field_name.c_str(),\r
-                       (q->field_info[f].pdt->get_type_str()).c_str(),\r
-                       q->field_info[f].offset\r
-                       );\r
-       }\r
-       printf("Min tuple size is %d\n\n",q->min_tuple_size);\r
-       printf("Param block is:\n");\r
-       int p;\r
-       for(p=0;p<q->param_info.size();++p){\r
-               printf("\t%s (%s) : %d\n",q->param_info[p].param_name.c_str(),\r
-                       (q->param_info[p].pdt->get_type_str()).c_str(),\r
-                       q->param_info[p].offset\r
-                       );\r
-       }\r
-       printf("Min param block size is %d\n\n",q->min_param_size);\r
-\r
-\r
-\r
-}\r
-\r
-\r
+/* ------------------------------------------------
+Copyright 2014 AT&T Intellectual Property
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+ ------------------------------------------- */
+
+#include"schemaparser_impl.h"
+#include"schemaparser.h"
+#include <string>
+#include "parse_fta.h"
+#include "parse_schema.h"
+#include"generate_utils.h"
+
+#include"host_tuple.h"
+#include"lapp.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+
+//             Interface to FTA definition lexer and parser ...
+
+extern int FtaParserparse(void);
+extern FILE *FtaParserin;
+extern int FtaParserdebug;
+
+//                     This will need to be moved to a parse_fta.cc file.
+fta_parse_t *fta_parse_result;
+var_defs_t *fta_parse_defines;
+
+
+
+using namespace std;
+extern int errno;
+
+static gs_int8_t tmpstr[20000];                        // for returning const char* values.
+
+vector<query_rep *> schema_list;       //      The schemas parsed thus far.
+
+/////////////////////////////////////////////////////////////
+///                                    Version functions
+
+static gs_int32_t curr_version = 4;
+static gs_int32_t accepted_versions[] = { 4, 3, 2, 1, 0 };             // must end with zero.
+
+gs_int32_t get_schemaparser_version(){ return curr_version; }
+
+gs_int32_t *get_schemaparser_accepted_versions(){return accepted_versions;}
+
+gs_int32_t schemaparser_accepts_version(gs_int32_t v){
+       int i;
+       for(i=0;accepted_versions[i]>0;++i){
+               if(accepted_versions[i] == v) return 1;
+       }
+       return 0;
+}
+
+
+/////////////////////////////////////////////////////////////////////
+////////////           Utility Functions
+
+/*
+int fta_field_size(int dt, int *is_udef){
+       switch(dt){
+       case INT_TYPE:
+               return(sizeof(int));
+       case UINT_TYPE:
+       case USHORT_TYPE:
+       case BOOL_TYPE:
+               return(sizeof(unsigned int));
+       case ULLONG_TYPE:
+               return(sizeof(unsigned long long int));
+       case LLONG_TYPE:
+               return(sizeof(long long int));
+       case FLOAT_TYPE:
+               return(sizeof(double));
+       case TIMEVAL_TYPE:
+               return(sizeof(timeval));
+       case VSTR_TYPE:
+               return(sizeof(vstring));
+       default:
+               *is_udef = 1;
+               return(0);
+       }
+       return(0);
+};
+*/
+
+
+/////////////////////////////////////////////////////////////
+///                    Interface fcns
+
+
+////////////           Schema management
+
+static gs_schemahandle_t ftaschema_parse(int prot_ok);
+
+gs_schemahandle_t ftaschema_parse_string(gs_csp_t f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+         gs_sp_t schema = strdup(f);
+
+//       FtaParserin = f;
+         FtaParser_setstringinput(schema);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               free (schema);
+               return(-1);
+         }
+         free (schema);
+
+         return ftaschema_parse(false);
+}
+gs_schemahandle_t ftaschema_parse_string_prot(gs_csp_t f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+         gs_sp_t schema = strdup(f);
+
+//       FtaParserin = f;
+         FtaParser_setstringinput(schema);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               free (schema);
+               return(-1);
+         }
+         free (schema);
+
+         return ftaschema_parse(true);
+}
+
+gs_schemahandle_t ftaschema_parse_file(FILE *f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+
+//       FtaParserin = f;
+         FtaParser_setfileinput(f);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               return(-1);
+         }
+
+         return ftaschema_parse(false);
+}
+gs_schemahandle_t ftaschema_parse_file_prot(FILE *f){
+                       // prot_ok is by default false in schemaparser.h
+
+         fta_parse_result = new fta_parse_t();
+
+//       FtaParserin = f;
+         FtaParser_setfileinput(f);
+
+         if(FtaParserparse()){
+               fprintf(stderr,"FTA parse failed.\n");
+               return(-1);
+         }
+
+         return ftaschema_parse(true);
+}
+
+
+
+
+
+static gs_schemahandle_t ftaschema_parse(int prot_ok){
+
+       if(fta_parse_result->parse_type != STREAM_PARSE){
+               if(!(fta_parse_result->parse_type == TABLE_PARSE && prot_ok!=0)){
+                       fprintf(stderr,"ERROR, input is not a stream file.\n");
+                       return(-1);
+               }
+       }
+
+
+//                     Get the tuple information.
+         if(fta_parse_result->tables->size() != 1){
+               fprintf(stderr,"ERROR parsing schema file: %d tables, expecting 1.\n",
+                       fta_parse_result->tables->size() );
+               return(-1);
+         }
+
+         string table_name = fta_parse_result->tables->get_table_name(0);
+         vector<field_entry *> tuple_flds = fta_parse_result->tables->get_fields(table_name);
+         int n_tuples = tuple_flds.size();
+
+//                     get the parameter info.
+         int n_params = 0;
+         string query_name = table_name;
+         vector<var_pair_t *> query_params;
+         if(fta_parse_result->fta_parse_tree){
+               query_params = fta_parse_result->fta_parse_tree->query_params;
+               n_params = query_params.size();
+
+//                     Get the query name
+               if(fta_parse_result->fta_parse_tree->nmap.count("query_name") == 0){
+                       fprintf(stderr,"WARNING: query name is empty. using default_query.\n");
+                       query_name = "default_query";
+               }else{
+                       query_name = fta_parse_result->fta_parse_tree->nmap["query_name"];
+               }
+
+               if(query_name != table_name){
+                       fprintf(stderr,"WARNING table name (%s) is different than query name (%s).\n",
+                               table_name.c_str(), query_name.c_str() );
+               }
+
+         }
+
+//                     Construct the query representation.
+
+         query_rep *qrep = new query_rep(query_name, n_tuples, n_params);
+
+//                     Pack the tuple information.
+         int fi;
+         for(fi=0;fi<n_tuples;++fi){
+               if((qrep->set_field_info(fi,tuple_flds[fi])) == UNDEFINED_TYPE){
+                       fprintf(stderr,"ERROR tuple field %s (number %d) has undefined type %s.\n",
+                               tuple_flds[fi]->get_name().c_str(), fi, tuple_flds[fi]->get_type().c_str());
+               }
+         }
+         if(qrep->finalize_field_info()){
+               fprintf(stderr,"ERROR undefined type in tuple.\n");
+               return(-1);
+         }
+
+//                     Pack the param info
+         int pi;
+         for(pi=0;pi<n_params;++pi){
+               if((qrep->set_param_info(pi, query_params[pi])) == UNDEFINED_TYPE){
+                       fprintf(stderr,"ERROR parameter %s (number %d) has undefined type %s.\n",
+                               query_params[pi]->name.c_str(), pi, query_params[pi]->val.c_str());
+               }
+         }
+         if(qrep->finalize_param_info()){
+               fprintf(stderr,"ERROR undefined type in parameter block.\n");
+               return(-1);
+         }
+
+//                     finish up
+
+       schema_list.push_back(qrep);
+
+       return(schema_list.size()-1);
+}
+
+
+/*                     Release memory used by the schema representation.
+                       return non-zero on error.
+*/
+//                     Currently, do nothing.  I'll need to
+//                     systematically plug memory leaks and write destructors
+//                     to make implementing this function worth while.
+gs_int32_t ftaschema_free(gs_schemahandle_t sh){
+       return(0);
+}
+
+
+/* name of fta schema null terminated */
+/* Returns NULL if sh is out of bounds.        */
+/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */
+gs_sp_t ftaschema_name(gs_schemahandle_t sh){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(NULL);
+       }
+       strcpy(tmpstr,schema_list[sh]->name.c_str());
+       return(tmpstr);
+}
+
+
+/////////////          Tuple management
+
+
+/* number of entries in a tuple */
+/* Return -1 if the schema handle is out of range.     */
+gs_int32_t ftaschema_tuple_len(gs_schemahandle_t sh){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+       return(schema_list[sh]->field_info.size());
+}
+
+/* field entry name */
+/* Returns NULL if sh or index is out of bounds.       */
+/* NO ALLOCATION IS PERFORMED!   Must treat result as const. */
+gs_sp_t ftaschema_field_name(gs_schemahandle_t sh, gs_uint32_t index){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(NULL);
+       }
+       if(index >= schema_list[sh]->field_info.size()){
+               return(NULL);
+       }
+       strcpy(tmpstr,schema_list[sh]->field_info[index].field_name.c_str());
+       return( tmpstr);
+}
+
+/*                     Direct tuple access functions.
+*/
+gs_uint32_t fta_unpack_uint(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_uint32_t fta_unpack_uint_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_ushort(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_uint32_t fta_unpack_ushort_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_bool(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_uint32_t fta_unpack_bool_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+
+gs_int32_t fta_unpack_int(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int32_t retval;
+       if(offset+sizeof(gs_int32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_int32_t fta_unpack_int_nocheck(void *data, gs_uint32_t offset){
+       gs_int32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+       return(retval);
+}
+
+gs_uint64_t fta_unpack_ullong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint64_t retval;
+       if(offset+sizeof(gs_uint64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+//     return(htonll(retval));
+       return(retval);
+}
+gs_uint64_t fta_unpack_ullong_nocheck(void *data, gs_uint32_t offset){
+       gs_uint64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+       return(retval);
+}
+
+gs_int64_t fta_unpack_llong(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int64_t retval;
+       if(offset+sizeof( gs_int64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+//     return(htonl(retval));
+       return(retval);
+}
+gs_int64_t fta_unpack_llong_nocheck(void *data, gs_uint32_t offset){
+       gs_int64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+       return(retval);
+}
+
+gs_float_t fta_unpack_float(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_float_t retval;
+       if(offset+sizeof( gs_float_t) > len){
+               *problem = 1;
+               return(0.0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+//     return(ntohf(retval));
+       return(retval);
+}
+gs_float_t fta_unpack_float_nocheck(void *data, gs_uint32_t offset){
+       gs_float_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+       return(retval);
+}
+
+timeval fta_unpack_timeval(void *data, gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       timeval retval;
+       if(offset+sizeof( timeval) > len){
+               *problem = 1;
+               return(retval);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));
+//     retval.tv_sec = htonl(retval.tv_sec);
+//     retval.tv_usec = htonl(retval.tv_usec);
+       retval.tv_sec = retval.tv_sec;
+       retval.tv_usec = retval.tv_usec;
+       return(retval);
+}
+timeval fta_unpack_timeval_nocheck(void *data, gs_uint32_t offset){
+       timeval retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));
+       retval.tv_sec = retval.tv_sec;
+       retval.tv_usec = retval.tv_usec;
+       return(retval);
+}
+
+vstring fta_unpack_vstr(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       vstring retval;
+       vstring32 unpack_s;
+
+       if(offset+sizeof( vstring32) > len){
+               *problem = 1;
+               return(retval);
+       }
+
+       memcpy(&unpack_s, ((gs_sp_t)data)+offset, sizeof(vstring32));
+
+//     retval.length = htonl(unpack_s.length);
+//     unpack_s.offset = htonl(unpack_s.offset);
+       retval.length = unpack_s.length;
+       unpack_s.offset = unpack_s.offset;
+       retval.reserved = SHALLOW_COPY;
+
+       if(unpack_s.offset + retval.length > len){
+               *problem = 1;
+               return(retval);
+       }
+       retval.offset = (gs_p_t)data + unpack_s.offset;
+       return(retval);
+}
+
+gs_sp_t fta_unpack_fstring(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       return( (gs_sp_t)(data)+offset);
+}
+
+struct hfta_ipv6_str fta_unpack_ipv6(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+        struct hfta_ipv6_str retval;
+        if(offset+sizeof(hfta_ipv6_str) > len){
+                *problem = 1;
+                return(retval);
+        }
+        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));
+//             htonl(retval.v[0]);
+//             htonl(retval.v[1]);
+//             htonl(retval.v[2]);
+//             htonl(retval.v[3]);
+        return(retval);
+}
+struct hfta_ipv6_str fta_unpack_ipv6_nocheck(void *data, gs_uint32_t offset){
+        struct hfta_ipv6_str retval;
+        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));
+        return(retval);
+}
+
+
+/*
+               Direct tuple access functions, but no ntoh xform.
+*/
+gs_uint32_t fta_unpack_uint_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+gs_uint32_t fta_unpack_uint_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_ushort_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+gs_uint32_t fta_unpack_ushort_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_uint32_t fta_unpack_bool_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_uint32_t retval;
+       if(offset+sizeof(gs_uint32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+gs_uint32_t fta_unpack_bool_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint32_t));
+       return(retval);
+}
+
+gs_int32_t fta_unpack_int_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int32_t retval;
+       if(offset+sizeof(gs_int32_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+       return(retval);
+}
+gs_int32_t fta_unpack_int_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_int32_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int32_t));
+       return(retval);
+}
+
+gs_uint64_t fta_unpack_ullong_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int64_t retval;
+       if(offset+sizeof( gs_uint64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+       return(retval);
+}
+gs_uint64_t fta_unpack_ullong_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_uint64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_uint64_t));
+       return(retval);
+}
+
+gs_int64_t fta_unpack_llong_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_int64_t retval;
+       if(offset+sizeof( gs_int64_t) > len){
+               *problem = 1;
+               return(0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+       return(retval);
+}
+gs_int64_t fta_unpack_llong_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_int64_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_int64_t));
+       return(retval);
+}
+
+gs_float_t fta_unpack_float_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       gs_float_t retval;
+       if(offset+sizeof( gs_float_t) > len){
+               *problem = 1;
+               return(0.0);
+       }
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+       return(retval);
+}
+gs_float_t fta_unpack_float_noxf_nocheck(void *data, gs_uint32_t offset){
+       gs_float_t retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(gs_float_t));
+       return(retval);
+}
+
+timeval fta_unpack_timeval_noxf_nocheck(void *data, gs_uint32_t offset){
+       timeval retval;
+       memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(timeval));
+       return(retval);
+}
+
+vstring fta_unpack_vstr_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       vstring retval;
+       vstring32 unpack_s;
+
+       if(offset+sizeof( vstring32) > len){
+               *problem = 1;
+               return(retval);
+       }
+
+       memcpy(&unpack_s, ((gs_sp_t)data)+offset, sizeof(vstring32));
+
+       retval.length = unpack_s.length;
+       retval.reserved = SHALLOW_COPY;
+
+       if(unpack_s.offset + unpack_s.length > len){
+               *problem = 1;
+               return(retval);
+       }
+       retval.offset = (gs_p_t)data + unpack_s.offset;
+       return(retval);
+}
+
+gs_sp_t fta_unpack_fstring_noxf(void *data,  gs_int32_t len, gs_uint32_t offset, gs_int32_t *problem){
+       return( (gs_sp_t)(data)+offset);
+}
+
+struct hfta_ipv6_str fta_unpack_ipv6_noxf_nocheck(void *data, gs_uint32_t offset){
+        struct hfta_ipv6_str retval;
+        memcpy(&retval, ((gs_sp_t)data)+offset, sizeof(hfta_ipv6_str));
+        return(retval);
+}
+
+
+/* returns fields offset by name       */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is -1
+*/
+gs_int32_t ftaschema_get_field_offset_by_name(gs_schemahandle_t sh, gs_csp_t fieldname){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(-1);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->field_info.size();++f){
+               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)
+                       return(schema_list[sh]->field_info[f].offset);
+       }
+
+//             Nothing found
+       return(-1);
+
+}
+/* field offset by index, return -1 if sh or idx is out-of-bounds */
+gs_int32_t ftaschema_get_field_offset_by_index(gs_schemahandle_t sh, gs_int32_t idx){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(-1);
+       }
+       if(idx < 0 || idx >= schema_list[sh]->field_info.size()){
+                       return(-1);
+       }
+
+       return(schema_list[sh]->field_info[idx].offset);
+
+}
+
+
+/* returns fields type by name */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is UNDEFINED_TYPE
+*/
+gs_int32_t ftaschema_get_field_type_by_name(gs_schemahandle_t sh, gs_csp_t fieldname){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(UNDEFINED_TYPE);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->field_info.size();++f){
+               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)
+               return(schema_list[sh]->field_info[f].pdt->type_indicator());
+       }
+
+//             Nothing found
+       return( UNDEFINED_TYPE);
+}
+/* field type by index, rteturn value is UNDEFINED_TYPE if sh or idx 
+ * is out of bounds
+*/
+gs_int32_t ftaschema_get_field_type_by_index(gs_schemahandle_t sh, gs_int32_t idx){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(UNDEFINED_TYPE);
+       }
+       if(idx < 0 || idx >= schema_list[sh]->field_info.size()){
+                       return(UNDEFINED_TYPE);
+       }
+
+       return(schema_list[sh]->field_info[idx].pdt->type_indicator());
+}
+
+
+/* returns tuple value based on name */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is of type UNDEFINED_TYPE
+*/
+access_result ftaschema_get_field_by_name(gs_schemahandle_t sh, gs_csp_t fieldname,
+                                         void * data, gs_uint32_t len){
+       access_result retval;
+       retval.field_data_type = UNDEFINED_TYPE;
+
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(retval);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->field_info.size();++f){
+               if(strcmp(fieldname, schema_list[sh]->field_info[f].field_name.c_str()) == 0)
+                       return(ftaschema_get_field_by_index(sh,f,data,len));
+       }
+
+//             Nothing found
+       return(retval);
+
+}
+
+/* return tuple value by index */
+/* if sh is out of bounds, or if fieldname is not the name of a field,
+   or len is too small,
+   return value is of type UNDEFINED_TYPE
+*/
+access_result ftaschema_get_field_by_index(gs_schemahandle_t sh, gs_uint32_t index,
+                                         void * data, gs_uint32_t len){
+       access_result retval;
+       retval.field_data_type = UNDEFINED_TYPE;
+       gs_int32_t problem = 0;
+
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(retval);
+       }
+       if(index >= schema_list[sh]->field_info.size()){
+               return(retval);
+       }
+
+       switch(schema_list[sh]->field_info[index].pdt->get_type()){
+       case u_int_t:
+               retval.r.ui = fta_unpack_uint(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = UINT_TYPE;
+               break;
+       case ip_t:
+               retval.r.ui = fta_unpack_uint(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = IP_TYPE;
+               break;
+       case int_t:
+               retval.r.i = fta_unpack_int(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = INT_TYPE;
+               break;
+       case u_llong_t:
+               retval.r.ul = fta_unpack_ullong(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = ULLONG_TYPE;
+               break;
+       case llong_t:
+               retval.r.l = fta_unpack_llong(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = LLONG_TYPE;
+               break;
+       case u_short_t:
+               retval.r.ui = fta_unpack_ushort(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = USHORT_TYPE;
+               break;
+       case floating_t:
+               retval.r.f = fta_unpack_float(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = FLOAT_TYPE;
+               break;
+       case bool_t:
+               retval.r.ui = fta_unpack_bool(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = BOOL_TYPE;
+               break;
+       case v_str_t:
+               retval.r.vs = fta_unpack_vstr(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = VSTR_TYPE;
+               break;
+       case fstring_t:
+               retval.r.fs.data = fta_unpack_fstring(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               retval.r.fs.size = schema_list[sh]->field_info[index].pdt->type_size();
+               if(!problem) retval.field_data_type = FSTRING_TYPE;
+       case timeval_t:
+               retval.r.t = fta_unpack_timeval(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = TIMEVAL_TYPE;
+               break;
+       case ipv6_t:
+               retval.r.ip6 = fta_unpack_ipv6(data,  len,
+                       schema_list[sh]->field_info[index].offset, &problem);
+               if(!problem) retval.field_data_type = IPV6_TYPE;
+               break;
+       case undefined_t:
+               break;
+       }
+       return(retval);
+}
+
+
+//             Get location of eof, temporal-tuple metadata.
+gs_int32_t ftaschema_get_tuple_metadata_offset(gs_schemahandle_t sh){
+        if(sh < 0 || sh >= schema_list.size())
+                return 0;               // probably need to return a error instead of just telling its not eof tuple
+
+        return ( schema_list[sh]->min_tuple_size);
+}
+
+
+/* checks whether tuple is temporal
+  return value 1 indicates that tuple istemporal, 0 - not temporal
+*/
+gs_int32_t ftaschema_is_temporal_tuple(gs_schemahandle_t sh, void *data) {
+
+       if(sh < 0 || sh >= schema_list.size())
+               return 0;               // probably need to return a error instead of just telling its not temporal
+
+       return (*((gs_sp_t)data + schema_list[sh]->min_tuple_size) == TEMPORAL_TUPLE);
+}
+//inline gs_int32_t ftaschema_is_temporal_tuple_offset(int metadata_offset, void *data) {
+//     return (*((gs_sp_t)data + metadata_offset) == TEMPORAL_TUPLE);
+//}
+
+
+
+/* checks whether tuple is special end-of_file tuple
+  return value 1 indicates that tuple is eof_tuple, 0 - otherwise
+*/
+gs_int32_t ftaschema_is_eof_tuple(gs_schemahandle_t sh, void *data) {
+        if(sh < 0 || sh >= schema_list.size())
+                return 0;               // probably need to return a error instead of just telling its not eof tuple
+
+        return (*((gs_sp_t)data + schema_list[sh]->min_tuple_size) == EOF_TUPLE);
+
+}
+inline gs_int32_t ftaschema_is_eof_tuple_offset(int metadata_offset, void *data) {
+        return (*((gs_sp_t)data + metadata_offset) == EOF_TUPLE);
+}
+
+
+/* extracts the trace from the temporal tuple
+  return value 0 indicates success, non-zero - error
+*/
+gs_int32_t ftaschema_get_trace(gs_schemahandle_t sh, void* data, gs_int32_t len,
+       gs_uint64_t* trace_id, gs_uint32_t* sz, fta_stat** trace ) {
+
+       if(sh < 0 || sh >= schema_list.size() || *((gs_sp_t)data + schema_list[sh]->min_tuple_size) != TEMPORAL_TUPLE)
+               return 1;
+
+       memcpy(trace_id, (gs_sp_t)data + schema_list[sh]->min_tuple_size + sizeof(gs_int8_t), sizeof(gs_uint64_t));
+       *trace = (fta_stat*)((gs_sp_t)data + schema_list[sh]->min_tuple_size + sizeof(gs_int8_t) + sizeof(gs_uint64_t));
+       *sz = (len - schema_list[sh]->min_tuple_size - sizeof(gs_int8_t)- sizeof(gs_uint64_t)) / sizeof(fta_stat);
+
+       return 0;
+}
+
+
+////////////   Param block management
+
+/* number of parameters */
+/*     Return -1 if sh is out of bounds        */
+gs_int32_t ftaschema_parameter_len(gs_schemahandle_t sh){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+       return(schema_list[sh]->param_info.size());
+}
+
+/* parameter entry name */
+/*     Return NULL if sh or index is out of bounds.    */
+/*     NO COPYING IS PERFORMED */
+gs_sp_t ftaschema_parameter_name(gs_schemahandle_t sh, gs_uint32_t index){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(NULL);
+       }
+    if(index >= schema_list[sh]->param_info.size()){
+       return(NULL);
+    }
+       strcpy(tmpstr,schema_list[sh]->param_info[index].param_name.c_str());
+    return(tmpstr);
+}
+
+/* set parameter value for parameter handle */
+/*     Pass in the parameter in its char string representation. */
+/*  Return value is -1 on error, else 0        */
+gs_int32_t ftaschema_setparam_by_name(gs_schemahandle_t sh, gs_sp_t param_name,
+                              gs_sp_t param_val, gs_int32_t len){
+       if(sh < 0 || sh >= schema_list.size()){
+                       return(-1);
+       }
+
+       int f;
+       for(f=0;f<schema_list[sh]->param_info.size();++f){
+               if(strcmp(param_name, schema_list[sh]->param_info[f].param_name.c_str()) == 0)
+                       return(ftaschema_setparam_by_index(sh,f,param_val,len));
+       }
+
+//             not found
+       return(-1);
+}
+
+/* set parameter value for parameter handle */
+/*     Pass in the parameter in its char string representation. */
+/*  Return value is -1 on error, else 0        */
+gs_int32_t ftaschema_setparam_by_index(gs_schemahandle_t sh, gs_int32_t index,
+                               gs_sp_t param_val, gs_int32_t len){
+
+    void *tmp_ptr;
+       unsigned int ui,d1,d2,d3,d4;
+       int i;
+       unsigned long long int ulli;
+       long long int lli;
+       double f;
+
+
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+    if(index >= schema_list[sh]->param_info.size()){
+       return(-1);
+    }
+
+    param_block_info *pb = &(schema_list[sh]->param_info[index]);
+       switch(pb->pdt->get_type()){
+               case int_t:
+                       if(sscanf(param_val,"%d",&i) == 1){
+                               pb->value.r.i=i;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case u_int_t:
+               case u_short_t:
+               case bool_t:
+                       if(sscanf(param_val,"%u",&ui) == 1){
+                               pb->value.r.ui=ui;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case ip_t:
+                       if(sscanf(param_val,"%d.%d.%d.%d",&d1,&d2,&d3,&d4) == 4){
+                               pb->value.r.ui = (d1 << 24)+(d2 << 16)+(d3 << 8)+d4;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+               case u_llong_t:
+                       if(sscanf(param_val,"%llu",&ulli) == 1){
+                               pb->value.r.ul=ulli;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case llong_t:
+                       if(sscanf(param_val,"%lld",&lli) == 1){
+                               pb->value.r.l=lli;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case floating_t:
+                       if(sscanf(param_val,"%lf",&f) == 1){
+                               pb->value.r.f=f;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case timeval_t:
+                       if(sscanf(param_val,"(%d,%d)",&d1, &d2) == 2){
+                               pb->value.r.t.tv_sec = d1;
+                               pb->value.r.t.tv_usec = d2;
+                               pb->value_set = true;
+                               return(0);
+                       }else
+                               return(-1);
+                       break;
+               case v_str_t:
+                       if(pb->value.r.vs.offset != 0){
+                               tmp_ptr = (void *)(pb->value.r.vs.offset);
+                               free(tmp_ptr);
+                       }
+                       tmp_ptr = malloc(len);
+                       pb->value.r.vs.offset = (gs_p_t)tmp_ptr;
+                       memcpy(tmp_ptr,param_val, len);
+                       pb->value.r.vs.length = len;
+//                     pb->value.r.vs.reserved = 0;
+                       pb->value.r.vs.reserved = INTERNAL;
+                       pb->value_set = true;
+                       return(0);
+                       break;
+               case fstring_t:
+                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");
+                       exit(1);
+                       break;
+               case ipv6_t:
+                       fprintf(stderr,"ERROR, ipv6_t parameters not supported.\n");
+                       exit(1);
+                       break;
+               case undefined_t:
+                       fprintf(stderr,"INTERNAL ERROR undefined_t type in ftaschema_setparam_by_index\n");
+                       exit(1);
+               default:
+                       fprintf(stderr,"INTERNAL ERROR unknown type in ftaschema_setparam_by_index\n");
+                       exit(1);
+       }
+
+       return(-1);
+}
+
+gs_int32_t ftaschema_create_param_block(gs_schemahandle_t sh, void ** block, gs_int32_t * size){
+       if(sh < 0 || sh >= schema_list.size()){
+               return(-1);
+       }
+
+       *size = schema_list[sh]->min_param_size;
+       int p;
+
+       for(p=0;p<schema_list[sh]->param_info.size();++p){
+               if(! schema_list[sh]->param_info[p].value_set) return 1;
+
+               switch(schema_list[sh]->param_info[p].pdt->get_type()){
+               case v_str_t:
+                       *size += schema_list[sh]->param_info[p].value.r.vs.length;
+                       break;
+               case fstring_t:
+                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");
+                       exit(1);
+                       break;
+               case undefined_t:
+                       return(-1);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       *block = malloc(*size);
+       if(*block == NULL) return(-1);
+
+       int data_pos = schema_list[sh]->min_param_size;
+
+       gs_int32_t tmp_int;
+       gs_uint32_t tmp_uint;
+       gs_int64_t tmp_ll;
+       gs_uint64_t tmp_ull;
+       gs_float_t tmp_f;
+       timeval tmp_tv;
+       vstring32 tmp_vstr;
+       void *tmp_ptr;
+
+       for(p=0;p<schema_list[sh]->param_info.size();++p){
+               param_block_info *pb = &(schema_list[sh]->param_info[p]);
+               switch(pb->pdt->get_type()){
+                       case int_t:
+//                             tmp_int = htonl(pb->value.r.i);
+                               tmp_int = pb->value.r.i;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_int,sizeof(gs_int32_t));
+                               break;
+                       case u_int_t:
+                       case u_short_t:
+                       case bool_t:
+                       case ip_t:
+//                             tmp_uint = htonl(pb->value.r.ui);
+                               tmp_uint = pb->value.r.ui;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_uint,sizeof(gs_uint32_t));
+                               break;
+                       case u_llong_t:
+//                             tmp_ull = htonll(pb->value.r.ul);
+                               tmp_ull = pb->value.r.ul;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_ull,sizeof(gs_uint64_t));
+                               break;
+                       case llong_t:
+//                             tmp_ll = htonll(pb->value.r.l);
+                               tmp_ll = pb->value.r.l;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_ll,sizeof(gs_int64_t));
+                               break;
+                       case floating_t:
+//                             tmp_f = ntohf(pb->value.r.f);
+                               tmp_f = pb->value.r.f;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_f,sizeof(gs_float_t));
+                               break;
+                       case timeval_t:
+//                             tmp_tv.tv_sec = htonl(pb->value.r.t.tv_sec);
+//                             tmp_tv.tv_usec = htonl(pb->value.r.t.tv_usec);
+                               tmp_tv.tv_sec = pb->value.r.t.tv_sec;
+                               tmp_tv.tv_usec =pb->value.r.t.tv_usec;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_tv,sizeof(timeval));
+                               break;
+                       case v_str_t:
+//                             tmp_vstr.offset = htonl(data_pos);
+//                             tmp_vstr.length = htonl(pb->value.r.vs.length);
+                               tmp_vstr.offset = data_pos;
+                               tmp_vstr.length = pb->value.r.vs.length;
+//                             tmp_vstr.reserved = htonl(pb->value.r.vs.reserved);
+//                             tmp_vstr.reserved = htonl(PACKED);
+                               tmp_vstr.reserved = PACKED;
+                               memcpy(((gs_sp_t)(*block))+pb->offset,&tmp_vstr,sizeof(vstring32));
+                               tmp_ptr = (void *)(pb->value.r.vs.offset);
+                               memcpy(((gs_sp_t)(*block))+data_pos, tmp_ptr, pb->value.r.vs.length);
+                               data_pos += pb->value.r.vs.length;
+                               break;
+               case fstring_t:
+                       fprintf(stderr,"ERROR, fstring parameters not supported, use vstring.\n");
+                       exit(1);
+                       break;
+               case ipv6_t:
+                       fprintf(stderr,"ERROR, ipv6_t parameters not supported.\n");
+                       exit(1);
+                       break;
+               case undefined_t:
+                       fprintf(stderr,"INTERNAL ERROR undefined_t type in ftaschema_setparam_by_index\n");
+                       exit(1);
+               default:
+                       fprintf(stderr,"INTERNAL ERROR unknown type in ftaschema_create_param_block\n");
+                       exit(1);
+               }
+       }
+       return(0);
+
+}
+
+
+///////////////////////////////////////////////////////////////
+//             Diagnostic functions
+
+void ftaschema_debugdump(gs_int32_t handle){
+       if(handle<0){
+               printf("ftaschema_debugdump: handle is negative.\n");
+               return;
+       }
+       if(handle >= schema_list.size()){
+               printf("ftaschema_debugdump: handle out of bounds (%d, max is %lu)\n",
+                               handle, schema_list.size());
+       }
+
+       query_rep *q = schema_list[handle];
+
+       printf("Handle is %d, query name is <%s>\n",handle,q->name.c_str());
+       printf("Output tuple has %lu fields:\n",q->field_info.size());
+       int f;
+       for(f=0;f<q->field_info.size();++f){
+               printf("\t%s (%s) : %d\n",q->field_info[f].field_name.c_str(),
+                       (q->field_info[f].pdt->get_type_str()).c_str(),
+                       q->field_info[f].offset
+                       );
+       }
+       printf("Min tuple size is %d\n\n",q->min_tuple_size);
+       printf("Param block is:\n");
+       int p;
+       for(p=0;p<q->param_info.size();++p){
+               printf("\t%s (%s) : %d\n",q->param_info[p].param_name.c_str(),
+                       (q->param_info[p].pdt->get_type_str()).c_str(),
+                       q->param_info[p].offset
+                       );
+       }
+       printf("Min param block size is %d\n\n",q->min_param_size);
+
+
+
+}
+
+