@ -259,9 +259,9 @@ static int db_chain_hash_at(struct DB_SYNC_INSTANCE* si, uint32_t pos, uint8_t o
return - 1 ;
}
sqlite3_bind_int64 ( stmt , 1 , ( sqlite3_int64 ) pos ) ;
if ( sqlite3_step ( stmt ) ! = SQLITE_ROW ) { sqlite3_finalize ( stmt ) ; return - 1 ; }
if ( sqlite3_step ( stmt ) ! = SQLITE_ROW ) { DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " chain_hash_at no row pos=%u tbl=%s " , pos , SI_TBL ( si ) ) ; sqlite3_finalize ( stmt ) ; return - 1 ; }
const void * b = sqlite3_column_blob ( stmt , 0 ) ;
if ( ! b | | sqlite3_column_bytes ( stmt , 0 ) < 32 ) { sqlite3_finalize ( stmt ) ; return - 1 ; }
if ( ! b | | sqlite3_column_bytes ( stmt , 0 ) < 32 ) { DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " chain_hash_at blob too small pos=%u tbl=%s " , pos , SI_TBL ( si ) ) ; sqlite3_finalize ( stmt ) ; return - 1 ; }
memcpy ( out , b , 32 ) ;
sqlite3_finalize ( stmt ) ;
return 0 ;
@ -288,8 +288,9 @@ static int db_prev_chain_hash(struct DB_SYNC_INSTANCE* si, uint64_t ts, const ui
" SELECT chain_hash FROM \" %s \" "
" WHERE timestamp<?1 OR (timestamp=?1 AND author_signature<?2) "
" ORDER BY timestamp DESC, author_signature DESC "
" LIMIT 1 " ) ! = SQLITE_OK )
return - 1 ;
" LIMIT 1 " ) ! = SQLITE_OK ) {
DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_prev_chain_hash prep: %s " , sqlite3_errmsg ( SI_DB ( si ) ) ) ;
return - 1 ; }
sqlite3_bind_int64 ( stmt , 1 , ( sqlite3_int64 ) ts ) ;
sqlite3_bind_blob ( stmt , 2 , author_sig , DB_SIG_SIZE , SQLITE_STATIC ) ;
if ( sqlite3_step ( stmt ) = = SQLITE_ROW ) {
@ -332,13 +333,13 @@ static void db_cascade_from(struct DB_SYNC_INSTANCE* si, uint32_t from_pos)
" SELECT id,timestamp,node_id,author_signature FROM \" %s \" "
" ORDER BY timestamp, author_signature "
" LIMIT -1 OFFSET ? " ) ! = SQLITE_OK )
{ sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return ; }
{ DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_cascade_from SELECT prep: %s " , sqlite3_errmsg ( db ) ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return ; }
sqlite3_bind_int64 ( sel , 1 , ( sqlite3_int64 ) from_pos ) ;
if ( si_prep ( si , & upd ,
" UPDATE \" %s \" SET chain_hash=? "
" WHERE timestamp=? AND author_signature=? " ) ! = SQLITE_OK )
{ sqlite3_finalize ( sel ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return ; }
{ DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_cascade_from UPDATE prep: %s " , sqlite3_errmsg ( db ) ) ; sqlite3_finalize ( sel ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return ; }
uint8_t ch [ 32 ] ;
while ( sqlite3_step ( sel ) = = SQLITE_ROW ) {
@ -435,7 +436,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
// Check if record already exists by (timestamp, author_signature)
if ( si_prep ( si , & stmt , " SELECT 1 FROM \" %s \" WHERE timestamp=? AND author_signature=? " ) ! = SQLITE_OK )
{ sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
{ DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_record_insert SELECT prep: %s " , sqlite3_errmsg ( db ) ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
sqlite3_bind_int64 ( stmt , 1 , ( sqlite3_int64 ) ts ) ;
sqlite3_bind_blob ( stmt , 2 , author_sig , DB_SIG_SIZE , SQLITE_STATIC ) ;
int exists = ( sqlite3_step ( stmt ) = = SQLITE_ROW ) ;
@ -454,7 +455,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
" (timestamp,node_id,id,chain_hash,flags,data, "
" author_signature,delivered_peers,delivery_chain) "
" VALUES (?,?,?,?,0,?,?,0,'') " ) ! = SQLITE_OK )
{ sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
{ DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_record_insert INSERT prep: %s " , sqlite3_errmsg ( db ) ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
sqlite3_bind_int64 ( stmt , 1 , ( sqlite3_int64 ) ts ) ;
sqlite3_bind_int64 ( stmt , 2 , ( sqlite3_int64 ) author_node_id ) ;
sqlite3_bind_int64 ( stmt , 3 , ( sqlite3_int64 ) id ) ;
@ -474,7 +475,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
" WHERE timestamp>?1 "
" OR (timestamp=?1 AND author_signature>?2) "
" ORDER BY timestamp, author_signature " ) ! = SQLITE_OK )
{ sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
{ DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_record_insert cascade SELECT prep: %s " , sqlite3_errmsg ( db ) ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
sqlite3_bind_int64 ( sel , 1 , ( sqlite3_int64 ) ts ) ;
sqlite3_bind_blob ( sel , 2 , author_sig , DB_SIG_SIZE , SQLITE_STATIC ) ;
@ -482,7 +483,7 @@ static int db_record_insert(struct DB_SYNC_INSTANCE* si,
if ( si_prep ( si , & upd ,
" UPDATE \" %s \" SET chain_hash=? "
" WHERE timestamp=? AND author_signature=? " ) ! = SQLITE_OK )
{ sqlite3_finalize ( sel ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
{ DEBUG_ERROR ( DEBUG_CATEGORY_DB_SYNC , " db_record_insert cascade UPDATE prep: %s " , sqlite3_errmsg ( db ) ) ; sqlite3_finalize ( sel ) ; sqlite3_exec ( db , " ROLLBACK " , NULL , NULL , NULL ) ; return - 1 ; }
uint8_t rch [ 32 ] ; memcpy ( rch , ch , 32 ) ;
while ( sqlite3_step ( sel ) = = SQLITE_ROW ) {
@ -890,20 +891,20 @@ static int si_parse_record(const uint8_t** pp, const uint8_t* end,
uint32_t * rdlen , const uint8_t * * rdata ,
const uint8_t * * rsig , int * rsiglen )
{
if ( * pp + 28 > end ) return - 1 ; // 8+8+8+4 = 28
if ( * pp + 28 > end ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " si_parse_record: truncated header, need 28 have %td " , end - * pp ) ; return - 1 ; }
* rid = * ( uint64_t * ) * pp ; * pp + = 8 ;
* rts = * ( uint64_t * ) * pp ; * pp + = 8 ;
* rauthor = * ( uint64_t * ) * pp ; * pp + = 8 ;
* rdlen = * ( uint32_t * ) * pp ; * pp + = 4 ;
if ( * pp + * rdlen > end ) return - 1 ;
if ( * pp + * rdlen > end ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " si_parse_record: data overrun dlen=%u have=%td " , * rdlen , end - * pp ) ; return - 1 ; }
* rdata = ( * rdlen > 0 ) ? * pp : NULL ;
* pp + = * rdlen ;
if ( * pp + 1 > end ) return - 1 ;
if ( * pp + 1 > end ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " si_parse_record: sig_len overrun " ) ; return - 1 ; }
* rsiglen = ( int ) ( * ( * pp ) + + ) ;
if ( * rsiglen > 0 ) {
if ( * pp + * rsiglen > end ) return - 1 ;
if ( * pp + * rsiglen > end ) { DEBUG_WARN ( DEBUG_CATEGORY_DB_SYNC , " si_parse_record: sig data overrun slen=%d have=%td " , * rsiglen , end - * pp ) ; return - 1 ; }
* rsig = * pp ;
* pp + = * rsiglen ;
} else {