Aller au contenu


Photo

Utilisation du mysql-c-connector

mysql

  • Please log in to reply
2 réponses à ce sujet

#1 beb

beb

    Planteur de pousses

  • Membre
  • Pip
  • 7 messages

Posté 25 février 2013 - 17:37

Bonjour à tous,
J'ai un gros problème qui dépasse mes compétences, mais je voudrais apprendre et je suis buté, alors...
Voilà, pour commencer j'ai compilé libmysql.dylib et libmysqlclient.a en suivant cette trouvaille.
J'ai démarré un outil en ligne de commande C sous Xcode. Mon code, en m'aidant de cette page:
int main(int argc, const char * argv[])
{
	 MYSQL mysql;
  
	const char *dbhost="localhost", *dbname="XXX", *dbpass="XXX", *dbuser="XXX";
  
	mysql_init(&mysql);
	mysql_options(&mysql, MYSQL_OPT_CONNECT_TIMEOUT, "2");
  
	if (!(mysql_real_connect(&mysql, dbhost, dbuser, dbpass, dbname, 8889, "/Applications/MAMP/tmp/mysql/mysql.sock", 0)))
	{
		printf("\nErreur de connection!\nErreur :\n%s", mysql_error(&mysql));
	}
	else
	{
		printf("\nConnection à la base \'%s\' réussie!\n\n", dbname);
	}
	MYSQL_RES *result;
	MYSQL_ROW row;
  
	result = mysql_list_dbs(&mysql, NULL);
  
	printf("Liste des bases:\n\n");
	if (result) {
		unsigned int num_fields = mysql_num_fields(result);
		while ((row = mysql_fetch_row(result))) {
			unsigned long *lengths;
			lengths = mysql_fetch_lengths(result);
			for (int i = 0 ; i < num_fields; i++) {
				printf("%.*s\n", (int)lengths[i], row[i]?row[i]:NULL);
			}
		}
	}
	  
	mysql_free_result(result);
	mysql_close(&mysql);
  
	return 0;
  
}

Le programme rempli presque sa mission. Je me connecte, récupère toutes les bases mais deux choses:
-Ma libmysqlclient.a ne fonctionne pas.
-Ma libmysql.dylib fait son travail mais, je crois que j'ai de gros problèmes de fuites de mémoire, voir la suite!
Maintenant, si j'inclus cette libraire dans un projet cocoa ou simplement le même programme en ligne de commande avec Foundation, le code s'exécute bien, mais avant de se planter lamentablement avec ce genre d'erreurs:
autorelease pool page %p corrupted\n magic 0x%08x ...
_objc_fatal
"POOL HIGHWATER: new high water mark of %u pending autoreleases for thread %p:"
_objc_inform
Pour arriver à:
0x7fff93d9b209: movq 16(%rsi), %rax EXC_BAD_ACCESS

Donc, en C je chausse du 1, en Objective C du 2 donc Xcode 1,5 et j'aimerai bien y arriver quand même.
Je connais le projet de Karl Kraft (j'avais démarré avec, mais il m'empêche d'architecturer mon code comme je le voudrais), MCP est dépassé par le temps, il faut compiler la librairie sur laquelle j'ai des doutes. Reprendre SequelPro est du coup carrément trop fort pour moi. Dernièrement, je n'ai pas envie d'envoyer des requêtes à un programme en php, je voudrais tout faire avec Cocoa. Help!

Avec ARC ou sans, c'est pareil. Mes @autorelease{...} ne changent rien à l'affaire, je suis perdu devant mon bureau!

Voilà, je vous remercie d'avance de votre aide précieuse.

#2 Ceetix

Ceetix

    Brasseur de pâte à cacao

  • Artisan chocolatier
  • PipPipPipPipPipPipPip
  • 2 630 messages
  • LocationParis

Posté 26 février 2013 - 09:54

Hello, go Présentation.
Pour ton crash, tu as mis des points d'arrêt pour regarder un peu à quel moment tu plantes ?

#3 beb

beb

    Planteur de pousses

  • Membre
  • Pip
  • 7 messages

Posté 26 février 2013 - 11:29

Salut,
J'ai mis des point d'arrêt oui.
-Sur une app cocoa, le programme plante sur la dernière accolade (fin de la méthode), en retournant dans le run loop. (Si j'ai bien compris que l'instruction sur laquelle est mis le breakpoint est la dernière exécutée, dans mon cas le retour au run loop).
-Sur un outil en ligne de commande Foundation, le programme plante à la fin du main, sur le return 0.
Quand je lance la version version ligne de commande en C, elle ne plante pas mais je ne sais pas si je peux utiliser Leaks. J'ai mis un breakpoint sur le return 0; et Leaks ne me dit rien mais est-ce valable?

Edit: Bon, j'ai testé ma dylib avec les classes de Karl Kraft et le programme a planté comme le mien.
J'ai placé la statique de M.Karl dans mon programme cocoa, et tout s'est bien passé dans un premier temps (connexion). Mais pour lister les bases, le programme plante aussi.

-(NSArray *)getDBNames{
  
	MYSQL_RES *result;
	MYSQL_ROW row;
  
	unsigned int num_fields;
	int i;
  
	NSMutableArray *databases = [[NSMutableArray alloc] init];
  
	mysql_init(&mysql);
  
	mysql.unix_socket = "/Applications/MAMP/tmp/mysql/mysql.sock";
	mysql.port = 8889;
	mysql.host = "localhost";
	mysql.user="root";
	mysql.passwd="root";
  
	// C'est ici le dernier breakpoint avant le pire...
	result = mysql_list_dbs(&mysql,NULL);
  
	if (result) {
		num_fields = mysql_num_fields(result);
	  
		while ((row = mysql_fetch_row(result)))
		{
			unsigned long *lengths;
			lengths = mysql_fetch_lengths(result);
			for (i = 0; i < num_fields; i++)
			{
				NSString *dbName = [NSString stringWithFormat:@"%.*s ", (int) lengths[i], row[i] ? row[i] : "NULL"];
				dbName = [dbName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
				[databases insertObject:dbName atIndex:i];
			}
		}
	  
		mysql_free_result(result);
	  
		mysql_close(&mysql);
	  
		NSArray *returnArray = [databases sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
	  
		return returnArray;
	}
  
	return nil;
}

D'un autre côté, ne connaissant pas le latin...

Mais je crois que je me mélange un peu les pinceaux. C'est peut-être un problème d'utilisation de la librairie ici, les erreurs ne sont pas les mêmes. Alors, je vais peut-être partir sur le projet de Karl Kraft et si je me débrouille bien ce ne sera pas un problème d'utiliser la librairie à ma façon par la suite.





Also tagged with one or more of these keywords: mysql

0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)