/*---------------------------------------------------------------------- GetPropfindInfoFromNode: get the PROPFIND allprop request's results from the node 'prop' of the propfind response tree. ---------------------------------------------------------------------- */ static AwList * GetPropfindInfoFromNode (AwNode *propnode) { AwList *list = NULL; AwNode *child = NULL; AwNode *href = NULL; AwNode *Nactivelock = NULL; AwString info; char *name, *value; char *Nns = NULL; if (propnode && AwNode_howManyChildren (propnode)>0) { list = AwList_new(5); AwNode_resetChildren (propnode); while ((child = AwNode_nextChild(propnode))!=NULL) { AwNode_resetChildren (child); info = AwNode_getInfo(child); name = AwString_get (info); AwString_delete(info); /* properties that we don't want, continue */ if (!HTStrCaseStr(name,(char*)"getetag") && !HTStrCaseStr(name,(char*)"executable") && !HTStrCaseStr(name,(char*)"resourcetype") && !HTStrCaseStr(name,(char*)"source") && !HTStrCaseStr(name,(char*)"supportedlock") && !HTStrCaseStr(name,(char*)"status")) { /* lockdiscovery property? */ if (HTStrCaseStr(name,(char*)"lockdiscovery")) { Nactivelock = AwNode_nextChild(child); Nns = NULL; if (Nactivelock) { info = AwString_new (12); AwString_set (info,"activelock"); AwList_put (list,AwString_get(info)); AwString_set (info,"yes"); AwList_put (list,AwString_get(info)); AwString_delete (info); AwNode_resetChildren(Nactivelock); while ((child = AwNode_nextChild(Nactivelock)) != NULL) { AwNode_resetChildren(child); info = AwNode_getInfo(child); Nns = AwString_get (info); AwString_delete(info); /* ignore locktoken */ if (HTStrCaseStr (Nns,(char*)"locktoken")) continue; /* if owner, found href child */ if (HTStrCaseStr (Nns,(char*)"owner")) { href = NULL; info = AwString_new (5); AwString_set (info,"href"); href = AwTree_search (child, info); if (href) child = href; AwNode_resetChildren(child); AwString_delete (info); } /* get the information */ child = AwNode_nextChild(child); AwNode_resetChildren(child); if (child) { info = AwNode_getInfo (child); value = AwString_get (info); AwString_delete(info); #ifdef DEBUG_DAV fprintf (stderr,"GetPropfindInfoFromNode.... adding %s , %s\n", Nns,value); #endif AwList_put (list,Nns); AwList_put (list,value); } /* if (child) */ } /* while */ } /*if Nactivelock*/ } /* if lockdiscovery */ /* other properties, get the name and the value */ else { /* if the node has children, them the information * is in the children */ while (child && AwNode_howManyChildren(child)>0 ) child = AwNode_nextChild (child); if (child) { info = AwNode_getInfo (child); value = AwString_get (info); AwString_delete(info); #ifdef DEBUG_DAV fprintf (stderr,"GetPropfindInfoFromNode.... adding %s , %s\n", name,value); #endif AwList_put (list,name); AwList_put (list,value); } } } } /* while */ } return list; }
int main (int argc, char ** argv) { HTSQL * sql = NULL; char * sqlserver = DEFAULT_SQL_SERVER; char * sqldb = DEFAULT_SQL_DB; char * sqluser = DEFAULT_SQL_USER; char * sqlpw = DEFAULT_SQL_PW; char * cvsuser = DEFAULT_CVS_USER; time_t cvsdate = -1; FILE * fin = stdin; char * input_buffer[BUFSIZE]; HTChunk * loginfo = HTChunk_new(BUFSIZE); int arg = 0; BOOL create_db = YES; /* Initiate libwww */ HTLibInit(APP_NAME, APP_VERSION); /* Scan command line for parameters */ for (arg=1; arg<argc; arg++) { if (*argv[arg] == '-') { if (!strcmp(argv[arg], "-h") || !strcmp(argv[arg], "-?")) { VersionInfo(); Cleanup(0, sql, loginfo); } else if (!strcmp(argv[arg], "-v")) { HTSetTraceMessageMask("q"); } else if (!strcmp(argv[arg], "-nocreate")) { create_db = NO; } else if (!strncmp(argv[arg], "-sqldb", 5)) { sqldb = (arg+1 < argc && *argv[arg+1] != '-') ? argv[++arg] : DEFAULT_SQL_DB; } else if (!strncmp(argv[arg], "-sqlpassword", 5)) { sqlpw = (arg+1 < argc && *argv[arg+1] != '-') ? argv[++arg] : DEFAULT_SQL_PW; } else if (!strncmp(argv[arg], "-sqlserver", 5)) { sqlserver = (arg+1 < argc && *argv[arg+1] != '-') ? argv[++arg] : DEFAULT_SQL_SERVER; } else if (!strncmp(argv[arg], "-sqluser", 5)) { sqluser = (arg+1 < argc && *argv[arg+1] != '-') ? argv[++arg] : DEFAULT_SQL_USER; } else if (!strncmp(argv[arg], "-cvsuser", 5)) { cvsuser = (arg+1 < argc && *argv[arg+1] != '-') ? argv[++arg] : DEFAULT_CVS_USER; } else if (!strncmp(argv[arg], "-cvsdate", 5)) { cvsdate = (arg+1 < argc && *argv[arg+1] != '-') ? HTParseTime(argv[++arg], NULL, NO) : -1; } else { fprintf(stderr, "Bad Argument (%s)\n", argv[arg]); } } else { fprintf(stderr, "Bad Argument (%s)\n", argv[arg]); } } /* Get an SQL object */ if ((sql = HTSQL_new(sqlserver, sqluser, sqlpw, 0)) == NULL) Cleanup(-1, sql, loginfo); /* Connect to the SQL server */ if (HTSQL_connect(sql) != YES) Cleanup(-1, sql, loginfo); /* Select our database */ if (HTSQL_selectDB(sql, sqldb) != YES) Cleanup(-1, sql, loginfo); /* Create our tables */ if (create_db) createTables(sql, 0); /* Read the arguments from stdin */ for (;;) { int status = fread(input_buffer, 1, BUFSIZE, fin); if (status < 0) Cleanup(-1, sql, loginfo); if (status == 0) break; HTChunk_putb(loginfo, (const char *) input_buffer, status); } /* Parse the input chunk */ { char * ptr = HTChunk_data(loginfo); char * noop1 = HTNextField(&ptr); char * noop2 = HTNextField(&ptr); char * root = HTNextField(&ptr); char * operation = NULL; char * files = NULL; char * comment = NULL; int comment_id = -1; int user_id = -1; char * p, * q; #ifdef HT_REENTRANT char *lasts; /* For strtok_r */ #endif /* Find shared log message and get id */ if ((q = HTStrCaseStr(ptr, "\nLog Message:")) != NULL) { comment = q+14; *q = '\0'; } if ((comment_id = add_comment(sql, comment)) < 0) Cleanup(-1, sql, loginfo); /* Add/find user and get id */ if ((user_id = add_user(sql, cvsuser)) < 0) Cleanup(-1, sql, loginfo); /* For each operation, find the files involved */ while ((q = HTStrCaseStr(ptr, " Files:")) != NULL) { /* Find the operation */ files = q+9; for (p=q; p>HTChunk_data(loginfo) && *p && *p!='\n'; p--); p++; operation = HTNextField(&p); /* Find the next line */ if ((q = strchr(files, '\n')) != NULL) { *q++ = '\0'; ptr = q; } /* Create the query */ if (operation && files && comment) { char * file; int location_id = -1; #ifdef HT_REENTRANT if ((file = strtok_r(files, DELIMITERS, &lasts)) != NULL) { #else if ((file = strtok(files, DELIMITERS)) != NULL) { #endif /* HT_REENTRANT */ do { char * path = NULL; StrAllocMCopy(&path, root, "/", file, NULL); /* Add/find location and get id */ if ((location_id = add_location(sql, path)) < 0) { Cleanup(-1, sql, loginfo); break; } #if 0 fprintf(stderr, "location: `%s\', user: `%s\', operation: `%s\', comment: `%s\'\n", path, cvsuser, operation, comment); #endif /* Add log entry */ { char buf[16384]; char * query = HTSQL_printf(buf, 16384, "insert into %s values (%u,%u,%T,%S,%u)", DEFAULT_SQL_LOG_TABLE, location_id, user_id, cvsdate, operation, comment_id); if (HTSQL_query(sql, query) != YES) { Cleanup(-1, sql, loginfo); break; } } HT_FREE(path); #ifdef HT_REENTRANT } while ((file = (char *) strtok_r(NULL, DELIMITERS, &lasts)) != NULL); #else } while ((file = strtok(NULL, DELIMITERS)) != NULL); #endif /* HT_REENTRANT */ } } } } return 0; }