static char *addNewDoc (int ftype, int getLines, int ppl, int resolution, int pageCount, char *ocrText) { char *dateStr = getTimeStr_iso8601(); char *sql = o_strdup("INSERT INTO docs \ (depth, lines, ppl, resolution, ocrText, pages, entrydate, filetype) \ VALUES (8, ?, ?, ?, ?, ?, ?, ?)"); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_INT) ; sll_append(vars, &getLines ); sll_append(vars, DB_INT ); sll_append(vars, &ppl ); sll_append(vars, DB_INT ); sll_append(vars, &resolution ); sll_append(vars, DB_TEXT ); sll_append(vars, ocrText ); sll_append(vars, DB_INT ); sll_append(vars, &pageCount ); sll_append(vars, DB_TEXT ); sll_append(vars, dateStr ); sll_append(vars, DB_INT ); sll_append(vars, &ftype ); runUpdate_db(sql, vars); free(sql); free(dateStr); free(ocrText); return itoa(last_insert(), 10); }
extern char *getTagId(char *tagname) { struct simpleLinkedList *vars, *rSet; char *sql2, *ret = NULL; char *sql = o_printf("SELECT tagid FROM tags WHERE tagname = '%s'", tagname); rSet = runquery_db(sql); if( rSet != NULL ) { ret = o_strdup(readData_db(rSet, "tagid")); } else { o_log(DEBUGM, "no tag was found. Adding a new one."); sql2 = o_strdup("INSERT INTO tags (tagname) VALUES (?)"); vars = sll_init(); sll_append(vars, DB_TEXT ); sll_append(vars, tagname ); runUpdate_db(sql2, vars); free(sql2); ret = itoa(last_insert(), 10); } free_recordset( rSet ); free(sql); o_log(DEBUGM, "Using tagid of %s", ret); return ret; }
extern void deleteTag( char *tagid ) { char *sql = o_strdup("DELETE FROM tags WHERE tagid = ?"); int tagid_i = atoi(tagid); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_INT ); sll_append(vars, &tagid_i ); runUpdate_db(sql, vars); free(sql); }
extern void removeDoc (char *docid) { char *sql = o_strdup("DELETE FROM docs WHERE docid = ?"); int docid_i = atoi(docid); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_INT ); sll_append(vars, &docid_i ); runUpdate_db(sql, vars); free(sql); }
extern void addLocation(char *location, int role) { char *sql = o_strdup("INSERT INTO location_access (location, role) VALUES (?, ?);"); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_TEXT ); sll_append(vars, location ); sll_append(vars, DB_INT ); sll_append(vars, &role ); runUpdate_db(sql, vars); free(sql); }
extern int doUpdateDocValue (char *kkey, struct simpleLinkedList *vars) { char *sql; int rc = 0; sql = o_printf("UPDATE docs SET %s = ? WHERE docid = ?", kkey); rc = runUpdate_db(sql, vars); free(sql); return rc; }
static int addRemoveTagOnDocument (char *sql, char *docid, char *tagid) { int rc; struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_TEXT ); sll_append(vars, docid ); sll_append(vars, DB_TEXT ); sll_append(vars, tagid ); rc = runUpdate_db(sql, vars); free(sql); return rc; }
extern void addScanProgress (char *uuid) { char *sql = o_strdup("INSERT INTO scan_progress (client_id, status, value) VALUES (?, ?, 0);"); int t1 = SCAN_IDLE; int *t = &t1; struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_TEXT ); sll_append(vars, uuid ); sll_append(vars, DB_INT ); sll_append(vars, t ); runUpdate_db(sql, vars); free(sql); }
extern void updateNewScannedPage (int docid, char *ocrText, int page) { char *sql = o_strdup("UPDATE docs SET pages = ?, ocrText = ocrText || ? WHERE docid = ?"); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_INT ); sll_append(vars, &page ); sll_append(vars, DB_TEXT ); sll_append(vars, ocrText ); sll_append(vars, DB_INT ); sll_append(vars, &docid ); runUpdate_db(sql, vars); free(sql); }
extern void updateScanProgress (char *uuid, int status, int value) { char *progressUpdate = o_strdup("UPDATE scan_progress \ SET status = ?, \ value = ? \ WHERE client_id = ? "); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_INT ); sll_append(vars, &status ); sll_append(vars, DB_INT ); sll_append(vars, &value ); sll_append(vars, DB_TEXT ); sll_append(vars, uuid ); runUpdate_db(progressUpdate, vars); free(progressUpdate); }
extern int setScanParam(char *uuid, int param, char *vvalue) { int rc; char *sql = o_strdup("INSERT OR REPLACE \ INTO scan_params \ (client_id, param_option, param_value) \ VALUES (?, ?, ?);"); struct simpleLinkedList *vars = sll_init(); sll_append(vars, DB_TEXT ); sll_append(vars, uuid ); sll_append(vars, DB_INT ); sll_append(vars, ¶m ); sll_append(vars, DB_TEXT ); sll_append(vars, vvalue ); rc = runUpdate_db(sql, vars); free(sql); return rc; }
void update_config_option( char *option, char *value ) { char *sql = o_strdup("update config SET config_value = ? WHERE config_option = ?"); struct simpleLinkedList *vars = sll_init(); o_log(DEBUGM,"entering update_config_option\n"); sll_append(vars, DB_TEXT ); sll_append(vars, value ); sll_append(vars, DB_TEXT ); sll_append(vars, option ); o_log(INFORMATION, "|Attempting to set config option '%s' to '%s'", option, value); if( runUpdate_db(sql, vars) ) { o_log(INFORMATION, "| Failed!"); } else { o_log(INFORMATION, "| Successful."); } free(sql); o_log(DEBUGM,"leaving update_config_option\n"); }
void *backpopulate_phash_inner( void *u) { pthread_t thread[MAX_THREADS]; pthread_attr_t attr; int thread_pointer = 0; int avail_processors = 1; // We may have 16 processing cors, but only use what we need avail_processors = get_nprocs() - 1; if( avail_processors > MAX_THREADS ) { avail_processors = MAX_THREADS; } // initialise threading pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for( thread_pointer = 0; thread_pointer < MAX_THREADS; thread_pointer++ ) { pthread_create( &thread[ thread_pointer], &attr, stub, (void *)NULL ); } thread_pointer = 0; // What tasks do we need to do struct simpleLinkedList *rSet; char *sql = o_strdup("SELECT filetype, docid FROM docs WHERE image_phash = 0"); rSet = runquery_db(sql, NULL); if( rSet != NULL ) { do { // Queue up the next task int docid = atoi( readData_db(rSet, "docid") ); char *docfilename; if( ( 0 == strcmp("2", readData_db(rSet, "filetype") ) ) || ( 0 == strcmp("4", readData_db(rSet, "filetype") ) ) ) { docfilename = o_printf("%s/scans/%d_1.jpg", BASE_DIR, docid); } else { docfilename = o_printf("%s/scans/%d_thumb.jpg", BASE_DIR, docid); } // Wait for an available worker while( thread_active[thread_pointer] == 1 ) { thread_pointer++; if( thread_pointer > avail_processors ) { thread_pointer = 0; } usleep(200); } // Wait for it to join back first pthread_join( thread[ thread_pointer ], NULL); // Give instructions to the next worker struct process_phash *data = malloc( sizeof( struct process_phash ) ); data->filename = docfilename; data->docid = docid; data->thread_id = thread_pointer; thread_active[thread_pointer] = 1; pthread_create( &thread[ thread_pointer], &attr, process_doc, (void *)data ); } while ( nextRow( rSet ) ); free_recordset( rSet ); } free(sql); // Wait for everything t ofinish for( thread_pointer = 0; thread_pointer < MAX_THREADS; thread_pointer++ ) { pthread_join( thread[ thread_pointer ], NULL); } // Set the config flag, so we don't try this again. o_log(INFORMATION, "Marking that the backpopulation of pHash is: complete" ); sql = o_strdup("UPDATE config SET config_value = 'complete' WHERE config_option = 'backpopulate_phash'"); runUpdate_db(sql, NULL); free(sql); return NULL; }