static int test_pquery(apr_pool_t* pool, apr_dbd_t* handle, const apr_dbd_driver_t* driver) { int rv = 0; const char *query = "INSERT INTO apr_dbd_test VALUES (%s, %s, %d)"; apr_dbd_prepared_t *statement = NULL; const char *label = "testpquery"; int nrows; apr_dbd_transaction_t *trans =0; rv = apr_dbd_prepare(driver, pool, handle, query, label, &statement); /* rv = apr_dbd_prepare(driver, pool, handle, query, NULL, &statement); */ if (rv) { printf("Prepare statement failed!\n%s\n", apr_dbd_error(driver, handle, rv)); return rv; } apr_dbd_transaction_start(driver, pool, handle, &trans); rv = apr_dbd_pvquery(driver, pool, handle, &nrows, statement, "prepared", "insert", "2", NULL); apr_dbd_transaction_end(driver, pool, trans); if (rv) { printf("Exec of prepared statement failed!\n%s\n", apr_dbd_error(driver, handle, rv)); return rv; } printf("Showing table (should now contain row \"prepared insert 2\")\n"); select_sequential(pool, handle, driver); return rv; }
int dbms_transaction_end(dav_repos_transaction *trans) { const dav_repos_dbms *db = trans->db; apr_pool_t *pool = trans->pool; TRACE(); return apr_dbd_transaction_end(db->ap_dbd_dbms->driver, pool, trans->ap_trans); }
void * APR_THREAD_FUNC sync_dir(apr_thread_t* thread, void* ptr){ int files_synced = 0; int status; apr_status_t rv; const char* dbd_error; List* file_list; music_file* song; dir_sync_thread_t* dir_sync = (dir_sync_thread_t*) ptr; apr_pool_t* pool; db_config_t* db_config = dir_sync->db_config; char error_message[256]; //Create sub pool used for sync rv = apr_pool_create_ex(&pool, dir_sync->pool, NULL, NULL); if(rv != APR_SUCCESS){ error_messages_add(dir_sync->error_messages, ERROR ,"Memory Pool Error", apr_strerror(rv, error_message, sizeof(error_message))); return 0; } file_list = apr_pcalloc(pool, sizeof(List)); dir_sync->dir->stats->num_files = apr_pcalloc(pool, sizeof(int)); if(db_config->connected != 1){ error_messages_add(dir_sync->error_messages, ERROR, "Database not connected","ERROR ERROR"); return 0; } count_table_rows(); read_dir(pool, file_list, dir_sync->dir->path, dir_sync->dir->stats->num_files, dir_sync->error_messages); if ((file_list == NULL || dir_sync->dir->stats->num_files == NULL )&& (*dir_sync->dir->stats->num_files ) > 0 ){ error_messages_add(dir_sync->error_messages, ERROR, "Killing Sync Thread", ""); return 0; } status = apr_dbd_transaction_start(db_config->dbd_driver, pool, db_config->dbd_handle,&(db_config->transaction)); if(status != 0){ dbd_error = apr_dbd_error(db_config->dbd_driver, db_config->dbd_handle, status); error_messages_add(dir_sync->error_messages,ERROR, "Database error start transaction", dbd_error); return 0; } while(file_list->file.path){ song = apr_pcalloc(pool, sizeof(music_file)); song->file = &(file_list->file); switch(song->file->type){ #ifdef WITH_FLAC case FLAC:{ status = read_flac_level1(pool, song); if (status == 0){ song->file->type_string = "flac"; } break; } #endif #ifdef WITH_OGG case OGG:{ status = read_ogg(pool, song); if (status == 0){ song->file->type_string = "ogg"; } break; } #endif #ifdef WITH_MP3 case MP3:{ status = read_id3(pool,song); if (status == 0){ song->file->type_string = "mp3"; } break; } #endif default:{ status = -1; break; } } if (status == 0 && song){ //We have song get musicbrainz ids //status = get_musicbrainz_release_id(pool, song, dir_sync->error_messages); //Update or Insert song if (db_config->connected == 1){ status = sync_song(pool, db_config, song); if (status != 0){ error_messages_add(dir_sync->error_messages, ERROR, apr_psprintf(pool,"Failed to sync song:"), apr_psprintf(pool, "(%d) Song title: %s Song artist: %s song album:%s song file path: %s",status, song->title, song->artist, song->album, song->file->path)); } }else{ //Lost connection kill thread error_messages_add(dir_sync->error_messages, ERROR, "Failed to sync song:", "Lost connection to database"); return 0; } } //Calculate the percent of files synchronized dir_sync->dir->stats->sync_progress =(float) files_synced*100 / (*(dir_sync->dir->stats->num_files) - 1); dir_sync->dir->stats->files_scanned = files_synced; files_synced++; file_list = file_list->next; } status = apr_dbd_transaction_end(db_config->dbd_driver, pool, db_config->transaction); if(status != 0){ dbd_error = apr_dbd_error(db_config->dbd_driver, db_config->dbd_handle, status); error_messages_add(dir_sync->error_messages, ERROR, "Database error couldn't end transaction",dbd_error); return 0; } apr_pool_clear(pool); return 0; }
static int test_transactions(apr_pool_t* pool, apr_dbd_t* handle, const apr_dbd_driver_t* driver) { int rv = 0; int nrows; apr_dbd_transaction_t *trans = NULL; const char* statement; /* trans 1 - error out early */ printf("Transaction 1\n"); rv = apr_dbd_transaction_start(driver, pool, handle, &trans); if (rv) { printf("Start transaction failed!\n%s\n", apr_dbd_error(driver, handle, rv)); return rv; } statement = "UPDATE apr_dbd_test SET col2 = 'failed'"; rv = apr_dbd_query(driver, handle, &nrows, statement); if (rv) { printf("Update failed: '%s'\n", apr_dbd_error(driver, handle, rv)); apr_dbd_transaction_end(driver, pool, trans); return rv; } printf("%d rows updated\n", nrows); statement = "INSERT INTO apr_dbd_test1 (col3) values (3)"; rv = apr_dbd_query(driver, handle, &nrows, statement); if (!rv) { printf("Oops, invalid op succeeded but shouldn't!\n"); } statement = "INSERT INTO apr_dbd_test values ('zzz', 'aaa', 3)"; rv = apr_dbd_query(driver, handle, &nrows, statement); printf("Valid insert returned %d. Should be nonzero (fail) because transaction is bad\n", rv) ; rv = apr_dbd_transaction_end(driver, pool, trans); if (rv) { printf("End transaction failed!\n%s\n", apr_dbd_error(driver, handle, rv)); return rv; } printf("Transaction ended (should be rollback) - viewing table\n" "A column of \"failed\" indicates transaction failed (no rollback)\n"); select_sequential(pool, handle, driver); /* trans 2 - complete successfully */ printf("Transaction 2\n"); rv = apr_dbd_transaction_start(driver, pool, handle, &trans); if (rv) { printf("Start transaction failed!\n%s\n", apr_dbd_error(driver, handle, rv)); return rv; } statement = "UPDATE apr_dbd_test SET col2 = 'success'"; rv = apr_dbd_query(driver, handle, &nrows, statement); if (rv) { printf("Update failed: '%s'\n", apr_dbd_error(driver, handle, rv)); apr_dbd_transaction_end(driver, pool, trans); return rv; } printf("%d rows updated\n", nrows); statement = "INSERT INTO apr_dbd_test values ('aaa', 'zzz', 3)"; rv = apr_dbd_query(driver, handle, &nrows, statement); printf("Valid insert returned %d. Should be zero (OK)\n", rv) ; rv = apr_dbd_transaction_end(driver, pool, trans); if (rv) { printf("End transaction failed!\n%s\n", apr_dbd_error(driver, handle, rv)); return rv; } printf("Transaction ended (should be commit) - viewing table\n"); select_sequential(pool, handle, driver); return rv; }