Changeset 43
- Timestamp:
- 11/10/07 17:23:34 (10 months ago)
- Files:
-
- vowfsc/Makefile (modified) (2 diffs)
- vowfsc/db.c (modified) (29 diffs)
- vowfsc/db.h (modified) (5 diffs)
- vowfsc/dir.db (modified) (1 diff)
- vowfsc/file.db (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
vowfsc/Makefile
r41 r43 2 2 @echo made $@ 3 3 4 db: db.o 5 gcc db.o-o db4 db: db.o xdelta3.o 5 gcc xdelta3.o db.o -lpq -o db 6 6 7 7 xdelta: xdelta.o xdelta3.o … … 9 9 10 10 db.o: db.c db.h file.db dir.db stream.db 11 gcc db.c -c 11 gcc db.c -c -w 12 12 13 13 xdelta3.o: xdelta3.c xdelta3.h xdelta3-cfgs.h xdelta3-list.h xdelta3-decode.h vowfsc/db.c
r42 r43 4 4 struct{ 5 5 #define db( type, name ) int name; 6 #define db_string( type,name ) int name;6 #define db_string( name ) int name; 7 7 #include "file.db" 8 8 } file_format; … … 11 11 struct{ 12 12 #define db( type, name ) int name; 13 #define db_string( type,name ) int name;13 #define db_string( name ) int name; 14 14 #include "dir.db" 15 15 } dir_format; 16 16 int NUM_DIR_FIELDS; 17 18 struct{ 19 #define db( type, name ) int name; 20 #define db_string( name ) int name; 21 #include "stream.db" 22 } stream_format; 23 int NUM_STREAM_FIELDS; 17 24 18 25 … … 30 37 31 38 // Begin fuction implementation 32 char *normalize_dir_name( char *dir_name ){ // <- Tested39 char *normalize_dir_name( char *dir_name ){ 33 40 list *temp, *list_tail, *list_head; 34 41 list_tail=list_head=malloc(sizeof(list)); … … 114 121 115 122 123 int db_get_max_file_revision( int file_id ){ 124 // Make the request 125 char pq_request[BUFFER_SIZE]; 126 sprintf(pq_request,"SELECT MAX(revision_id) " 127 "FROM file " 128 "WHERE file_id = \'%i\'", 129 file_id); 130 PGresult *res=PQexec(pq_conn,pq_request); 131 132 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 133 134 // The result should be in the first row of the first column 135 int revision=*(int*)PQgetvalue(res,0,0); 136 137 PQfreemem(res); 138 139 return revision; 140 } 141 142 143 116 144 int db_get_file_id( char *file_path ){ 117 145 // Find the last '/' 118 146 char *file_name=NULL; 119 while( *file_path ){147 while( *file_path++ ) 120 148 if( *file_path =='/' ) 121 149 file_name=file_path+1; 122 ++file_path;123 }124 150 125 151 // Copy and normalize the directory name 126 152 char *tmp_dir_name=malloc(file_name-file_path); 127 memcpy(tmp_dir_name,file_path,file_name-file_path) :153 memcpy(tmp_dir_name,file_path,file_name-file_path); 128 154 char *dir_name=normalize_dir_name(tmp_dir_name); 129 155 free(tmp_dir_name); … … 148 174 149 175 150 file_t db_get_file( int file_id ){151 file_t stat;176 file_t *db_get_file( int file_id ){ 177 file_t *stat=malloc(sizeof(file_t)); 152 178 153 179 char pq_request[BUFFER_SIZE]; … … 177 203 178 204 // Fill stat 179 #define db(type, name) stat .name = *(type*)PQgetvalue(res, 0, file_format.name );180 #define db_string(name) stat .name = strdup(PQgetvalue(res, 0, file_format.name ));205 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, file_format.name ); 206 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, file_format.name )); 181 207 #include "file.db" 182 208 … … 187 213 188 214 189 file_t db_get_file( int file_id, int revision ){190 file_t stat;215 file_t *db_get_file_rev( int file_id, int revision ){ 216 file_t *stat=malloc(sizeof(file_t)); 191 217 192 218 char pq_request[BUFFER_SIZE]; … … 217 243 218 244 // Fill stat 219 #define db(type, name) stat .name = *(type*)PQgetvalue(res, /*row*/, file_format.name );220 #define db_string(name) stat .name = strdup(PQgetvalue(res, /*row*/, file_format.name ));245 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, file_format.name ); 246 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, file_format.name )); 221 247 #include "file.db" 222 248 … … 224 250 225 251 return stat; 226 }227 228 int db_get_max_file_revision( int file_id ){229 // Make the request230 char pq_request[BUFFER_SIZE];231 sprintf(pq_request,"SELECT MAX(revision_id) "232 "FROM file "233 "WHERE file_id = \'%i\'",234 file_id);235 PGresult *res=PQexec(pq_conn,pq_request);236 237 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL;238 239 // The result should be in the first row of the first column240 int revision=*(int*)PQgetvalue(res,0,0);241 242 PQfreemem(res);243 244 return revision;245 246 252 } 247 253 … … 252 258 "WHERE file_id = \'%i\'" 253 259 "AND revision_id = (SELECT MAX(revision_id) FROM file WHERE file_id = 'some_id')", 254 file_id ,revision);260 file_id); 255 261 PGresult *res=PQexec(pq_conn,pq_request); 256 262 … … 267 273 268 274 269 char *db_get_file_ data( int file_id, int revision ){270 int i = get_max_file_revision(file_id);275 char *db_get_file_rev_data( int file_id, int revision ){ 276 int i = db_get_max_file_revision(file_id); 271 277 char *data, *diff, *temp; 272 278 … … 282 288 283 289 int data_len=PQgetlength(res,0,0), diff_len, temp_len; 284 char *data=malloc(data_len), *temp, *diff;290 data=malloc(data_len); 285 291 memcpy(data,PQgetvalue(res,0,0),data_len); 286 292 … … 326 332 "FROM directory " 327 333 "WHERE directory_path = \'%s\' " 328 "AND revision_id = (SELECT MAX(revision_id) FROM directory WHERE directory_path = 'some_path')" 334 "AND revision_id = (SELECT MAX(revision_id) FROM directory WHERE directory_path = 'some_path')", 329 335 dir_name); 330 336 PGresult *res=PQexec(pq_conn,pq_request); … … 341 347 342 348 343 dir_t db_get_dir( int dir_id ){344 dir_t stat;349 dir_t *db_get_dir( int dir_id ){ 350 dir_t *stat=malloc(sizeof(dir_t)); 345 351 346 352 char pq_request[BUFFER_SIZE]; … … 370 376 371 377 // Fill stat 372 #define db(type, name) stat .name = *(type*)PQgetvalue(res, /*row*/, dir_format.name );373 #define db_string(name) stat .name = strdup(PQgetvalue(res, /*row*/, dir_format.name ));378 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, dir_format.name ); 379 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, dir_format.name )); 374 380 #include "dir.db" 375 381 … … 380 386 381 387 382 dir_t db_get_dir( int dir_id, int revision ){383 dir_t stat;388 dir_t *db_get_dir_rev( int dir_id, int revision ){ 389 dir_t *stat=malloc(sizeof(dir_t)); 384 390 385 391 char pq_request[BUFFER_SIZE]; … … 410 416 411 417 // Fill stat 412 #define db(type, name) stat .name = *(type*)PQgetvalue(res, 0, dir_format.name );413 #define db_string(name) stat .name = strdup(PQgetvalue(res, 0, dir_format.name ));418 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, dir_format.name ); 419 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, dir_format.name )); 414 420 #include "dir.db" 415 421 … … 461 467 462 468 463 stream_t db_get_stream( int stream_id ){464 stream_t stat;469 stream_t *db_get_stream( int stream_id ){ 470 stream_t *stat=malloc(sizeof(stream_t)); 465 471 466 472 char pq_request[BUFFER_SIZE]; … … 490 496 491 497 // Fill stat 492 #define db(type, name) stat.name = *(type*)PQgetvalue(res, 0, stream_format.name ); 493 #define db_string(name) stat.name = strdup(PQgetvalue(res, 0, stream_format.name )); 494 #include "stream.db" 495 496 PQfreemem(res); 497 498 return stat; 499 } 500 501 stream_t db_get_stream( int stream_id, int revision ){ 502 stream_t stat; 503 504 char pq_request[BUFFER_SIZE]; 505 sprintf(pq_request,"SELECT * " 506 "FROM stream " 507 "WHERE stream_id = \'%i\' " 508 "AND revision_id = \'%i\'", 509 stream_id, revision); 510 PGresult *res=PQexec(pq_conn,pq_request); 511 512 if( NUM_FILE_FIELDS ){ 513 NUM_FILE_FIELDS = sizeof(stream_format)/4; 514 515 if( PQnfields(res) != NUM_FILE_FIELDS ){ 516 NUM_FILE_FIELDS = 0; 517 return NULL; 518 } 519 520 // Fill stream_format with column numbers 521 #define db(type, name) stream_format.name = PQfnumber(res, #name ); 522 #define db_string(name) stream_format.name = PQfnumber(res, #name ); 523 #include "stream.db" 524 } 525 526 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 527 528 if( PQnfields(res) != NUM_FILE_FIELDS ) return NULL; 529 530 // Fill stat 531 #define db(type, name) stat.name = *(type*)PQgetvalue(res, 0, stream_format.name ); 532 #define db_string(name) stat.name = strdup(PQgetvalue(res, 0, stream_format.name )); 498 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, stream_format.name ); 499 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, stream_format.name )); 533 500 #include "stream.db" 534 501 … … 622 589 "%i, %i, \'%s\', \'%s\', %i", 623 590 file_uid, file_id, dir_name, file_name, stream_id); 624 PQ exec(pq_conn, pq_request);591 PQfreemem(PQexec(pq_conn, pq_request)); 625 592 626 593 return file_id; … … 631 598 char pq_request[BUFFER_SIZE]; 632 599 sprintf(pq_request, "SELECT * " 600 "FROM directory " 633 601 "WHERE directory_id = %i", 634 602 dir_id); 603 PGresult *res=PQexec(pq_conn,pq_request); 604 635 605 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 636 606 637 607 *length = PQntuples(res); 638 file_t *listing=malloc(*length * sizeof(dir_t)*);608 dir_t *listing=malloc(*length * sizeof(dir_t)); 639 609 640 610 … … 667 637 668 638 669 file_t *db_get_ file_subfiles( int file_id, int *length ){639 file_t *db_get_dir_files( int dir_id, int *length ){ 670 640 char pq_request[BUFFER_SIZE]; 671 641 sprintf(pq_request, "SELECT * " 672 "WHERE fileectory_id = %i", 673 file_id); 642 "FROM file " 643 "WHERE directory_id = %i", 644 dir_id); 645 PGresult *res=PQexec(pq_conn,pq_request); 646 674 647 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 675 648 676 649 *length = PQntuples(res); 677 file_t *listing=malloc(*length * sizeof(file_t) *);650 file_t *listing=malloc(*length * sizeof(file_t)); 678 651 679 652 … … 710 683 "WHERE file_id = %i AND revision_id = %i", 711 684 file_id, revision_id); 712 P Qexec(pq_request);685 PGresult *res = PQexec(pq_conn, pq_request); 713 686 714 687 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; … … 722 695 723 696 int db_remove_file( int file_id ){ 724 file_t file = db_get_file( file_id );697 file_t file = *db_get_file( file_id ); 725 698 726 699 int file_uid = db_get_max_file_uid() + 1; … … 760 733 PQfreemem(PQexec(pq_conn, pq_request)); 761 734 762 return revision;735 return file.revision_id; 763 736 } 764 737 … … 767 740 if( !new_file_path && !new_file_name ) return NULL; 768 741 769 file_t file = db_get_file( file_id );770 771 int file_id = db_get_max_file_id() +1;772 int file_uid = db_get_max_file_uid() + 1;742 file_t file = *db_get_file( file_id ); 743 744 int new_file_id = db_get_max_file_id() + 1; 745 int file_uid = db_get_max_file_uid() + 1; 773 746 774 747 int parent_file_id = db_get_file_uid( file_id, revision_id ); 775 748 776 char *new_dir_name 749 char *new_dir_name; 777 750 if( new_file_path ) 778 751 new_dir_name = normalize_dir_name(new_file_path); 779 752 else 780 new_dir_name = file.directory_ name;753 new_dir_name = file.directory_path; 781 754 int new_dir_id = db_get_dir_id( new_dir_name ); 782 755 … … 795 768 "VALUES " 796 769 "%i, %i, 0, %i, %i, %i, NOW, FALSE, %s, %s, %s", 797 file_uid, file_id, file.file_length, parent_file_id,770 file_uid, new_file_id, file.file_length, parent_file_id, 798 771 file.stream_id, new_file_name, new_dir_name, 799 772 new_dir_id, data); 800 773 PQfreemem(PQexec(pq_conn, pq_request)); 801 774 802 return revision;775 return file.revision_id; 803 776 } 804 777 805 778 806 779 int db_modify_file_stream( int file_id, char *new_stream_name, char *new_stream ){ 807 stream_t stream = db_get_file_stream( file_id );808 file_t file = db_get_file( file_id );780 stream_t stream = *db_get_file_stream( file_id ); 781 file_t file = *db_get_file( file_id ); 809 782 810 783 if( !new_stream_name ) new_stream_name = stream.stream_name; … … 856 829 int db_modify_file_data( int file_id, char *data, int data_len ){ 857 830 if( !data ) return NULL; 831 file_t file = *db_get_file( file_id ); 858 832 859 833 int file_uid = db_get_max_file_uid() +1; … … 899 873 } 900 874 875 stream_t *db_get_file_stream( int file_id ){ 876 stream_t *stat=malloc(sizeof(stream_t)); 877 878 char pq_request[BUFFER_SIZE]; 879 sprintf(pq_request,"SELECT stream_id " 880 "FROM file " 881 "WHERE file_id = \'%i\' " 882 "AND revision_id = MAX( SELECT revision_id FROM file WHERE file_id = \'%i\')", 883 file_id, file_id); 884 PGresult *res=PQexec(pq_conn,pq_request); 885 886 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 887 888 int stream_id = PQgetvalue(res, 0,0); 889 890 PQfreemem(res); 891 892 sprintf(pq_request,"SELECT * " 893 "FROM stram " 894 "WHERE stream_id = \'%i\' ", 895 stream_id); 896 res=PQexec(pq_conn,pq_request); 897 898 if( NUM_STREAM_FIELDS ){ 899 NUM_STREAM_FIELDS = sizeof(stream_format)/4; 900 901 if( PQnfields(res) != NUM_STREAM_FIELDS ){ 902 NUM_STREAM_FIELDS = 0; 903 return NULL; 904 } 905 906 // Fill stream_format with column numbers 907 #define db(type, name) stream_format.name = PQfnumber(res, #name ); 908 #define db_string(name) stream_format.name = PQfnumber(res, #name ); 909 #include "stream.db" 910 } 911 912 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 913 914 if( PQnfields(res) != NUM_STREAM_FIELDS ) return NULL; 915 916 // Fill stat 917 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, stream_format.name ); 918 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, stream_format.name )); 919 #include "stream.db" 920 921 PQfreemem(res); 922 923 return stat; 924 } 925 926 stream_t *db_get_file_rev_stream( int file_id, int revision_id ){ 927 stream_t *stat=malloc(sizeof(stream_t)); 928 929 char pq_request[BUFFER_SIZE]; 930 sprintf(pq_request,"SELECT stream_id " 931 "FROM file " 932 "WHERE file_id = \'%i\' " 933 "AND revision_id = \'%i\' ", 934 file_id, revision_id); 935 PGresult *res=PQexec(pq_conn,pq_request); 936 937 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 938 939 int stream_id = PQgetvalue(res, 0,0); 940 941 PQfreemem(res); 942 943 sprintf(pq_request,"SELECT * " 944 "FROM stram " 945 "WHERE stream_id = \'%i\' ", 946 stream_id); 947 res=PQexec(pq_conn,pq_request); 948 949 if( NUM_STREAM_FIELDS ){ 950 NUM_STREAM_FIELDS = sizeof(stream_format)/4; 951 952 if( PQnfields(res) != NUM_STREAM_FIELDS ){ 953 NUM_STREAM_FIELDS = 0; 954 return NULL; 955 } 956 957 // Fill stream_format with column numbers 958 #define db(type, name) stream_format.name = PQfnumber(res, #name ); 959 #define db_string(name) stream_format.name = PQfnumber(res, #name ); 960 #include "stream.db" 961 } 962 963 if( PQresultStatus(res) != PGRES_TUPLES_OK ) return NULL; 964 965 if( PQnfields(res) != NUM_STREAM_FIELDS ) return NULL; 966 967 // Fill stat 968 #define db(type, name) stat->name = *(type*)PQgetvalue(res, 0, stream_format.name ); 969 #define db_string(name) stat->name = strdup(PQgetvalue(res, 0, stream_format.name )); 970 #include "stream.db" 971 972 PQfreemem(res); 973 974 return stat; 975 } 976 vowfsc/db.h
r40 r43 24 24 25 25 typedef struct dir dir_t; 26 struct dir _t{26 struct dir{ 27 27 #define db( type, name ) type name; 28 28 #define db_string( name ) char *name; … … 57 57 * look at the file.db file. 58 58 */ 59 file_t db_get_file( int file_id );60 file_t db_get_file( int file_id, int revision );59 file_t *db_get_file( int file_id ); 60 file_t *db_get_file_rev( int file_id, int revision ); 61 61 62 62 /* db_get_file_data returns the undiffed data from … … 65 65 */ 66 66 char *db_get_file_data( int file_id ); 67 char *db_get_file_ data( int file_id, int revision );67 char *db_get_file_rev_data( int file_id, int revision ); 68 68 69 69 … … 72 72 * db_get_file_data 73 73 */ 74 char*db_get_file_stream( int file_id );75 char *db_get_file_stream( int file_id, int revision );74 stream_t *db_get_file_stream( int file_id ); 75 stream_t *db_get_file_rev_stream( int file_id, int revision ); 76 76 77 77 /* Looks first to see if the given stream exists, and … … 140 140 * struct, look at the dir.db file. 141 141 */ 142 dir_t db_get_dir( int dir_id );143 dir_t db_get_dir( int dir_id, int revision );142 dir_t *db_get_dir( int dir_id ); 143 dir_t *db_get_dir_rev( int dir_id, int revision ); 144 144 145 145 vowfsc/dir.db
r42 r43 8 8 9 9 db_string(directory_path) 10 vowfsc/file.db
r40 r43 12 12 db_string(file_name) 13 13 db_string(directory_path) 14
