200 lines of code with embedded c. (headers omitted)
This code comes up and reads triples from a table view called self, reads
triples one at a time.  The triples are either a configure and load sql
statement command, or the triple is executed, as a random sql procedure
doing whatever, Rinse and repeat.  The code uses a call  back gfun.

// G engine

#include "stdafx.h"
#include "sqlite3.h"
#include "g.h"
#include "exec.h"

int counter = 0;
M m;
int debug(char * s) {
char c;
if(DEBUG) {
printf("%s \n Top Op: %d Status: %d Sel Row: %d\n G: " ,
s,m.top.link,m.status,m.self_rowid); c = getchar();
if(c == 'q') exit(0);
}
return(0);
}
void gerror(char * c) {printf("%s error %d\n",m.status,c);}
const VAR vars[] = {
{&m.self_rowid ,2  , "self_row" } ,
{&m.other_rowid ,2  , "other_row" } ,
{&m.result_rowid ,2  , "result_row" }
};
OP operands[OPERMAX];
void tableswap() {
char buff[200];
m.iself^=1;
sprintf_s(buff,"%s\n",
"alter table other_alias rename to temp;"
"alter table self_alias rename to other_alias;"
"alter table temp rename to self_alias");
m.status = sqlite3_exec(m.db,buff,0,0,0);
m.self_rowid = m.rowid[m.iself];
m.other_rowid = m.rowid[m.iself ^1];
}

//triple bind, unbind
void print_triple(TRIPLE t) {
printf("Triple: %s %d %d\n",t.key,t.link,t.pointer);
}

int  bind_triple(sqlite3_stmt *stmt,TRIPLE t) {
m.status = sqlite3_bind_text(stmt,0,t.key,strlen(t.key),0);
m.status = sqlite3_bind_int(stmt,1,t.link);
m.status = sqlite3_bind_int(stmt,2,t.pointer);
return m.status;
}
void unbind_triple(sqlite3_stmt *stmt,TRIPLE *t) {
 t->key = (const char *) sqlite3_column_text( stmt, 0);
t->link= sqlite3_column_int(stmt, 1);
t->pointer= sqlite3_column_int(stmt, 2);
}

// install key at installed operand position pointer
int  config(TRIPLE t) {
int ivar;
const char * ch = t.key;
switch(t.pointer)  {
case 0: //opcode pointer
m.variable = atoi(ch);
if((OPERMAX < m.variable) && (m.variable  < USERMIN))
return(SQLITE_MISUSE);
operands[m.variable].callback =  0;
operands[m.variable].vp[0] = 0;
//debug("Newop");
break;
case 1: // install user script
m.status =
sqlite3_prepare_v2(m.db,ch,strlen(ch)+1, &operands[m.variable].stmt,0);
break;
case 2: //properties
operands[m.variable].properties= atoi(t.key);
break;
default: // g parameters
ivar = t.pointer -3;
if(0 < ivar && ivar < OPERMAX)
operands[m.variable].vp[ivar] = atoi(t.key);
break;
}
if((m.status != SQLITE_OK) && (m.status != SQLITE_ROW))
gerror("config");
return m.status;
}
void gfunction(sqlite3_context* p,int n,sqlite3_value** v) {

int op = sqlite3_value_int(v[0]);
int x = sqlite3_value_int(v[1]);
//printf("gfun: %d %d\n",x,m.self_rowid);

switch(op) {
case 0:
sqlite3_result_int(p, m.self_rowid+1);
break;
case 1:
sqlite3_result_int(p, m.other_rowid);
break;
case 2:
sqlite3_result_int(p, m.result_rowid);
break;
}
}
// Something did a select and sent data to G
int ghandler(TRIPLE t) {  //links are system wih no sql
// All jumps an some pointer arithmetic and config go here
if(debug("Ghandle")) return(G_RESTART);
if( (m.status != SQLITE_ROW) && (m.status != SQLITE_DONE) && (m.status ==
SQLITE_OK)  )
 gerror("ghandle");
if(m.status == SQLITE_DONE) {
if(m.rowcount > 0)
m.self_rowid += m.rowcount;
m.rowcount = 0;
m.top = m.called;
m.called = POP_TRIPLE;
    return(m.status);
}
TRIPLE node;
unbind_triple(m.op->stmt,&node);
if(m.top.link != G_POP) {
printf("Foreign data\n");
print_triple(node);
} else {
m.rowcount++;
print_triple(node);
if(node.link == G_CONFIG)
m.status = config(node);
else
m.called = node;
}
return m.status;
}

void read_triples() {
int i,j;
void * p;
m.op = &operands[m.top.link];

 for(i=0; m.op->vp[i]; i++ ) {
j = m.op->vp[i]-1;
p =  vars[j].location;
if(vars[j].type == 1)
m.status = sqlite3_bind_text(m.op->stmt,i+1,(char *) p,strlen((char *)
p),0);
else if(vars[j].type == 2)
m.status = sqlite3_bind_int(m.op->stmt,i+1,*(int*) p);
else if(vars[j].type == 3)
m.status = bind_triple(m.op->stmt,*(TRIPLE *)p);
}
if(m.status == SQLITE_OK) {
do {

if(m.op->stmt)
m.status = sqlite3_step(m.op->stmt );
m.status = ghandler(m.top);
if(m.status == G_RESTART) return;
}  while( m.status == SQLITE_ROW || (m.status == SQLITE_OK) );
if(m.op->stmt)
m.status = sqlite3_reset(m.op->stmt);
}
else gerror("bind \n");
}
void init_gbase() {
   m.status = sqlite3_open(GBASE,&m.db);
   debug("Gbase");
    m.status = sqlite3_create_function_v2(m.db,GFUN,2,SQLITE_UTF8
,0,gfunction,0,0,
 NULL);
   m.status = sqlite3_prepare_v2(m.db,POP_SQL,  strlen(POP_SQL),
&operands[G_POP].stmt,0);
     m.status = sqlite3_prepare_v2(m.db,TEST_SQL,  strlen(TEST_SQL),
&operands[G_TEST].stmt,0);

}

int _tmain(int argc, _TCHAR* argv[])
{
init_dll();
init_gbase();
m.top=POP_TRIPLE;
for(;;) {
 m.status = SQLITE_OK;
m.called = POP_TRIPLE;
if(m.status == G_RESTART)
m.self_rowid=0;
read_triples();}
}
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to