|
@@ -15,6 +15,245 @@
|
|
|
* RuneOptimizer. If not, see <https://www.gnu.org/licenses/>.
|
|
* RuneOptimizer. If not, see <https://www.gnu.org/licenses/>.
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Parses the arguments passes to the team function and calls the appripiate
|
|
|
|
|
+ * function.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param argc[in] Argument count.
|
|
|
|
|
+ * @param argv[in] Argument list.
|
|
|
|
|
+ * @return SUCCESS or an error code.
|
|
|
|
|
+ */
|
|
|
|
|
+int team(int argc, char *argv[]){
|
|
|
|
|
+ if (argc < 1){
|
|
|
|
|
+ fprintf(stderr, "Command team needs an action\n");
|
|
|
|
|
+ return ERROR_INPUT_TEAM_NO_ACTION;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (strcmp(argv[0], "list") == 0){
|
|
|
|
|
+ return list_team(argc - 1, argv + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (strcmp(argv[0], "create") == 0){
|
|
|
|
|
+ return create_team(argc - 1, argv + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (strcmp(argv[0], "delete") == 0){
|
|
|
|
|
+ return delete_team(argc - 1, argv + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (strcmp(argv[0], "add_unit") == 0){
|
|
|
|
|
+ return add_team_unit(argc - 1, argv + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (strcmp(argv[0], "remove_unit") == 0){
|
|
|
|
|
+ return remove_team_unit(argc - 1, argv + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ else{
|
|
|
|
|
+ fprintf(stderr, "Invalid action for team command: %s\n", argv[0]);
|
|
|
|
|
+ return ERROR_INPUT_TEAM_INVALID_ACTION;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Removes a unit from a team.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param argc[in] Argument count.
|
|
|
|
|
+ * @param argv[in] Argument list.
|
|
|
|
|
+ * @return SUCCESS or an error code.
|
|
|
|
|
+ */
|
|
|
|
|
+int remove_team_unit(int argc, char *argv[]){
|
|
|
|
|
+ if (argc != 2){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "remove_unit needs exactly two argument, %d supplied\n",
|
|
|
|
|
+ argc
|
|
|
|
|
+ );
|
|
|
|
|
+ return ERROR_INPUT_TEAM_NO_ACTION;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3 *db;
|
|
|
|
|
+ if (
|
|
|
|
|
+ SUCCESS != sqlite3_open_v2(db_location, &db, SQLITE_OPEN_READWRITE, NULL)
|
|
|
|
|
+ ){
|
|
|
|
|
+ fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_CANT_OPEN;
|
|
|
|
|
+ }
|
|
|
|
|
+ char query[200] =
|
|
|
|
|
+ "SELECT count(unit) AS inc FROM units_teams WHERE team = ? AND unit = ?";
|
|
|
|
|
+
|
|
|
|
|
+ sqlite3_stmt *stmt_verify;
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_verify, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "Error verifiying units and teams: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ return ERROR_DB_RUNES_SLOT;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 2, argv[1], strlen(argv[1]), NULL);
|
|
|
|
|
+ if (SQLITE_ROW != sqlite3_step(stmt_verify)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "Unable to verify unit and team: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_VERIFY_TEAM_UNIT;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sqlite3_column_int(stmt_verify, 0) == 0){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "There is no unit with ID '%s' in team with ID '%s'\n",
|
|
|
|
|
+ argv[1],
|
|
|
|
|
+ argv[0]
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_INPUT_VERIFY_TEAM_UNIT_TEAM;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+
|
|
|
|
|
+ // Delete from units_teams
|
|
|
|
|
+ sqlite3_stmt *stmt_insert;
|
|
|
|
|
+ strcpy(query, "DELETE FROM units_teams WHERE team = ? AND unit = ?");
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_insert, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Failed to prepare statement to delete from units_teams: %s\n",
|
|
|
|
|
+ sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_insert);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_DELETE_UNITS_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 2, argv[1], strlen(argv[1]), NULL);
|
|
|
|
|
+ if (SQLITE_DONE != sqlite3_step(stmt_insert)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Unable to to insert into units_teams: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_insert);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_DELETE_UNITS_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Inform about the newly created team
|
|
|
|
|
+ printf(
|
|
|
|
|
+ "Unit with ID '%s' succesfully removed from team with id '%s'\n",
|
|
|
|
|
+ argv[1], argv[0]
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_insert);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+
|
|
|
|
|
+ // Show the team composition and end.
|
|
|
|
|
+ char *args_to_list[2] = {argv[0], "--units"};
|
|
|
|
|
+ list_team(2, args_to_list);
|
|
|
|
|
+ return SUCCESS;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Adds a unit to a team.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param argc[in] Argument count.
|
|
|
|
|
+ * @param argv[in] Argument list.
|
|
|
|
|
+ * @return SUCCESS or an error code.
|
|
|
|
|
+ */
|
|
|
|
|
+int add_team_unit(int argc, char *argv[]){
|
|
|
|
|
+ if (argc != 2){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "add_unit needs exactly two arguments, %d supplied\n",
|
|
|
|
|
+ argc
|
|
|
|
|
+ );
|
|
|
|
|
+ return ERROR_INPUT_TEAM_NO_ACTION;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3 *db;
|
|
|
|
|
+ if (
|
|
|
|
|
+ SUCCESS != sqlite3_open_v2(db_location, &db, SQLITE_OPEN_READWRITE, NULL)
|
|
|
|
|
+ ){
|
|
|
|
|
+ fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_CANT_OPEN;
|
|
|
|
|
+ }
|
|
|
|
|
+ char query[200] =
|
|
|
|
|
+ "SELECT "
|
|
|
|
|
+ "(SELECT count(id) FROM teams WHERE id = ?) AS team, "
|
|
|
|
|
+ "(SELECT count(id) FROM units WHERE id = ?) AS unit, "
|
|
|
|
|
+ "(SELECT count(*) FROM units_teams WHERE team = ? AND unit = ?) AS inc";
|
|
|
|
|
+
|
|
|
|
|
+ sqlite3_stmt *stmt_verify;
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_verify, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "Error verifiying units and teams: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ return ERROR_DB_RUNES_SLOT;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 2, argv[1], strlen(argv[1]), NULL);
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 3, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 4, argv[1], strlen(argv[1]), NULL);
|
|
|
|
|
+ if (SQLITE_ROW != sqlite3_step(stmt_verify)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "Unable to verify unit and team: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_VERIFY_TEAM_UNIT;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sqlite3_column_int(stmt_verify, 0) == 0){
|
|
|
|
|
+ fprintf(stderr, "Team with ID '%s' does not exists\n", argv[0]);
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_INPUT_VERIFY_TEAM_UNIT_TEAM;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sqlite3_column_int(stmt_verify, 1) == 0){
|
|
|
|
|
+ fprintf(stderr, "Unit with ID '%s' does not exists\n", argv[1]);
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_INPUT_VERIFY_TEAM_UNIT_UNIT;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sqlite3_column_int(stmt_verify, 2) != 0){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Unit with ID '%s' is already in team with ID %s\n", argv[1], argv[0]
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_INPUT_VERIFY_TEAM_UNIT_INCLUDED;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+
|
|
|
|
|
+ // Insert into units_teams
|
|
|
|
|
+ sqlite3_stmt *stmt_insert;
|
|
|
|
|
+ strcpy(query, "INSERT INTO units_teams (team, unit) VALUES (?, ?)");
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_insert, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Failed to prepare statement to insert into units_teams: %s\n",
|
|
|
|
|
+ sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_insert);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_INSERT_UNITS_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 2, argv[1], strlen(argv[1]), NULL);
|
|
|
|
|
+ if (SQLITE_DONE != sqlite3_step(stmt_insert)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Unable to to insert into units_teams: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_insert);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_INSERT_UNITS_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Inform about the newly created team
|
|
|
|
|
+ printf(
|
|
|
|
|
+ "Unit with ID '%s' succesfully added to team with id '%s'\n",
|
|
|
|
|
+ argv[1], argv[0]
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_insert);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+
|
|
|
|
|
+ // Show the team composition and end.
|
|
|
|
|
+ char *args_to_list[2] = {argv[0], "--units"};
|
|
|
|
|
+ list_team(2, args_to_list);
|
|
|
|
|
+ return SUCCESS;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Displays teams.
|
|
* Displays teams.
|
|
|
*
|
|
*
|
|
@@ -22,12 +261,21 @@
|
|
|
* @param argv[in] Argument list.
|
|
* @param argv[in] Argument list.
|
|
|
* @return SUCCESS or an error code.
|
|
* @return SUCCESS or an error code.
|
|
|
*/
|
|
*/
|
|
|
-int list_teams(int argc, char *argv[]){
|
|
|
|
|
|
|
+int list_team(int argc, char *argv[]){
|
|
|
|
|
+ // Get parameters
|
|
|
|
|
+ char show_units = FALSE;
|
|
|
|
|
+ int number_of_options = 0;
|
|
|
|
|
+ for (int i = 0; i < argc; i ++){
|
|
|
|
|
+ if (strcmp("--units", argv[i]) == 0 || strcmp("-u", argv[i]) == 0){
|
|
|
|
|
+ number_of_options ++;
|
|
|
|
|
+ show_units = TRUE;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
char id[8] = "\0";
|
|
char id[8] = "\0";
|
|
|
char query[300] = "SELECT id, name, priority FROM teams ";
|
|
char query[300] = "SELECT id, name, priority FROM teams ";
|
|
|
char tmp[64];
|
|
char tmp[64];
|
|
|
- if (argc > 3){
|
|
|
|
|
- strcpy(id, argv[3]);
|
|
|
|
|
|
|
+ if (argc > number_of_options){
|
|
|
|
|
+ strcpy(id, argv[0]);
|
|
|
strcpy(tmp, "");
|
|
strcpy(tmp, "");
|
|
|
sprintf(tmp, "WHERE id = '%s' OR name = '%s' ", id, id);
|
|
sprintf(tmp, "WHERE id = '%s' OR name = '%s' ", id, id);
|
|
|
strcat(query, tmp);
|
|
strcat(query, tmp);
|
|
@@ -44,7 +292,7 @@ int list_teams(int argc, char *argv[]){
|
|
|
sqlite3_stmt *stmt_teams;
|
|
sqlite3_stmt *stmt_teams;
|
|
|
if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_teams, 0)) {
|
|
if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_teams, 0)) {
|
|
|
fprintf(stderr, "Error getting teams: %s\n", sqlite3_errmsg(db));
|
|
fprintf(stderr, "Error getting teams: %s\n", sqlite3_errmsg(db));
|
|
|
- return ERROR_DB_RUNES_SLOT;
|
|
|
|
|
|
|
+ return ERROR_DB_TEAM_ID;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
printf(" --------------------------------------------------\n");
|
|
printf(" --------------------------------------------------\n");
|
|
@@ -60,12 +308,57 @@ int list_teams(int argc, char *argv[]){
|
|
|
4, sqlite3_column_int(stmt_teams, 2)
|
|
4, sqlite3_column_int(stmt_teams, 2)
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
|
|
+ // If units are to be shown, query them here
|
|
|
|
|
+ if (show_units == TRUE){
|
|
|
|
|
+ strcpy(
|
|
|
|
|
+ query,
|
|
|
|
|
+ "SELECT id, name, level FROM units WHERE id IN "
|
|
|
|
|
+ " (SELECT DISTINCT unit FROM units_teams WHERE team = ?);"
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_stmt *stmt_units;
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_units, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Failed to execute statement to select new team ID: %s\n",
|
|
|
|
|
+ sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_units);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_TEAM_ID;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(
|
|
|
|
|
+ stmt_units, 1, sqlite3_column_text(stmt_teams, 0),
|
|
|
|
|
+ strlen(sqlite3_column_text(stmt_teams, 0)), NULL
|
|
|
|
|
+ );
|
|
|
|
|
+ printf(" | |----------------------------------| |\n");
|
|
|
|
|
+ while (SQLITE_ROW == sqlite3_step(stmt_units)){
|
|
|
|
|
+ strcpy(tmp, sqlite3_column_text(stmt_units, 1));
|
|
|
|
|
+ if (strlen(tmp) > 9){
|
|
|
|
|
+ tmp[10] = '\0';
|
|
|
|
|
+ }
|
|
|
|
|
+ sprintf(
|
|
|
|
|
+ tmp,
|
|
|
|
|
+ "%s (Lv.%d) (#%s) ",
|
|
|
|
|
+ tmp,
|
|
|
|
|
+ sqlite3_column_int(stmt_units, 2),
|
|
|
|
|
+ sqlite3_column_text(stmt_units, 0)
|
|
|
|
|
+ );
|
|
|
|
|
+ printf(
|
|
|
|
|
+ " | | %*s | |\n",
|
|
|
|
|
+ 32, tmp
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ printf(" --------------------------------------------------\n");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
else{
|
|
else{
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- printf(" --------------------------------------------------\n");
|
|
|
|
|
|
|
+ if (show_units == FALSE){
|
|
|
|
|
+ // If units are shown, the last team has already closed the table.
|
|
|
|
|
+ printf(" --------------------------------------------------\n");
|
|
|
|
|
+ }
|
|
|
sqlite3_finalize(stmt_teams);
|
|
sqlite3_finalize(stmt_teams);
|
|
|
sqlite3_close(db);
|
|
sqlite3_close(db);
|
|
|
return SUCCESS;
|
|
return SUCCESS;
|
|
@@ -80,20 +373,20 @@ int list_teams(int argc, char *argv[]){
|
|
|
* @return SUCCESS or an error code.
|
|
* @return SUCCESS or an error code.
|
|
|
*/
|
|
*/
|
|
|
int create_team(int argc, char *argv[]){
|
|
int create_team(int argc, char *argv[]){
|
|
|
- if (argc < 4 || argc > 5){
|
|
|
|
|
|
|
+ if (argc < 1 || argc > 2){
|
|
|
fprintf(
|
|
fprintf(
|
|
|
stderr,
|
|
stderr,
|
|
|
- "Team creation takes 1 or 2 arguments, %d supplied\n", argc - 3
|
|
|
|
|
|
|
+ "Team creation takes 1 or 2 arguments, %d supplied\n", argc
|
|
|
);
|
|
);
|
|
|
return ERROR_INPUT_TEAM_CREATE_ARGUMENT_COUNT;
|
|
return ERROR_INPUT_TEAM_CREATE_ARGUMENT_COUNT;
|
|
|
}
|
|
}
|
|
|
int priority = 0;
|
|
int priority = 0;
|
|
|
|
|
|
|
|
// If priority has been supplied as argument, validate it
|
|
// If priority has been supplied as argument, validate it
|
|
|
- if (argc == 5){
|
|
|
|
|
- priority = atoi(argv[4]);
|
|
|
|
|
|
|
+ if (argc == 2){
|
|
|
|
|
+ priority = atoi(argv[1]);
|
|
|
if(
|
|
if(
|
|
|
- strspn(argv[4], "0123456789") != strlen(argv[4]) ||
|
|
|
|
|
|
|
+ strspn(argv[1], "0123456789") != strlen(argv[1]) ||
|
|
|
priority < 0 ||
|
|
priority < 0 ||
|
|
|
priority > 50
|
|
priority > 50
|
|
|
){
|
|
){
|
|
@@ -104,7 +397,7 @@ int create_team(int argc, char *argv[]){
|
|
|
|
|
|
|
|
// Read name
|
|
// Read name
|
|
|
char name[128];
|
|
char name[128];
|
|
|
- strcpy(name, argv[3]);
|
|
|
|
|
|
|
+ strcpy(name, argv[0]);
|
|
|
|
|
|
|
|
int new_id = -1;
|
|
int new_id = -1;
|
|
|
|
|
|
|
@@ -166,3 +459,108 @@ int create_team(int argc, char *argv[]){
|
|
|
sqlite3_close(db);
|
|
sqlite3_close(db);
|
|
|
return SUCCESS;
|
|
return SUCCESS;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * Deletes a team.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param argc[in] Argument count.
|
|
|
|
|
+ * @param argv[in] Argument list.
|
|
|
|
|
+ * @return SUCCESS or an error code.
|
|
|
|
|
+ */
|
|
|
|
|
+int delete_team(int argc, char *argv[]){
|
|
|
|
|
+ if (argc != 1){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Team deletion takes exactly one argument, %d supplied\n", argc
|
|
|
|
|
+ );
|
|
|
|
|
+ return ERROR_INPUT_TEAM_DELETE_ARGUMENT_COUNT;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Open database
|
|
|
|
|
+ sqlite3 *db;
|
|
|
|
|
+ if (
|
|
|
|
|
+ SUCCESS != sqlite3_open_v2(db_location, &db, SQLITE_OPEN_READWRITE, NULL)
|
|
|
|
|
+ ){
|
|
|
|
|
+ fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_CANT_OPEN;
|
|
|
|
|
+ }
|
|
|
|
|
+ char query[200] = "SELECT count(id) AS c FROM teams WHERE id = ?";
|
|
|
|
|
+ sqlite3_stmt *stmt_verify;
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_verify, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "Error verifiying team: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ return ERROR_DB_TEAM_ID;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_verify, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ if (SQLITE_ROW != sqlite3_step(stmt_verify)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr, "Unable to verify team: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_VERIFY_TEAM_UNIT;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sqlite3_column_int(stmt_verify, 0) == 0){
|
|
|
|
|
+ fprintf(stderr, "Team with ID '%s' does not exists\n", argv[0]);
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_INPUT_VERIFY_TEAM_UNIT_TEAM;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_finalize(stmt_verify);
|
|
|
|
|
+
|
|
|
|
|
+ // Delete from teams
|
|
|
|
|
+ sqlite3_stmt *stmt_delete;
|
|
|
|
|
+ strcpy(query, "DELETE FROM teams WHERE id = ?");
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_delete, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Failed to prepare statement to delete from teams: %s\n",
|
|
|
|
|
+ sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_delete);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_DELETE_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_delete, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ if (SQLITE_DONE != sqlite3_step(stmt_delete)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Unable to to delete from units_teams: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_delete);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_DELETE_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_finalize(stmt_delete);
|
|
|
|
|
+
|
|
|
|
|
+ // Delete from unit_teams
|
|
|
|
|
+ strcpy(query, "DELETE FROM units_teams WHERE team = ?");
|
|
|
|
|
+ if (SQLITE_OK != sqlite3_prepare_v2(db, query, -1, &stmt_delete, 0)) {
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Failed to prepare statement to delete from units_teams: %s\n",
|
|
|
|
|
+ sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_delete);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_DELETE_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+ sqlite3_bind_text(stmt_delete, 1, argv[0], strlen(argv[0]), NULL);
|
|
|
|
|
+ if (SQLITE_DONE != sqlite3_step(stmt_delete)){
|
|
|
|
|
+ fprintf(
|
|
|
|
|
+ stderr,
|
|
|
|
|
+ "Unable to to delete from units_teams: %s\n", sqlite3_errmsg(db)
|
|
|
|
|
+ );
|
|
|
|
|
+ sqlite3_finalize(stmt_delete);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return ERROR_DB_DELETE_TEAMS;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Inform about the deleted team
|
|
|
|
|
+ printf("Team with ID '%s' deleted\n", argv[0]);
|
|
|
|
|
+ sqlite3_finalize(stmt_delete);
|
|
|
|
|
+ sqlite3_close(db);
|
|
|
|
|
+ return SUCCESS;
|
|
|
|
|
+}
|