fixed root cause of return value problems, and generally reinstated

rhizome_retrieve_manifest() functionality from master that got
clobbered in the merge.  Simple wrappers now exist for the
rhizome_retrieve_manifest_by_*() functions.
This commit is contained in:
gardners 2013-01-18 15:15:15 +10:30
parent 20e955c5ff
commit 4c73f6ea41
5 changed files with 65 additions and 113 deletions

View File

@ -1288,11 +1288,12 @@ int app_rhizome_extract_bundle(int argc, const char *const *argv, const struct c
if (bskhex && fromhexstr(bsk.binary, bskhex, RHIZOME_BUNDLE_KEY_BYTES) == -1) if (bskhex && fromhexstr(bsk.binary, bskhex, RHIZOME_BUNDLE_KEY_BYTES) == -1)
return WHYF("invalid bsk: \"%s\"", bskhex); return WHYF("invalid bsk: \"%s\"", bskhex);
rhizome_manifest *m = NULL; rhizome_manifest *m = rhizome_new_manifest();
ret = rhizome_retrieve_manifest_bybidhex(manifestIdUpper, &m); ret = rhizome_retrieve_manifest_by_bidhex(manifestIdUpper, m);
DEBUGF("ret=%d",ret);
if (ret==1){ if (ret==0){
// ignore errors when extracting private key // ignore errors when extracting private key
rhizome_extract_privatekey(m, NULL); rhizome_extract_privatekey(m, NULL);
const char *blob_service = rhizome_manifest_get(m, "service", NULL, 0); const char *blob_service = rhizome_manifest_get(m, "service", NULL, 0);

View File

@ -316,9 +316,8 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
int rhizome_manifest_to_bar(rhizome_manifest *m,unsigned char *bar); int rhizome_manifest_to_bar(rhizome_manifest *m,unsigned char *bar);
long long rhizome_bar_version(unsigned char *bar); long long rhizome_bar_version(unsigned char *bar);
unsigned long long rhizome_bar_bidprefix_ll(unsigned char *bar); unsigned long long rhizome_bar_bidprefix_ll(unsigned char *bar);
int rhizome_retrieve_manifest_bybidhex(char *bidhex,rhizome_manifest **tmp); int rhizome_retrieve_manifest_by_bidhex(char *bidhex,rhizome_manifest *m);
int rhizome_retrieve_manifest_by_bar(unsigned char *bar, int rhizome_retrieve_manifest_by_bar(unsigned char *bar,rhizome_manifest *m);
rhizome_manifest **tmp);
int rhizome_retrieve_file(const char *fileid, const char *filepath, int rhizome_retrieve_file(const char *fileid, const char *filepath,
const unsigned char *key); const unsigned char *key);
int rhizome_list_manifests(const char *service, const char *name, int rhizome_list_manifests(const char *service, const char *name,

View File

@ -109,6 +109,8 @@ int rhizome_read_manifest_file(rhizome_manifest *m, const char *filename, int bu
m->manifest_all_bytes=m->manifest_bytes; m->manifest_all_bytes=m->manifest_bytes;
dump("read manifest",m->manifestdata,m->manifest_all_bytes);
/* Parse out variables, signature etc */ /* Parse out variables, signature etc */
int have_service = 0; int have_service = 0;
int have_id = 0; int have_id = 0;
@ -751,4 +753,4 @@ int rhizome_fill_manifest(rhizome_manifest *m, const char *filepath, const sid_t
} }
return 0; return 0;
} }

View File

@ -834,6 +834,7 @@ int64_t rhizome_store_bundle(rhizome_manifest *m)
filehash[0] = '\0'; filehash[0] = '\0';
} }
dump("m->author",m->author,SID_SIZE);
const char *author = is_sid_any(m->author) ? NULL : alloca_tohex_sid(m->author); const char *author = is_sid_any(m->author) ? NULL : alloca_tohex_sid(m->author);
const char *name = rhizome_manifest_get(m, "name", NULL, 0); const char *name = rhizome_manifest_get(m, "name", NULL, 0);
const char *sender = rhizome_manifest_get(m, "sender", NULL, 0); const char *sender = rhizome_manifest_get(m, "sender", NULL, 0);
@ -1339,115 +1340,62 @@ int rhizome_find_duplicate(const rhizome_manifest *m, rhizome_manifest **found,
/* Retrieve a manifest from the database, given its manifest ID. /* Retrieve a manifest from the database, given its manifest ID.
* *
* Returns 1 if manifest is found (if mp != NULL then a new manifest struct is allocated, made * Returns 0 if manifest is found
* finalisable and * assigned to *mp, caller is responsible for freeing). * Returns 1 if manifest is not found
* Returns 0 if manifest is not found (*mp is unchanged). * Returns -1 on error
* Returns -1 on error (*mp is unchanged). * Caller is responsible for allocating and freeing rhizome_manifest
*/ */
int rhizome_retrieve_manifest_by_bar(unsigned char *bar, int rhizome_retrieve_manifest(const char *manifestpattern, rhizome_manifest *m){
rhizome_manifest **tmp) int ret=0;
sqlite_retry_state retry = SQLITE_RETRY_STATE_DEFAULT;
sqlite3_stmt *statement = sqlite_prepare(&retry, "SELECT manifest, version, inserttime, author FROM manifests WHERE id LIKE ?");
if (!statement)
return -1;
sqlite3_bind_text(statement, 1, manifestpattern, -1, SQLITE_STATIC);
if (sqlite_step_retry(&retry, statement) == SQLITE_ROW){
const char *manifestblob = (char *) sqlite3_column_blob(statement, 0);
long long q_version = (long long) sqlite3_column_int64(statement, 1);
long long q_inserttime = (long long) sqlite3_column_int64(statement, 2);
const char *q_author = (const char *) sqlite3_column_text(statement, 3);
size_t manifestblobsize = sqlite3_column_bytes(statement, 0); // must call after sqlite3_column_blob()
if (rhizome_read_manifest_file(m, manifestblob, manifestblobsize)){
ret=WHYF("Manifest matching %s exists but is invalid", manifestpattern);
goto done;
}
if (q_author){
if (stowSid(m->author, 0, q_author) == -1)
WARNF("Manifest %s contains invalid author=%s -- ignored", manifestpattern, alloca_str_toprint(q_author));
}
if (m->version!=q_version)
WARNF("Version mismatch, manifest is %lld, database is %lld", m->version, q_version);
m->inserttime = q_inserttime;
}else{
INFOF("Manifest %s was not found", manifestpattern);
ret=1;
}
done:
sqlite3_finalize(statement);
return ret;
}
int rhizome_retrieve_manifest_by_bar(unsigned char *bar,rhizome_manifest *m)
{ {
/* Obtain Manifest by prefix */ /* Obtain Manifest by prefix */
char bid_low[RHIZOME_MANIFEST_ID_STRLEN+1]; char bid_pattern[RHIZOME_MANIFEST_ID_STRLEN+1+1];
char bid_high[RHIZOME_MANIFEST_ID_STRLEN+1]; tohex(bid_pattern,&bar[RHIZOME_BAR_PREFIX_OFFSET],RHIZOME_BAR_PREFIX_BYTES);
int i; bid_pattern[RHIZOME_BAR_PREFIX_BYTES*2]='%';
tohex(bid_low,&bar[RHIZOME_BAR_PREFIX_OFFSET],RHIZOME_BAR_PREFIX_BYTES); bid_pattern[RHIZOME_BAR_PREFIX_BYTES*2+1]=0;
tohex(bid_high,&bar[RHIZOME_BAR_PREFIX_OFFSET],RHIZOME_BAR_PREFIX_BYTES); return rhizome_retrieve_manifest(bid_pattern, m);
for(i=RHIZOME_BAR_PREFIX_BYTES*2;i<RHIZOME_MANIFEST_ID_STRLEN;i++) {
bid_low[i]='0';
bid_high[i]='F';
}
bid_low[RHIZOME_MANIFEST_ID_STRLEN]=0;
bid_high[RHIZOME_MANIFEST_ID_STRLEN]=0;
// DEBUGF("Looking for manifest between %s and %s",bid_low,bid_high);
long long rowid = -1;
sqlite3_blob *blob=NULL;
sqlite_exec_int64(&rowid, "select rowid from manifests where id between '%s' and '%s';", bid_low,bid_high);
if (rowid >= 0 && sqlite3_blob_open(rhizome_db, "main", "manifests", "manifest", rowid, 0, &blob) != SQLITE_OK)
rowid = -1;
if (rowid == -1) {
DEBUGF("Row not found");
return -1;
}
// Extract manifest from blob
char buffer[1024];
int bytes=sqlite3_blob_bytes(blob);
if (bytes>1024||bytes<1) {
sqlite3_blob_close(blob);
return -1;
}
if (sqlite3_blob_read(blob,&buffer[0],bytes,0)!=SQLITE_OK)
{
sqlite3_blob_close(blob);
return -1;
}
*tmp=rhizome_new_manifest();
if (!*tmp) {
sqlite3_blob_close(blob);
return -1;
}
if (rhizome_read_manifest_file(*tmp,buffer,bytes))
{
rhizome_manifest_free(*tmp);
*tmp=NULL;
sqlite3_blob_close(blob);
return -1;
}
sqlite3_blob_close(blob);
return 1;
} }
/* Retrieve a manifest from the database, given its manifest ID. int rhizome_retrieve_manifest_by_bidhex(char *bidhex,rhizome_manifest *m)
*
* Returns 1 if manifest is found (if mp != NULL then a new manifest struct is allocated, made
* finalisable and * assigned to *mp, caller is responsible for freeing).
* Returns 0 if manifest is not found (*mp is unchanged).
* Returns -1 on error (*mp is unchanged).
*/
int rhizome_retrieve_manifest_bybidhex(char *bidhex,rhizome_manifest **tmp)
{ {
long long rowid = -1; return rhizome_retrieve_manifest(bidhex, m);
sqlite3_blob *blob=NULL;
sqlite_exec_int64(&rowid, "select rowid from manifests where id = '%s';", bidhex);
if (rowid >= 0 && sqlite3_blob_open(rhizome_db, "main", "manifests", "manifest", rowid, 0, &blob) != SQLITE_OK)
rowid = -1;
if (rowid == -1) {
DEBUGF("Row not found");
return -1;
}
// Extract manifest from blob
char buffer[1024];
int bytes=sqlite3_blob_bytes(blob);
if (bytes>1024||bytes<1) {
sqlite3_blob_close(blob);
return -1;
}
if (sqlite3_blob_read(blob,&buffer[0],bytes,0)!=SQLITE_OK)
{
sqlite3_blob_close(blob);
return -1;
}
*tmp=rhizome_new_manifest();
if (!*tmp) {
sqlite3_blob_close(blob);
return -1;
}
if (rhizome_read_manifest_file(*tmp,buffer,bytes))
{
rhizome_manifest_free(*tmp);
*tmp=NULL;
sqlite3_blob_close(blob);
return -1;
}
sqlite3_blob_close(blob);
return 1;
} }

View File

@ -800,6 +800,7 @@ setup_ImportOwnBundle() {
setup_rhizome setup_rhizome
echo "Hello from B" >fileB echo "Hello from B" >fileB
executeOk_servald rhizome add file $SIDB2 '' fileB fileB.manifest executeOk_servald rhizome add file $SIDB2 '' fileB fileB.manifest
assertGrep fileB.manifest "^BK="
assert_stdout_add_file fileB assert_stdout_add_file fileB
extract_manifest_id manifestid fileB.manifest extract_manifest_id manifestid fileB.manifest
extract_manifest_version version fileB.manifest extract_manifest_version version fileB.manifest
@ -810,6 +811,7 @@ setup_ImportOwnBundle() {
} }
test_ImportOwnBundle() { test_ImportOwnBundle() {
executeOk_servald rhizome import bundle fileB fileB.manifest executeOk_servald rhizome import bundle fileB fileB.manifest
tfw_cat --stderr
assert_stdout_import_bundle fileB assert_stdout_import_bundle fileB
# Bundle author and sender are unknown, so appears not to be from here # Bundle author and sender are unknown, so appears not to be from here
executeOk_servald rhizome list executeOk_servald rhizome list