LINUX.ORG.RU

Как в sqlite3 сделать «select * from ...» ?


0

0

Пытаюсь вывести всю базу данных, но получаю только первую запись.

Вывожу так:

static char *SQLbuf = NULL;
static int callback(void *NotUsed __attribute__((unused)),
					int argc,
					char **argv,
					char **azColName __attribute__((unused))){
	if(!*argv) return 1;
	int i;
	SQLbuf = strdup(*argv++);
	for(i = 1; i < argc; i++){
		SQLbuf = realloc(SQLbuf, strlen(SQLbuf)+strlen(*argv)+2);
		strcat(SQLbuf, ";");
		strcat(SQLbuf, *argv++);
	}
	return 0;
}

#define SQLexec(query) SQL_request(db_path, query)
char *SQL_request(char *dbname, char *q_str){
	DBG("db=%s, reqest=%s",dbname, q_str);
	sqlite3 *db;
	char *zErrMsg = NULL, *ret = NULL;
	int rc = sqlite3_open(dbname, &db);
	if(rc){sqlite3_close(db); die(NO_DB);}
	if(SQLbuf){free(SQLbuf); SQLbuf = NULL;}
	rc = sqlite3_exec(db, q_str, callback, NULL, &zErrMsg);
	if(rc){
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_close(db);
		die(SQL_ERR);
	}
	else if(SQLbuf)
		ret = strdup(SQLbuf);
	sqlite3_close(db);
	return ret;
}

int lsusers(){
	char *q_str = NULL, *list = NULL;
	q_str = calloc(512, 1);
	snprintf(q_str, 511, "select * from users order by login;");
	list = SQLexec(q_str);
	printf("%s\n\n",list);
	free(list);
	free(q_str);
	return OK;
}
Подозреваю, что как-то надо изменить функцию callback, но не доходит...

☆☆☆☆☆

Сам разобрался: оказывается, callback вызывается по одному разу на каждую строку ответа. Поэтому сделал так:

static int callback(void *NotUsed __attribute__((unused)),
					int argc,
					char **argv,
					char **azColName __attribute__((unused))){
	if(!*argv) return 1;
	int i;
	if(SQLbuf){
		SQLbuf = realloc(SQLbuf, strlen(SQLbuf)+2);
		strcat(SQLbuf, "\n");
	}
	for(i = 0; i < argc; i++){
		if(SQLbuf){
			SQLbuf = realloc(SQLbuf, strlen(SQLbuf)+strlen(*argv)+3);
			if(i) strcat(SQLbuf, ";");
			strcat(SQLbuf, *argv++);
		}
		else
			SQLbuf = strdup(*argv++);
	}
	return 0;
}

char *SQL_request(char *dbname, char *q_str){
	sqlite3 *db;
	char *zErrMsg = NULL, *ret = NULL;
	int rc = sqlite3_open(dbname, &db);
	if(rc){sqlite3_close(db); die(NO_DB);}
	free(SQLbuf); SQLbuf = NULL;
	rc = sqlite3_exec(db, q_str, callback, NULL, &zErrMsg);
	if(rc){
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_close(db);
		die(SQL_ERR);
	}
	else if(SQLbuf)
		ret = strdup(SQLbuf);
	sqlite3_close(db);
	free(SQLbuf); SQLbuf = NULL;
	return ret;
}

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: оффтоп от o

Абсолютно все, что нельзя написать на баше =)

А это - часть библиотечки для веб-аутентификации/авторизации. Все уже почти доделал - осталось «красивую» веб-морду для управления пользователями нарисовать.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

у тебя как минимум уйдет вся ручная работа с памятью и с освобождением ресурсов

Reset ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.