Added quantiling UDAFs
[com/gs-lite.git] / src / ftacmp / schemaparser.cc
index 246aae3..ceb16eb 100644 (file)
-/* ------------------------------------------------
-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);
-
-
-
-}
-
-
+/* ------------------------------------------------\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