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;
}
Beispiel #2
0
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;
}
Beispiel #5
0
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;
}
Beispiel #12
0
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();
}