bitmapper 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/bitmapper/bit_mapper_wrap.c +24 -13
- data/ext/bitmapper/bit_mapper_wrap.h +8 -3
- data/ext/bitmapper/bitmapper.c +37 -12
- metadata +2 -2
| @@ -29,7 +29,8 @@ void allocate_map(Bitmapper* map, int index_len){ | |
| 29 29 | 
             
              map->bkt_size = pow(10, 10 - index_len);
         | 
| 30 30 | 
             
              map->bkt_count = size;
         | 
| 31 31 | 
             
              map->index_len = index_len;
         | 
| 32 | 
            -
              map-> | 
| 32 | 
            +
              map->filter_enabled = 0;
         | 
| 33 | 
            +
              map->filter_status = bit_bucket_create(size);
         | 
| 33 34 | 
             
              sprintf(map->fill_str, "%%llu%%0%illu\n",10-index_len);
         | 
| 34 35 | 
             
            }
         | 
| 35 36 |  | 
| @@ -46,19 +47,29 @@ void free_map(Bitmapper* map){ | |
| 46 47 | 
             
                  map->bkts[i] = NULL;
         | 
| 47 48 | 
             
                }
         | 
| 48 49 | 
             
              }
         | 
| 49 | 
            -
              if(map-> | 
| 50 | 
            +
              if(map->filter_status != NULL) bit_bucket_free(map->filter_status);
         | 
| 50 51 | 
             
              if(map->bkts != NULL) free(map->bkts);
         | 
| 51 52 | 
             
            }
         | 
| 52 53 |  | 
| 53 | 
            -
            void  | 
| 54 | 
            -
               | 
| 55 | 
            -
              map->white_list_char = (char*)malloc(sizeof(char));
         | 
| 56 | 
            -
              map->white_list_char[0] = c;
         | 
| 54 | 
            +
            void enable_filter(Bitmapper* map){
         | 
| 55 | 
            +
              map->filter_enabled = 1;
         | 
| 57 56 | 
             
            }
         | 
| 58 57 |  | 
| 59 | 
            -
            void  | 
| 60 | 
            -
               | 
| 61 | 
            -
             | 
| 58 | 
            +
            void disable_filter(Bitmapper* map){
         | 
| 59 | 
            +
              map->filter_enabled = 0;
         | 
| 60 | 
            +
            }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            int set_in_filter(Bitmapper* map, unsigned long long int number){
         | 
| 63 | 
            +
              map->filter_enabled = 1;
         | 
| 64 | 
            +
              return bit_bucket_set_bit(map->filter_status, number);
         | 
| 65 | 
            +
            }
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            int status_for_filter(Bitmapper* map, unsigned long long int number){
         | 
| 68 | 
            +
              return bit_bucket_get_bit(map->filter_status, number);
         | 
| 69 | 
            +
            }
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            int clear_in_filter(Bitmapper* map, unsigned long long int number){
         | 
| 72 | 
            +
              return bit_bucket_clear_bit(map->filter_status, number);
         | 
| 62 73 | 
             
            }
         | 
| 63 74 |  | 
| 64 75 | 
             
            /*
         | 
| @@ -73,6 +84,7 @@ BitBucket* create_bucket_for(BitBucket* bkt, unsigned long long int size){ | |
| 73 84 |  | 
| 74 85 | 
             
            /*
         | 
| 75 86 | 
             
              Adds the given number to the bucket reperesented by the given index
         | 
| 87 | 
            +
              if filter is enabled and the index is set in filter_status
         | 
| 76 88 | 
             
              @param Bitmapper* the mapepr object to use
         | 
| 77 89 | 
             
              @param unsigned long long int the offset to be added(if the offset is greater
         | 
| 78 90 | 
             
              than bucket size it is rejected)
         | 
| @@ -80,6 +92,7 @@ BitBucket* create_bucket_for(BitBucket* bkt, unsigned long long int size){ | |
| 80 92 | 
             
             */
         | 
| 81 93 | 
             
            int add_num_in_bkt(Bitmapper* map,unsigned long long int offset, unsigned long long int bkt_index){
         | 
| 82 94 | 
             
              if(bkt_index > map->bkt_count) return 1;
         | 
| 95 | 
            +
              if(map->filter_enabled == 1 && status_for_filter(map, bkt_index) == 0) return 0; /* ignore silently */
         | 
| 83 96 | 
             
              if((map->bkts[bkt_index]) == NULL)
         | 
| 84 97 | 
             
                map->bkts[bkt_index] = (BitBucket*)create_bucket_for(map->bkts[bkt_index], map->bkt_size);
         | 
| 85 98 | 
             
              if(bit_bucket_set_bit(map->bkts[bkt_index], offset) != 0){
         | 
| @@ -112,6 +125,7 @@ int add_num(Bitmapper* map,unsigned long long int full_num){ | |
| 112 125 | 
             
            */
         | 
| 113 126 | 
             
            int remove_num_in_bkt(Bitmapper* map,unsigned long long int offset, unsigned long long int bkt_index){
         | 
| 114 127 | 
             
              if(bkt_index > map->bkt_count) return 1;
         | 
| 128 | 
            +
              if(map->filter_enabled == 1 && status_for_filter(map, bkt_index) == 0) return 0; /* ignore silently */
         | 
| 115 129 | 
             
              if(map->bkts[bkt_index] == NULL)
         | 
| 116 130 | 
             
                return 0;
         | 
| 117 131 | 
             
              if(bit_bucket_clear_bit(map->bkts[bkt_index], offset) != 0){
         | 
| @@ -177,10 +191,7 @@ int add_numbers_in_file(Bitmapper* map,FILE *in){ | |
| 177 191 | 
             
              sprintf(scan_str, "%%%is%%%is\n",map->index_len, 10-map->index_len);
         | 
| 178 192 | 
             
              while(fgets(msisdn, 15, in)!=NULL){
         | 
| 179 193 | 
             
                sscanf(msisdn,scan_str, index, rest_num);
         | 
| 180 | 
            -
                 | 
| 181 | 
            -
                }else{
         | 
| 182 | 
            -
                  add_num_in_bkt(map, atoll(rest_num), atoll(index) );
         | 
| 183 | 
            -
                }
         | 
| 194 | 
            +
                add_num_in_bkt(map, atoll(rest_num), atoll(index) );
         | 
| 184 195 | 
             
              }
         | 
| 185 196 | 
             
            }
         | 
| 186 197 |  | 
| @@ -12,16 +12,21 @@ typedef struct Bitmapper{ | |
| 12 12 | 
             
              unsigned long long int bkt_size;   /* size of each bucket in bits */
         | 
| 13 13 | 
             
              /* the format specifier used to dump number to file from buckets */
         | 
| 14 14 | 
             
              int index_len;
         | 
| 15 | 
            -
              char *white_list_char;
         | 
| 16 15 | 
             
              char fill_str[20];
         | 
| 16 | 
            +
              int filter_enabled;
         | 
| 17 | 
            +
              BitBucket* filter_status;
         | 
| 17 18 | 
             
            } Bitmapper;
         | 
| 18 19 |  | 
| 19 20 | 
             
            Bitmapper* create_map();
         | 
| 20 21 | 
             
            void allocate_map(Bitmapper*, int);
         | 
| 21 22 | 
             
            void free_map(Bitmapper*);
         | 
| 22 23 | 
             
            BitBucket* create_bucket_for(BitBucket*, unsigned long long int);
         | 
| 23 | 
            -
             | 
| 24 | 
            -
            void  | 
| 24 | 
            +
             | 
| 25 | 
            +
            void enable_filter(Bitmapper*);
         | 
| 26 | 
            +
            void disable_filter(Bitmapper*);
         | 
| 27 | 
            +
            int set_for_filter(Bitmapper* , unsigned long long int);
         | 
| 28 | 
            +
            int status_for_filter(Bitmapper*, unsigned long long int );
         | 
| 29 | 
            +
            int clear_in_filter(Bitmapper*, unsigned long long int);
         | 
| 25 30 |  | 
| 26 31 | 
             
            int add_num_in_bkt(Bitmapper* ,unsigned long long int, unsigned long long int);
         | 
| 27 32 | 
             
            int add_num(Bitmapper* ,unsigned long long int);
         | 
    
        data/ext/bitmapper/bitmapper.c
    CHANGED
    
    | @@ -192,26 +192,47 @@ VALUE bm_num_status(VALUE self, VALUE num){ | |
| 192 192 | 
             
              return (VALUE)Qfalse;
         | 
| 193 193 | 
             
            }
         | 
| 194 194 |  | 
| 195 | 
            +
            VALUE bm_enable_filter(VALUE self){
         | 
| 196 | 
            +
              Bitmapper* map;
         | 
| 197 | 
            +
              Data_Get_Struct(self, Bitmapper, map);
         | 
| 198 | 
            +
              enable_filter(map);
         | 
| 199 | 
            +
              return self;
         | 
| 200 | 
            +
            }
         | 
| 195 201 |  | 
| 196 | 
            -
            VALUE  | 
| 197 | 
            -
               | 
| 198 | 
            -
               | 
| 202 | 
            +
            VALUE bm_disable_filter(VALUE self){
         | 
| 203 | 
            +
              Bitmapper* map;
         | 
| 204 | 
            +
              Data_Get_Struct(self, Bitmapper, map);
         | 
| 205 | 
            +
              disable_filter(map);
         | 
| 206 | 
            +
              return self;
         | 
| 207 | 
            +
            }
         | 
| 208 | 
            +
             | 
| 209 | 
            +
            VALUE bm_set_filters(VALUE self, VALUE val){
         | 
| 210 | 
            +
              int i;
         | 
| 199 211 | 
             
              Bitmapper* map;
         | 
| 212 | 
            +
              VALUE tmp;
         | 
| 200 213 |  | 
| 214 | 
            +
              if(TYPE(val) != T_ARRAY) rb_raise(rb_eRuntimeError, "Should be of type Array");
         | 
| 201 215 | 
             
              Data_Get_Struct(self, Bitmapper, map);
         | 
| 202 | 
            -
               | 
| 203 | 
            -
             | 
| 204 | 
            -
             | 
| 216 | 
            +
              for(i=0; i< RARRAY_LEN(val); i++){
         | 
| 217 | 
            +
                tmp = RARRAY_PTR(val)[i];
         | 
| 218 | 
            +
                tmp = rb_funcall(tmp, rb_intern("to_s"), 0); /* hack */
         | 
| 219 | 
            +
                set_in_filter(map, bm_to_ll(tmp));
         | 
| 220 | 
            +
              }
         | 
| 205 221 | 
             
              return (VALUE)Qtrue;
         | 
| 206 222 | 
             
            }
         | 
| 207 223 |  | 
| 208 | 
            -
            VALUE  | 
| 209 | 
            -
              int  | 
| 210 | 
            -
              VALUE return_val;
         | 
| 224 | 
            +
            VALUE bm_clear_filters(VALUE self, VALUE val){
         | 
| 225 | 
            +
              int i;
         | 
| 211 226 | 
             
              Bitmapper* map;
         | 
| 227 | 
            +
              VALUE tmp;
         | 
| 212 228 |  | 
| 229 | 
            +
              if(TYPE(val) != T_ARRAY) rb_raise(rb_eRuntimeError, "Should be of type Array");
         | 
| 213 230 | 
             
              Data_Get_Struct(self, Bitmapper, map);
         | 
| 214 | 
            -
               | 
| 231 | 
            +
              for(i=0; i< RARRAY_LEN(val); i++){
         | 
| 232 | 
            +
                tmp = RARRAY_PTR(val)[i];
         | 
| 233 | 
            +
                tmp = rb_funcall(tmp, rb_intern("to_s"), 0); /* hack */
         | 
| 234 | 
            +
                clear_in_filter(map, bm_to_ll(tmp));
         | 
| 235 | 
            +
              }
         | 
| 215 236 | 
             
              return (VALUE)Qtrue;
         | 
| 216 237 | 
             
            }
         | 
| 217 238 |  | 
| @@ -224,8 +245,12 @@ void Init_bitmapper(){ | |
| 224 245 | 
             
              rb_define_method(rb_cBitmapper, "add", bm_add_from_file, 1);
         | 
| 225 246 | 
             
              rb_define_method(rb_cBitmapper, "remove", bm_remove_from_file, 1);
         | 
| 226 247 | 
             
              rb_define_method(rb_cBitmapper, "dump_to", bm_dump_to_file, 1);
         | 
| 227 | 
            -
             | 
| 228 | 
            -
              rb_define_method(rb_cBitmapper, " | 
| 248 | 
            +
             | 
| 249 | 
            +
              rb_define_method(rb_cBitmapper, "enable_filter", bm_enable_filter, 0);
         | 
| 250 | 
            +
              rb_define_method(rb_cBitmapper, "disable_filter", bm_disable_filter, 0);
         | 
| 251 | 
            +
              rb_define_method(rb_cBitmapper, "set_filters", bm_set_filters, 1);
         | 
| 252 | 
            +
              rb_define_method(rb_cBitmapper, "clear_filters", bm_clear_filters, 1);
         | 
| 253 | 
            +
             | 
| 229 254 | 
             
              rb_define_method(rb_cBitmapper, "load_from_str", bm_load_str_to_bkt, 2);
         | 
| 230 255 | 
             
              rb_define_method(rb_cBitmapper, "dump_to_str", bm_dump_bkt_str, 2);
         | 
| 231 256 |  | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: bitmapper
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.2
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-07- | 
| 12 | 
            +
            date: 2012-07-16 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies: []
         | 
| 14 14 | 
             
            description: A fast, in-memory, bit map filter!
         | 
| 15 15 | 
             
            email: gouthamvel@gmail.com
         |