| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /*
- * Copyright (c) 2014, Oculus VR, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- *
- */
- #include "VariadicSQLParser.h"
- #include "BitStream.h"
- #include <stdarg.h>
- using namespace VariadicSQLParser;
- struct TypeMapping
- {
- char inputType;
- const char *type;
- };
- const int NUM_TYPE_MAPPINGS=7;
- TypeMapping typeMappings[NUM_TYPE_MAPPINGS] =
- {
- {'i', "int"},
- {'d', "int"},
- {'s', "text"},
- {'b', "bool"},
- {'f', "numeric"},
- {'g', "double precision"},
- {'a', "bytea"},
- };
- unsigned int GetTypeMappingIndex(char c)
- {
- unsigned int i;
- for (i=0; i < (unsigned int) NUM_TYPE_MAPPINGS; i++ )
- if (typeMappings[i].inputType==c)
- return i;
- return (unsigned int)-1;
- }
- const char* VariadicSQLParser::GetTypeMappingAtIndex(int i)
- {
- return typeMappings[i].type;
- }
- void VariadicSQLParser::GetTypeMappingIndices( const char *format, DataStructures::List<IndexAndType> &indices )
- {
- bool previousCharWasPercentSign;
- unsigned int i;
- unsigned int typeMappingIndex;
- indices.Clear(false, _FILE_AND_LINE_);
- unsigned int len = (unsigned int) strlen(format);
- previousCharWasPercentSign=false;
- for (i=0; i < len; i++)
- {
- if (previousCharWasPercentSign==true )
- {
- typeMappingIndex = GetTypeMappingIndex(format[i]);
- if (typeMappingIndex!=(unsigned int) -1)
- {
- IndexAndType iat;
- iat.strIndex=i-1;
- iat.typeMappingIndex=typeMappingIndex;
- indices.Insert(iat, _FILE_AND_LINE_ );
- }
- }
- previousCharWasPercentSign=format[i]=='%';
- }
- }
- void VariadicSQLParser::ExtractArguments( va_list argptr, const DataStructures::List<IndexAndType> &indices, char ***argumentBinary, int **argumentLengths )
- {
- if (indices.Size()==0)
- return;
- unsigned int i;
- *argumentBinary=RakNet::OP_NEW_ARRAY<char *>(indices.Size(), _FILE_AND_LINE_);
- *argumentLengths=RakNet::OP_NEW_ARRAY<int>(indices.Size(), _FILE_AND_LINE_);
- char **paramData=*argumentBinary;
- int *paramLength=*argumentLengths;
- int variadicArgIndex;
- for (variadicArgIndex=0, i=0; i < indices.Size(); i++, variadicArgIndex++)
- {
- switch (typeMappings[indices[i].typeMappingIndex].inputType)
- {
- case 'i':
- case 'd':
- {
- int val = va_arg( argptr, int );
- paramLength[i]=sizeof(val);
- paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_);
- memcpy(paramData[i], &val, paramLength[i]);
- if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]);
- }
- break;
- case 's':
- {
- char* val = va_arg( argptr, char* );
- paramLength[i]=(int) strlen(val);
- paramData[i]=(char*) rakMalloc_Ex(paramLength[i]+1, _FILE_AND_LINE_);
- memcpy(paramData[i], val, paramLength[i]+1);
- }
- break;
- case 'b':
- {
- bool val = (va_arg( argptr, int )!=0);
- paramLength[i]=sizeof(val);
- paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_);
- memcpy(paramData[i], &val, paramLength[i]);
- if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]);
- }
- break;
- /*
- case 'f':
- {
- // On MSVC at least, this only works with double as the 2nd param
- float val = (float) va_arg( argptr, double );
- //float val = va_arg( argptr, float );
- paramLength[i]=sizeof(val);
- paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_);
- memcpy(paramData[i], &val, paramLength[i]);
- if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]);
- }
- break;
- */
- // On MSVC at least, this only works with double as the 2nd param
- case 'f':
- case 'g':
- {
- double val = va_arg( argptr, double );
- paramLength[i]=sizeof(val);
- paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_);
- memcpy(paramData[i], &val, paramLength[i]);
- if (RakNet::BitStream::IsNetworkOrder()==false) RakNet::BitStream::ReverseBytesInPlace((unsigned char*) paramData[i], paramLength[i]);
- }
- break;
- case 'a':
- {
- char* val = va_arg( argptr, char* );
- paramLength[i]=va_arg( argptr, unsigned int );
- paramData[i]=(char*) rakMalloc_Ex(paramLength[i], _FILE_AND_LINE_);
- memcpy(paramData[i], val, paramLength[i]);
- }
- break;
- }
- }
- }
- void VariadicSQLParser::FreeArguments(const DataStructures::List<IndexAndType> &indices, char **argumentBinary, int *argumentLengths)
- {
- if (indices.Size()==0)
- return;
- unsigned int i;
- for (i=0; i < indices.Size(); i++)
- rakFree_Ex(argumentBinary[i],_FILE_AND_LINE_);
- RakNet::OP_DELETE_ARRAY(argumentBinary,_FILE_AND_LINE_);
- RakNet::OP_DELETE_ARRAY(argumentLengths,_FILE_AND_LINE_);
- }
|