Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=xfcetesting.git;a=commitdiff;h=67714f3be08187de788741df24be6836a195c3b6
commit 67714f3be08187de788741df24be6836a195c3b6 Author: James Buren <[email protected]> Date: Tue Oct 2 02:54:03 2012 -0500 searchabi: import new implementation of manual ABI search diff --git a/tools/searchabi.c b/tools/searchabi.c new file mode 100644 index 0000000..6d5a8bd --- /dev/null +++ b/tools/searchabi.c @@ -0,0 +1,198 @@ +#include <mysql.h> +#include <stdio.h> +#include <string.h> +#include <regex.h> +#include <errno.h> +#include <stdlib.h> +#include <stdbool.h> + +#define error(S) printf("%s (%d): %s\n",__func__,__LINE__,S) + +struct entry +{ + struct entry *prev; + struct entry *next; + int id; + char *name; + char *text; +}; + +static regex_t filter = {0}; +static MYSQL *connection = 0; +static const char server[] = "localhost"; +static const char user[] = "fpm2db"; +static const char password[] = "C6fO?o3qy"; +static const char database[] = "frugalware2"; +static struct entry *list = 0; + +static void cleanup(void) +{ + struct entry *p = 0; + + if(connection) + { + regfree(&filter); + + mysql_close(connection); + + while(list) + { + free(list->name); + + free(list->text); + + p = list->next; + + free(list); + + list = p; + } + } +} + +static struct entry *pass1(void) +{ + static const char query[] = "select pkg_id,abi from abis"; + MYSQL_RES *result = 0; + MYSQL_ROW row = 0; + const char *s = 0; + struct entry *list = 0; + + if(mysql_query(connection,query)) + { + error(mysql_error(connection)); + return 0; + } + + if((result = mysql_use_result(connection)) == 0) + { + error(mysql_error(connection)); + return 0; + } + + while((row = mysql_fetch_row(result)) != 0) + { + if((s = strstr(row[1],": ")) == 0) + continue; + + if(regexec(&filter,s+2,0,0,0) != 0) + continue; + + if(list == 0) + { + list = malloc(sizeof(struct entry)); + list->prev = 0; + list->next = 0; + } + else + { + list->next = malloc(sizeof(struct entry)); + list->next->prev = list; + list->next->next = 0; + list = list->next; + } + + list->id = atoi(row[0]); + + list->name = 0; + + list->text = strdup(row[1]); + } + + mysql_free_result(result); + + for( ; list && list->prev ; list = list->prev ) + ; + + return list; +} + +static bool pass2(void) +{ + struct entry *p = 0; + char query[128] = {0}; + MYSQL_RES *result = 0; + MYSQL_ROW row = 0; + + for( p = list ; p ; p = p->next ) + { + snprintf(query,128,"select pkgname from packages where id = %d",p->id); + + if(mysql_query(connection,query)) + { + error(mysql_error(connection)); + return false; + } + + if((result = mysql_use_result(connection)) == 0) + { + error(mysql_error(connection)); + return false; + } + + if((row = mysql_fetch_row(result)) == 0) + { + error(mysql_error(connection)); + return false; + } + + p->name = strdup(row[0]); + + mysql_free_result(result); + } + + return true; +} + +static void output(void) +{ + struct entry *p = 0; + + for( p = list ; p ; p = p->next ) + { + printf("%s: %s\n",p->name,p->text); + } +} + +extern int main(int argc,char **argv) +{ + if(argc < 2) + { + printf("Usage: %s <extended regular expression>\n",argv[0]); + return EXIT_FAILURE; + } + + if(atexit(cleanup) != 0) + { + error("atexit failed"); + return EXIT_FAILURE; + } + + if(regcomp(&filter,argv[1],REG_EXTENDED | REG_NOSUB) != 0) + { + error("invalid regular expression"); + return EXIT_FAILURE; + } + + if((connection = mysql_init(0)) == 0) + { + error(strerror(errno)); + return EXIT_FAILURE; + } + + if(!mysql_real_connect(connection,server,user,password,database,0,0,0)) + { + error(mysql_error(connection)); + return EXIT_FAILURE; + } + + if((list = pass1()) == 0) + return EXIT_FAILURE; + + if(!pass2()) + return EXIT_FAILURE; + + output(); + + return EXIT_SUCCESS; +} _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
