-/* ------------------------------------------------
-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