C++ Example: Using Session Parameters

The RowCount example uses a user-defined session parameter, also called RowCount. This parameter counts the total number of rows processed by the UDx each time it runs. RowCount then displays the aggregate number of rows processed for all executions.

#include <string>
#include <sstream>
#include <iostream>
#include "Vertica.h"
#include "VerticaUDx.h"
				
using namespace Vertica;
				
class RowCount : public Vertica::ScalarFunction
{
private:
	int rowCount;
	int count;

public:

	virtual void setup(Vertica::ServerInterface &srvInterface, const Vertica::SizedColumnTypes &argTypes) {
		ParamReader pSessionParams = srvInterface.getUDSessionParamReader("library");
		std::string rCount = pSessionParams.containsParameter("rowCount")?
			pSessionParams.getStringRef("rowCount").str(): "0";
		rowCount=atoi(rCount.c_str());
	
	}
	virtual void processBlock(Vertica::ServerInterface &srvInterface, Vertica::BlockReader &arg_reader, Vertica::BlockWriter &res_writer) {
	
		count = 0;
		if(arg_reader.getNumCols() != 2)							
			vt_report_error(0, "Function only accepts two arguments, but %zu provided", arg_reader.getNumCols());
		
		do {
			const Vertica::vint a = arg_reader.getIntRef(0);
			const Vertica::vint b = arg_reader.getIntRef(1);
			res_writer.setInt(a+b);
			count++;
			res_writer.next();
		} while (arg_reader.next());
			
		srvInterface.log("count %d", count);	
		
		}
		
		virtual void destroy(ServerInterface &srvInterface, const SizedColumnTypes &argTypes, SessionParamWriterMap &udParams) {
			rowCount = rowCount + count;
		
			std:ostringstream s;
			s << rowCount;
			const std::string i_as_string(s.str());
		
			udParams.getUDSessionParamWriter("library").getStringRef("rowCount").copy(i_as_string);
			
		}
};
				
class RowCountsInfo : public Vertica::ScalarFunctionFactory {
	virtual Vertica::ScalarFunction *createScalarFunction(Vertica::ServerInterface &srvInterface)
	{ return Vertica::vt_createFuncObject<RowCount>(srvInterface.allocator);
	}
	
	virtual void getPrototype(Vertica::ServerInterface &srvInterface, Vertica::ColumnTypes &argTypes, Vertica::ColumnTypes &returnType)
	{
		argTypes.addInt();
		argTypes.addInt();
		returnType.addInt();
	}
};

RegisterFactory(RowCountsInfo);