예제 #1
0
void VertexServer_requestHandler(void *arg)  
{  
	VertexServer *self = (VertexServer *)arg;
	VertexServer_setupYajl(self); 
	
	HttpResponse_setContentType_(self->httpResponse, "application/json;charset=utf-8");

	int result = VertexServer_process(self);
	Datum *content = HttpResponse_content(self->httpResponse);
	
	if (result == 0)
	{
		if (!Datum_size(content)) 
		{
			Datum_setCString_(content, "null");
		}
		Datum_nullTerminate(content); 
	}
	else
	{
		if (!Datum_size(content)) 
		{
			Datum_setCString_(content, "\"unknown error\"");
		}
		Datum_nullTerminate(content); 
		
		yajl_gen_clear(self->yajl);
		yajl_gen_datum(self->yajl, content);
		Datum_setYajl_(content, self->yajl);
				
		if(self->debug) { Log_Printf_("REQUEST ERROR: %s\n", Datum_data(content)); }
	}
}
예제 #2
0
void HttpRequest_parseUri_(HttpRequest *self, const char *uri)
{
	Datum_setCString_(self->uri, uri);
	
	int index;
	Datum *uriDatum = Datum_poolNew();
	Datum_setCString_(uriDatum, uri);
	
	//if (self->debug) { Log_Printf_("request: %s\n", uri); }
	
	CHash_clear(self->query);
	
	Datum_setSize_(self->uriPath, 0);
	index = Datum_from_beforeChar_into_(uriDatum, 1, '?', self->uriPath);
	Datum_decodeUri(self->uriPath);
	
	for (;;)
	{
		Datum *key   = Datum_poolNew();
		Datum *value = Datum_poolNew();
		
		index = Datum_from_beforeChar_into_(uriDatum, index + 1, '=', key);
		Datum_decodeUri(key);
		Datum_nullTerminate(key);
		if (Datum_size(key) == 0) break;
		
		index = Datum_from_beforeChar_into_(uriDatum, index + 1, '&', value);
		Datum_decodeUri(value);
		Datum_nullTerminate(value);

		CHash_at_put_(self->query, key, value);
		
		if(self->requestParameterCallback)
		{
			self->requestParameterCallback(self->delegate, key, value);
		}
		
		if (Datum_size(value) == 0) break;
	}	
}
예제 #3
0
int VertexServer_api_queuePopTo(VertexServer *self)
{
	PNode *fromNode = PDB_allocNode(self->pdb);
	PNode *toNode   = PDB_allocNode(self->pdb);
	Datum *toPath   = HttpRequest_queryValue_(self->httpRequest, "toPath");
	
	long ttl = Datum_asLong(HttpRequest_queryValue_(self->httpRequest, "ttl"));
	
	if (PNode_moveToPathIfExists_(fromNode, HttpRequest_uriPath(self->httpRequest)) != 0) 
	{
		VertexServer_setErrorCString_(self, "from path does not exist: ");
		VertexServer_appendError_(self, HttpRequest_uriPath(self->httpRequest));
		return -1;
	}

	PNode_moveToPath_(toNode, toPath);
	
	//printf("to   pid: %s\n", Datum_data(PNode_pid(toNode)));
	//printf("from pid: %s\n", Datum_data(PNode_pid(fromNode)));
	
	{
		PQuery *q = PNode_query(fromNode);
		VertexServer_setupPQuery_(self, q);
		PNode_startQuery(fromNode);
	
		Datum *k = PQuery_key(q);
		Datum *v = PNode_value(fromNode);
		
		if (k)
		{
			PNode_atPut_(toNode, k, v);
			PNode_moveToKey_(toNode, k);

			// insert queue time
			{
				long now = time(NULL);
				
				Datum *timeKey   = Datum_poolNewWithCString_("_qtime");
				Datum *timeValue = Datum_poolNew();
				
				Datum_fromLong_(timeValue, now);
				PNode_atPut_(toNode, timeKey, timeValue);
				
				Datum_setCString_(timeKey, "_qexpire");
				Datum_fromLong_(timeValue, now + (ttl == 0 ? 3600 : ttl));
				PNode_atPut_(toNode, timeKey, timeValue);
			}
			
			//printf("queueing key %s\n", Datum_data(k));
			yajl_gen_datum(self->yajl, k);
			PNode_removeAt_(fromNode, k);
		}
		else
		{
			yajl_gen_null(self->yajl);
		}
	}
	
	Datum_appendYajl_(self->result, self->yajl);
	
	return 0;
}
예제 #4
0
void PNode_setPidCString_(PNode *self, const char *pid)
{
	Datum_setCString_(self->pid, pid);
	PNode_setPathsFromPid(self);
}
예제 #5
0
void File_setPathCString_(File *self, const char *path)
{
	Datum_setCString_(self->path, path);
}
예제 #6
0
void Datum_encodeUri(Datum *self)
{
	char *k = evhttp_encode_uri(Datum_data(self));
	Datum_setCString_(self, k);
	free(k);
}