extern int RelationalUpdatePlayerDetails(const char* oldName, const char* newName, const char* newNotes) { int ret = FALSE; int exist_id, player_id; DBProvider *pdb; if ((pdb = ConnectToDB(dbProviderType)) == NULL) return FALSE; player_id = GetPlayerId(pdb, oldName); exist_id = GetPlayerId(pdb, newName); if (exist_id != player_id && exist_id != -1) { /* Can't change the name to an existing one */ outputerrf( _("New player name already exists.") ); } else { char *buf = g_strdup_printf("UPDATE player SET name = '%s', notes = '%s' WHERE player_id = %d", newName, newNotes, player_id); if (pdb->UpdateCommand(buf)) { ret = 1; pdb->Commit(); } else outputerrf( _("Error running database command") ); g_free(buf); } pdb->Disconnect(); return ret; }
extern void CommandRelationalShowDetails(char *sz) { gchar output[4096]; statcontext *psc; gchar *player0 = NextToken(&sz); gchar *player1 = NextToken(&sz); if (!player0) { outputerrf(_ ("You must specify a player name to list the details for " "(see `help relational show details').")); return; } psc = relational_player_stats_get(player0, player1); if (!psc) { outputerrf(_("Empty player stats or player(s) not found")); return; } DumpStatcontext(output, psc, player0, player1 ? player1 : _("Opponents"), 0); g_free(psc); #if USE_GTK if (fX) { GTKTextWindow(output, _("Player statistics"), DT_INFO, NULL); } else #endif { outputl(_("Player statistics\n\n")); outputl(output); } }
extern void OpenURL(const char *szURL) { const gchar *browser = get_web_browser(); gchar *commandString; GError *error = NULL; if (!(browser) || !(*browser)) { #ifdef WIN32 int win_error; gchar *url = g_filename_to_uri(szURL, NULL, NULL); win_error = (int) ShellExecute(NULL, TEXT("open"), url ? url : szURL, NULL, ".\\", SW_SHOWNORMAL); if (win_error < 33) outputerrf(_("Failed to perform default action on " "%s. Error code was %d"), url, win_error); g_free(url); return; #endif } commandString = g_strdup_printf("'%s' '%s'", browser, szURL); if (!g_spawn_command_line_async(commandString, &error)) { outputerrf(_("Browser couldn't open file (%s): %s\n"), commandString, error->message); g_error_free(error); } return; }
GtkWidget * gtk_colour_picker_new3d(Material * pMat, int opacity, TextureType textureType) { GtkWidget *previewWidget, *button = gtk_button_new(); if (curDetail == MAX_DETAILS) { outputerrf("Error: Too many 3d colour previews\n"); return 0; } details[curDetail].mat = *pMat; previewWidget = CreateGLPreviewWidget(&details[curDetail].mat); gtk_widget_set_size_request(previewWidget, PREVIEW_WIDTH, PREVIEW_HEIGHT); gtk_container_add(GTK_CONTAINER(button), previewWidget); details[curDetail].pBoardMat = pMat; /* Material on board */ details[curDetail].preview = button; details[curDetail].opacity = opacity; details[curDetail].textureType = textureType; g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(UpdateColour3d), &details[curDetail]); curDetail++; return button; }
static void MoveListRolloutPresets(GtkWidget * pw, hintdata * phd) { const gchar *preset; gchar *file = NULL; gchar *path = NULL; gchar *command = NULL; preset = (const gchar *) g_object_get_data(G_OBJECT(pw), "user_data"); file = g_strdup_printf("%s.rol", preset); path = g_build_filename(szHomeDirectory, "rol", file, NULL); if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) { command = g_strdup_printf("load commands \"%s\"", path); outputoff(); UserCommand(command); outputon(); MoveListRolloutClicked(pw, phd); } else { outputerrf(_("You need to save a preset as \"%s\""), file); MoveListRolloutSettings(pw, NULL); } g_free(file); g_free(path); g_free(command); }
int SQLiteUpdateCommand(const char* str) { char *zErrMsg; int ret = sqlite3_exec(connection, str, NULL, NULL, &zErrMsg); if (ret != SQLITE_OK) { outputerrf("SQL error: %s\nfrom '%s'", zErrMsg, str); sqlite3_free(zErrMsg); } return (ret == SQLITE_OK); }
RowSet *SQLiteSelect(const char* str) { size_t i, row; int ret; char *buf = g_strdup_printf("Select %s;", str); RowSet *rs = NULL; sqlite3_stmt *pStmt; ret = sqlite3_prepare(connection, buf, -1, &pStmt, NULL); g_free(buf); if (ret == SQLITE_OK) { size_t numCols = (size_t)sqlite3_column_count(pStmt); size_t numRows = 0; while((ret = sqlite3_step(pStmt)) == SQLITE_ROW) numRows++; if (sqlite3_reset(pStmt) != SQLITE_OK) outputerrf("SQL error: %s in sqlite3_reset()", sqlite3_errmsg(connection)); rs = MallocRowset(numRows + 1, numCols); /* first row is headings */ for (i = 0; i < numCols; i++) SetRowsetData(rs, 0, i, sqlite3_column_name(pStmt, (int)i)); row = 0; while((ret = sqlite3_step(pStmt)) == SQLITE_ROW) { row++; for (i = 0; i < numCols; i++) SetRowsetData(rs, row, i, (const char*)sqlite3_column_text(pStmt, (int)i)); } if (ret == SQLITE_DONE) ret = SQLITE_OK; } if (ret != SQLITE_OK) outputerrf("SQL error: %s\nfrom '%s'", sqlite3_errmsg(connection), str); if (sqlite3_finalize(pStmt) != SQLITE_OK) outputerrf("SQL error: %s in sqlite3_finalize()", sqlite3_errmsg(connection)); return rs; }
static GtkWidget * CreateGLPreviewWidget(Material * pMat) { /* Rename this (and the one above to CreateGLBoardWidget) */ GtkWidget *p3dWidget = gtk_drawing_area_new(); /* Set OpenGL-capability to the widget - no list sharing */ if (!gtk_widget_set_gl_capability(p3dWidget, getGlConfig(), NULL, TRUE, GDK_GL_RGBA_TYPE)) { outputerrf("Can't create opengl capable widget\n"); return NULL; } if (p3dWidget == NULL) { outputerrf("Can't create opengl drawing widget\n"); return NULL; } g_signal_connect(G_OBJECT(p3dWidget), "realize", G_CALLBACK(realize_preview3d), NULL); g_signal_connect(G_OBJECT(p3dWidget), "expose_event", G_CALLBACK(expose_event_preview3d), pMat); return p3dWidget; }
void OutputWin32SocketError(const char *action) { LPVOID lpMsgBuf; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) & lpMsgBuf, 0, NULL) != 0) { outputerrf("%s (%s):\n%s", _("Windows socket error"), action, (LPCTSTR) lpMsgBuf); if (LocalFree(lpMsgBuf) != NULL) g_print("LocalFree() failed\n"); } }
static void SQLiteDisconnect(void) { if (sqlite3_close(connection) != SQLITE_OK) outputerrf("SQL error: %s in sqlite3_close()", sqlite3_errmsg(connection)); }
RowSet* ConvertPythonToRowset(PyObject *v) { RowSet *pRow; Py_ssize_t row, col; int i, j; if (!PySequence_Check(v)) { outputerrf( _("invalid Python return") ); return NULL; } row = PySequence_Size(v); col = 0; if (row > 0) { PyObject *cols = PySequence_GetItem(v, 0); if (!PySequence_Check(cols)) { outputerrf( _("invalid Python return") ); return NULL; } else col = PySequence_Size(cols); } pRow = MallocRowset((size_t)row, (size_t)col); for (i = 0; i < (int)pRow->rows; i++) { PyObject *e = PySequence_GetItem(v, i); if (!e) { outputf(_("Error getting item %d\n"), i); continue; } if (PySequence_Check(e)) { for (j = 0; j < (int)pRow->cols; j++) { char buf[1024]; PyObject *e2 = PySequence_GetItem(e, j); if (!e2) { outputf(_("Error getting sub item (%d, %d)\n"), i, j); continue; } if (PyUnicode_Check(e2)) strcpy(buf, PyString_AsString(PyUnicode_AsUTF8String(e2))); else if (PyString_Check(e2)) strcpy(buf, PyString_AsString(e2)); else if (PyInt_Check(e2) || PyLong_Check(e2) || !StrCaseCmp(e2->ob_type->tp_name, "Decimal")) /* Not sure how to check for decimal type directly */ sprintf(buf, "%d", (int)PyInt_AsLong(e2)); else if (PyFloat_Check(e2)) sprintf(buf, "%.4f", PyFloat_AsDouble(e2)); else if (e2 == Py_None) sprintf(buf, "[%s]", _("none")); else sprintf(buf, "[%s]", _("unknown type")); SetRowsetData(pRow, (size_t)i, (size_t)j, buf); Py_DECREF(e2); } } else { outputf(_("Item %d is not a list\n"), i); } Py_DECREF(e); } return pRow; }
extern void CommandRelationalAddMatch(char *sz) { DBProvider *pdb; char *buf, *buf2, *date; char warnings[1024] = ""; int session_id, existing_id, player_id0, player_id1; char *arg = NULL; gboolean quiet = FALSE; arg = NextToken(&sz); if (arg) quiet = !strcmp(arg, "quiet"); if (ListEmpty(&lMatch)) { outputl(_("No match is being played.")); return; } /* Warn if match is not finished or fully analyzed */ if (!quiet && !GameOver()) strcat(warnings, _("The match is not finished\n")); if (!quiet && !MatchAnalysed()) strcat(warnings, _("All of the match is not analyzed\n")); if (*warnings) { strcat(warnings, _("\nAdd match anyway?")); if (!GetInputYN(warnings)) return; } if ((pdb = ConnectToDB(dbProviderType)) == NULL) { outputerrf(_("Error opening database")); return; } existing_id = RelationalMatchExists(pdb); if (existing_id != -1) { if (!quiet && !GetInputYN(_("Match exists, overwrite?"))) return; /* Remove any game stats and games */ buf2 = g_strdup_printf("FROM game WHERE session_id = %d", existing_id); buf = g_strdup_printf("DELETE FROM gamestat WHERE game_id in (SELECT game_id %s)", buf2); pdb->UpdateCommand(buf); g_free(buf); buf = g_strdup_printf("DELETE %s", buf2); pdb->UpdateCommand(buf); g_free(buf); g_free(buf2); /* Remove any match stats and session */ buf = g_strdup_printf("DELETE FROM matchstat WHERE session_id = %d", existing_id); pdb->UpdateCommand(buf); g_free(buf); buf = g_strdup_printf("DELETE FROM session WHERE session_id = %d", existing_id); pdb->UpdateCommand(buf); g_free(buf); } session_id = GetNextId(pdb, "session"); player_id0 = AddPlayer(pdb, ap[0].szName); player_id1 = AddPlayer(pdb, ap[1].szName); if (session_id == -1 || player_id0 == -1 || player_id1 == -1) { outputl(_("Error adding match.")); return; } if (mi.nYear) date = g_strdup_printf("%04d-%02d-%02d", mi.nYear, mi.nMonth, mi.nDay); else date = NULL; buf = g_strdup_printf("INSERT INTO session(session_id, checksum, player_id0, player_id1, " "result, length, added, rating0, rating1, event, round, place, annotator, comment, date) " "VALUES (%d, '%s', %d, %d, %d, %d, CURRENT_TIMESTAMP, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')", session_id, GetMatchCheckSum(), player_id0, player_id1, MatchResult(ms.nMatchTo), ms.nMatchTo, NS(mi.pchRating[0]), NS(mi.pchRating[1]), NS(mi.pchEvent), NS(mi.pchRound), NS(mi.pchPlace), NS(mi.pchAnnotator), NS(mi.pchComment), NS(date)); updateStatisticsMatch(&lMatch); if (pdb->UpdateCommand(buf)) { if (AddStats(pdb, session_id, player_id0, 0, "matchstat", ms.nMatchTo, &scMatch) && AddStats(pdb, session_id, player_id1, 1, "matchstat", ms.nMatchTo, &scMatch)) { if (storeGameStats) AddGames(pdb, session_id, player_id0, player_id1); pdb->Commit(); } } g_free(buf); g_free(date); pdb->Disconnect(); }