Revision: 70448 http://trac.macports.org/changeset/70448 Author: and.damore@macports.org Date: 2010-08-09 13:21:19 -0700 (Mon, 09 Aug 2010) Log Message: ----------- added to entry.o and entryobj.o functions to read out paths with md5 checksums Modified Paths: -------------- branches/gsoc10-configfiles/base/src/cregistry/entry.c branches/gsoc10-configfiles/base/src/cregistry/entry.h branches/gsoc10-configfiles/base/src/registry2.0/entryobj.c Modified: branches/gsoc10-configfiles/base/src/cregistry/entry.c =================================================================== --- branches/gsoc10-configfiles/base/src/cregistry/entry.c 2010-08-09 19:33:55 UTC (rev 70447) +++ branches/gsoc10-configfiles/base/src/cregistry/entry.c 2010-08-09 20:21:19 UTC (rev 70448) @@ -904,8 +904,8 @@ printf("GSOCDBG: \t\t\tinside first if branch\n"); if (sqlite3_bind_text(stmt, 3, md5sums[i], -1, SQLITE_STATIC) == SQLITE_OK) { + int r; printf("GSOCDBG: \t\t\tinside second if branch\n"); - int r; do { r = sqlite3_step(stmt); switch (r) { @@ -1063,6 +1063,94 @@ } /** + * Gets a list of files provided by the given port. These files are in the port + * image and do not necessarily correspond to active files on the filesystem. + * + * TODO: check that the port's installtype is image + * + * @param [in] entry entry to get the list for + * @param [out] files a list of files provided by the port + * @param [out] md5sums a list of files provided by the port + * @param [out] errPtr on error, a description of the error that occurred + * @return the number of files if success; negative if failure + */ +int reg_entry_imagefiles_with_md5(reg_entry* entry, char*** files, + char*** md5sums, reg_error* errPtr) { + reg_registry* reg = entry->reg; + sqlite3_stmt* stmt = NULL; + char* query = "SELECT path,md5sum FROM registry.files WHERE id=? ORDER BY path"; + if ((sqlite3_prepare(reg->db, query, -1, &stmt, NULL) == SQLITE_OK) + && (sqlite3_bind_int64(stmt, 1, entry->id) == SQLITE_OK)) { + char** result_files = malloc(10*sizeof(char*)); + int result_count_files = 0; + int result_space_files = 10; + char** result_md5sums = malloc(10*sizeof(char*)); + int result_count_md5sums = 0; + int result_space_md5sums = 10; + int r; + const char *text_file; + const char *text_md5sum; + char* element; + + if (!result_files || !result_md5sums) { + return -1; + } + do { + r = sqlite3_step(stmt); + switch (r) { + case SQLITE_ROW: + /* here we're accessing the SQL statement data */ + text_file = (const char*)sqlite3_column_text(stmt, 0); + if (text_file) { + element = strdup(text_file); + if (!element || !reg_listcat((void***)&result_files, &result_count_files, &result_space_files, element)) { + r = SQLITE_ERROR; + } + } + text_md5sum = (const char*)sqlite3_column_text(stmt, 1); + if (text_md5sum) { + element = strdup(text_md5sum); + if (!element || !reg_listcat((void***)&result_md5sums, &result_count_md5sums, &result_space_md5sums, element)) { + r = SQLITE_ERROR; + } + } + break; + case SQLITE_DONE: + case SQLITE_BUSY: + break; + default: + reg_sqlite_error(reg->db, errPtr, query); + break; + } + } while (r == SQLITE_ROW || r == SQLITE_BUSY); + sqlite3_finalize(stmt); + if (r == SQLITE_DONE) { + *files = result_files; + *md5sums = result_md5sums; + /* this is lacking result_count_md5sums, shouldn't be necessary */ + return result_count_files; + } else { + int i; + for (i=0; i<result_count_files; i++) { + free(result_files[i]); + } + for (i=0; i<result_count_md5sums; i++) { + free(result_md5sums[i]); + } + free(result_files); + free(result_md5sums); + return -1; + } + } else { + reg_sqlite_error(reg->db, errPtr, query); + if (stmt) { + sqlite3_finalize(stmt); + } + return -1; + } +} + +/** * Gets a list of files owned by the given port. These files are active in the * filesystem and could be different from the port's imagefiles. * @@ -1131,6 +1219,95 @@ } /** + * Gets a list of files owned by the given port. These files are active in the + * filesystem and could be different from the port's imagefiles. + * + * TODO: check that the port is active + * + * @param [in] entry entry to get the list for + * @param [out] files a list of files owned by the port + * @param [out] md5sums a list of files provided by the port + * @param [out] errPtr on error, a description of the error that occurred + * @return the number of files if success; negative if failure + */ +int reg_entry_files_with_md5(reg_entry* entry, char*** files, char*** md5sums, + reg_error* errPtr) { + reg_registry* reg = entry->reg; + sqlite3_stmt* stmt = NULL; + char* query = "SELECT actual_path,md5sum FROM registry.files WHERE id=? " + "AND active ORDER BY actual_path"; + if ((sqlite3_prepare(reg->db, query, -1, &stmt, NULL) == SQLITE_OK) + && (sqlite3_bind_int64(stmt, 1, entry->id) == SQLITE_OK)) { + char** result_files = malloc(10*sizeof(char*)); + int result_count_files = 0; + int result_space_files = 10; + char** result_md5sums = malloc(10*sizeof(char*)); + int result_count_md5sums = 0; + int result_space_md5sums = 10; + int r; + const char *text_file; + const char *text_md5sum; + char* element; + + if (!result_files || !result_md5sums) { + return -1; + } + do { + r = sqlite3_step(stmt); + switch (r) { + case SQLITE_ROW: + /* here we're accessing the SQL statement data */ + text_file = (const char*)sqlite3_column_text(stmt, 0); + if (text_file) { + element = strdup(text_file); + if (!element || !reg_listcat((void***)&result_files, &result_count_files, &result_space_files, element)) { + r = SQLITE_ERROR; + } + } + text_md5sum = (const char*)sqlite3_column_text(stmt, 1); + if (text_md5sum) { + element = strdup(text_md5sum); + if (!element || !reg_listcat((void***)&result_md5sums, &result_count_md5sums, &result_space_md5sums, element)) { + r = SQLITE_ERROR; + } + } + break; + case SQLITE_DONE: + case SQLITE_BUSY: + break; + default: + reg_sqlite_error(reg->db, errPtr, query); + break; + } + } while (r == SQLITE_ROW || r == SQLITE_BUSY); + sqlite3_finalize(stmt); + if (r == SQLITE_DONE) { + *files = result_files; + *md5sums = result_md5sums; + /* this is lacking result_count_md5sums, shouldn't be necessary */ + return result_count_files; + } else { + int i; + for (i=0; i<result_count_files; i++) { + free(result_files[i]); + } + for (i=0; i<result_count_md5sums; i++) { + free(result_md5sums[i]); + } + free(result_files); + free(result_md5sums); + return -1; + } + } else { + reg_sqlite_error(reg->db, errPtr, query); + if (stmt) { + sqlite3_finalize(stmt); + } + return -1; + } +} + +/** * Sets an entry's files as being active in the filesystem. This entry will be * subsequently returned by `reg_entry_owner` on those files' path. If all files * are being activated as the names they are in the registry, then `as_files` Modified: branches/gsoc10-configfiles/base/src/cregistry/entry.h =================================================================== --- branches/gsoc10-configfiles/base/src/cregistry/entry.h 2010-08-09 19:33:55 UTC (rev 70447) +++ branches/gsoc10-configfiles/base/src/cregistry/entry.h 2010-08-09 20:21:19 UTC (rev 70448) @@ -84,7 +84,11 @@ int reg_entry_files(reg_entry* entry, char*** files, reg_error* errPtr); int reg_entry_imagefiles(reg_entry* entry, char*** files, reg_error* errPtr); - +int reg_entry_files_with_md5( + reg_entry* entry, char*** files, char*** md5sums, reg_error* errPtr); +int reg_entry_imagefiles_with_md5( + reg_entry* entry, char*** files, char*** md5sums, reg_error* errPtr); + int reg_entry_activate(reg_entry* entry, char** files, char** as_files, int file_count, reg_error* errPtr); int reg_entry_deactivate(reg_entry* entry, char** files, int file_count, Modified: branches/gsoc10-configfiles/base/src/registry2.0/entryobj.c =================================================================== --- branches/gsoc10-configfiles/base/src/registry2.0/entryobj.c 2010-08-09 19:33:55 UTC (rev 70447) +++ branches/gsoc10-configfiles/base/src/registry2.0/entryobj.c 2010-08-09 20:21:19 UTC (rev 70448) @@ -266,6 +266,43 @@ } } +static int entry_obj_files_with_md5(Tcl_Interp* interp, reg_entry* entry, int objc, + Tcl_Obj* CONST objv[]) { + reg_registry* reg = registry_for(interp, reg_attached); + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "files_with_md5"); + return TCL_ERROR; + } else if (reg == NULL) { + return TCL_ERROR; + } else { + char** files; + char** md5sums; + reg_error error; + /* call to entry.c function */ + int file_count = reg_entry_files_with_md5(entry, &files, &md5sums, &error); + int i; + if (file_count >= 0) { + Tcl_Obj** objs; + int retval = TCL_ERROR; + if (list_string_to_obj(&objs, files, file_count, &error)) { + Tcl_Obj* result = Tcl_NewListObj(file_count, objs); + /* sending the result to Tcl, an object in this case */ + Tcl_SetObjResult(interp, result); + free(objs); + retval = TCL_OK; + } else { + retval = registry_failed(interp, &error); + } + for (i=0; i<file_count; i++) { + free(files[i]); + } + free(files); + return retval; + } + return registry_failed(interp, &error); + } +} + static int entry_obj_imagefiles(Tcl_Interp* interp, reg_entry* entry, int objc, Tcl_Obj* CONST objv[]) { reg_registry* reg = registry_for(interp, reg_attached); @@ -300,6 +337,41 @@ } } +static int entry_obj_imagefiles_with_md5(Tcl_Interp* interp, reg_entry* entry, int objc, + Tcl_Obj* CONST objv[]) { + reg_registry* reg = registry_for(interp, reg_attached); + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "imagefiles_with_md5"); + return TCL_ERROR; + } else if (reg == NULL) { + return TCL_ERROR; + } else { + char** files; + char** md5sums; + reg_error error; + int file_count = reg_entry_imagefiles_with_md5(entry, &files, &md5sums, &error); + int i; + if (file_count >= 0) { + Tcl_Obj** objs; + int retval = TCL_ERROR; + if (list_string_to_obj(&objs, files, file_count, &error)) { + Tcl_Obj* result = Tcl_NewListObj(file_count, objs); + Tcl_SetObjResult(interp, result); + free(objs); + retval = TCL_OK; + } else { + retval = registry_failed(interp, &error); + } + for (i=0; i<file_count; i++) { + free(files[i]); + } + free(files); + return retval; + } + return registry_failed(interp, &error); + } +} + static int entry_obj_activate(Tcl_Interp* interp, reg_entry* entry, int objc, Tcl_Obj* CONST objv[]) { reg_registry* reg = registry_for(interp, reg_attached); @@ -462,7 +534,9 @@ { "map_with_md5", entry_obj_filemap_with_md5 }, { "unmap", entry_obj_filemap }, { "files", entry_obj_files }, + { "files_with_md5", entry_obj_files_with_md5 }, { "imagefiles", entry_obj_imagefiles }, + { "imagefiles_with_md5", entry_obj_imagefiles_with_md5 }, { "activate", entry_obj_activate }, { "deactivate", entry_obj_filemap }, /* dep map */ @@ -483,7 +557,6 @@ int entry_obj_cmd(ClientData clientData, Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) { int cmd_index; - int len=0; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "cmd ?arg ...?"); return TCL_ERROR;
participants (1)
-
and.damore@macports.org