@ -130,19 +130,22 @@ static int _member_update_bucket_hash(void* ctx, const char* ns, uint8_t level,
uint8_t addrs [ 2048 ] ; int addr_off = 0 ; int addr_count = 0 ;
sqlite3_stmt * as = NULL ;
sqlite3_prepare_v2 ( db ,
" SELECT family, socket_id, address, port FROM node_addresses WHERE node_id=? AND addr_type=0 "
" SELECT family, socket_id, protocol, address, port FROM node_addresses WHERE node_id=? AND addr_type=0 "
" ORDER BY family, address, port " , - 1 , & as , NULL ) ;
if ( as ) {
sqlite3_bind_int64 ( as , 1 , ( sqlite3_int64 ) nid ) ;
while ( sqlite3_step ( as ) = = SQLITE_ROW & & addr_off < ( int ) sizeof ( addrs ) - 8 ) {
while ( sqlite3_step ( as ) = = SQLITE_ROW & & addr_off < ( int ) sizeof ( addrs ) - 9 ) {
int fam = sqlite3_column_int ( as , 0 ) ;
int sid = sqlite3_column_int ( as , 1 ) ;
int proto = sqlite3_column_int ( as , 2 ) ;
int ip_sz = fam = = 4 ? 4 : 16 ;
if ( addr_off + 3 + ip_sz + 2 > ( int ) sizeof ( addrs ) ) break ;
addrs [ addr_off + + ] = ( uint8_t ) fam ;
addrs [ addr_off + + ] = ( uint8_t ) sid ;
int ip_sz = fam = = 4 ? 4 : 16 ;
memcpy ( addrs + addr_off , sqlite3_column_blob ( as , 2 ) , ( size_t ) ip_sz ) ;
addrs [ addr_off + + ] = ( uint8_t ) proto ;
memcpy ( addrs + addr_off , sqlite3_column_blob ( as , 3 ) , ( size_t ) ip_sz ) ;
addr_off + = ip_sz ;
uint16_t p = ( uint16_t ) sqlite3_column_int ( as , 3 ) ;
uint16_t p = ( uint16_t ) sqlite3_column_int ( as , 4 ) ;
addrs [ addr_off + + ] = ( uint8_t ) ( p > > 8 ) ;
addrs [ addr_off + + ] = ( uint8_t ) ( p & 0xFF ) ;
addr_count + + ;
@ -202,20 +205,23 @@ static int _member_get_items(void* ctx, const char* ns, uint8_t level,
sqlite3_stmt * as = NULL ;
sqlite3_prepare_v2 ( db ,
" SELECT family, socket_id, address, port FROM node_addresses WHERE node_id=? AND addr_type=0 "
" SELECT family, socket_id, protocol, address, port FROM node_addresses WHERE node_id=? AND addr_type=0 "
" ORDER BY family, address, port " , - 1 , & as , NULL ) ;
uint8_t addrs [ 2048 ] ; int addr_off = 0 ; int addr_count = 0 ;
if ( as ) {
sqlite3_bind_int64 ( as , 1 , ( sqlite3_int64 ) nid ) ;
while ( sqlite3_step ( as ) = = SQLITE_ROW & & addr_off < ( int ) sizeof ( addrs ) - 8 ) {
while ( sqlite3_step ( as ) = = SQLITE_ROW & & addr_off < ( int ) sizeof ( addrs ) - 9 ) {
int fam = sqlite3_column_int ( as , 0 ) ;
int sid = sqlite3_column_int ( as , 1 ) ;
int proto = sqlite3_column_int ( as , 2 ) ;
int ip_sz = fam = = 4 ? 4 : 16 ;
if ( addr_off + 3 + ip_sz + 2 > ( int ) sizeof ( addrs ) ) break ;
addrs [ addr_off + + ] = ( uint8_t ) fam ;
addrs [ addr_off + + ] = ( uint8_t ) sid ;
int ip_sz = fam = = 4 ? 4 : 16 ;
memcpy ( addrs + addr_off , sqlite3_column_blob ( as , 2 ) , ( size_t ) ip_sz ) ;
addrs [ addr_off + + ] = ( uint8_t ) proto ;
memcpy ( addrs + addr_off , sqlite3_column_blob ( as , 3 ) , ( size_t ) ip_sz ) ;
addr_off + = ip_sz ;
uint16_t p = ( uint16_t ) sqlite3_column_int ( as , 3 ) ;
uint16_t p = ( uint16_t ) sqlite3_column_int ( as , 4 ) ;
addrs [ addr_off + + ] = ( uint8_t ) ( p > > 8 ) ;
addrs [ addr_off + + ] = ( uint8_t ) ( p & 0xFF ) ;
addr_count + + ;
@ -325,6 +331,7 @@ static int _member_apply_items(void* ctx, const char* ns, uint64_t from_peer,
for ( int a = 0 ; a < ( int ) ac & & mrem > = ( size_t ) ( 2 + consumed ) ; a + + ) {
uint8_t fam = mp [ consumed ] ; consumed + + ;
uint8_t sid = mp [ consumed ] ; consumed + + ;
uint8_t proto = mp [ consumed ] ; consumed + + ;
int sz = fam = = 4 ? 4 : 16 ;
consumed + = sz + 2 ;
}