4. Resource
4.1. Struct
A wmp_resource
is a record from the resource table.
Any thing that is a thing has a record here. The only things
that a resource stores is the UUID and the type flag.
typedef struct wmp_resource wmp_resource;
struct wmp_resource {
unsigned int id;
int type;
int prog;
};
void wmp_resource_init(wmp_resource *r);
void wmp_resource_init(wmp_resource *r)
{
r->id = 0;
r->type = -1;
r->prog = -1;
}
4.2. Finding a Resource
The function wmp_find_resource
will find a resource with
a particular UUID and place store the values in the
wmp_resource
struct. If the return value is false (0),
then there was a problem finding the resource.
int wmp_find_resource(wmp_core *c,
unsigned int uuid,
wmp_resource *r,
int prog);
No free function is needed here, since this struct does not need to store any strings.
int wmp_find_resource(wmp_core *c,
unsigned int uuid,
wmp_resource *r,
int prog)
{
sqlite3 *db;
sqlite3_stmt *stmt;
int type;
int rc;
db = wmp_core_db(c);
sqlite3_prepare_v2(db,
"SELECT type FROM resources "
"WHERE id==?1 and "
"program == ?2",
-1,
&stmt,
NULL);
sqlite3_bind_int(stmt, 1, uuid);
sqlite3_bind_int(stmt, 2, prog);
rc = sqlite3_step(stmt);
if (rc == SQLITE_DONE) {
sqlite3_finalize(stmt);
return 0;
}
if (rc == SQLITE_ROW) {
type = sqlite3_column_int(stmt, 0);
r->id = uuid;
r->type = type;
r->prog = prog;
} else {
fprintf(stderr, "Error: %s\n", sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return 0;
}
sqlite3_finalize(stmt);
return 1;
}
4.3. Resource Type to String
Returns a human readable string from the type.
const char *wmp_resource_typestring(wmp_resource *r);
const char *wmp_resource_typestring(wmp_resource *r)
{
switch(r->type) {
case 0:
return "File";
case 1:
return "Block";
case 2:
return "Segment";
}
return "Unknown";
}
4.4. Find last significant ID of program
The last ID of a program can be reasonably assumed to be
the greatest ID of a program, this can be found using
the MAX
argument. The last significant id of a program
can be the largest resource ID whose type is one of the org
structure types: header, content, or block reference. By the
time it reaches this ID, it knows it is done rendering
documents. Any of the resources with a larger ID will be
rendered implicitely (such as a segment inside of a code
block). The MAX
SQLite function is still used, but on a
special view created for this very purpose called orglist
.
unsigned int wmp_resource_last(wmp_core *c, wmp_resource *r, int prog);
unsigned int wmp_resource_last(wmp_core *c, wmp_resource *r, int prog)
{
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
unsigned int last;
db = wmp_core_db(c);
last = 0;
sqlite3_prepare_v2(db,
"SELECT MAX(id) from orglist "
"where program == ?1;",
-1,
&stmt,
NULL);
sqlite3_bind_int(stmt, 1, prog);
rc = sqlite3_step(stmt);
if (rc == SQLITE_DONE) {
sqlite3_finalize(stmt);
return 0;
}
if (rc == SQLITE_ROW) {
last = sqlite3_column_int(stmt, 0);
}
if (r != NULL) {
rc = wmp_find_resource(c, last, r, prog);
if (!rc) last = 0;
}
sqlite3_finalize(stmt);
return last;
}
4.5. Find top ID of program
Needed for headerless single-page renders in weewiki.
Similar to wmp_header_top
.
unsigned int wmp_resource_top(wmp_core *c, wmp_resource *r, int prog);
unsigned int wmp_resource_top(wmp_core *c, wmp_resource *r, int prog)
{
sqlite3 *db;
sqlite3_stmt *stmt;
int rc;
int top;
db = wmp_core_db(c);
top = 0;
sqlite3_prepare_v2(db,
"SELECT MIN(id) from resources "
"where program == ?1;",
-1,
&stmt,
NULL);
sqlite3_bind_int(stmt, 1, prog);
rc = sqlite3_step(stmt);
if (rc == SQLITE_DONE) {
sqlite3_finalize(stmt);
return 0;
}
if (rc == SQLITE_ROW) {
top = sqlite3_column_int(stmt, 0);
}
sqlite3_finalize(stmt);
if (r != NULL) {
rc = wmp_find_resource(c, top, r, prog);
if (!rc) top = 0;
}
return top;
}
prev | home | next