* never have errors, or it is really fatal.
*/
B_DB *
-db_init_database(void *jcr, char *db_name, char *db_user, char *db_password,
+db_init_database(JCR *jcr, char *db_name, char *db_user, char *db_password,
char *db_address, int db_port, char *db_socket)
{
B_DB *mdb;
+ if (!db_user) {
+ Jmsg(jcr, M_FATAL, 0, _("A user name for MySQL must be supplied.\n"));
+ return NULL;
+ }
P(mutex); /* lock DB queue */
/* Look to see if DB already open */
for (mdb=NULL; (mdb=(B_DB *)qnext(&db_list, &mdb->bq)); ) {
memset(mdb, 0, sizeof(B_DB));
mdb->db_name = bstrdup(db_name);
mdb->db_user = bstrdup(db_user);
- mdb->db_password = bstrdup(db_password);
+ if (db_password) {
+ mdb->db_password = bstrdup(db_password);
+ }
if (db_address) {
mdb->db_address = bstrdup(db_address);
}
* which are returned in the errmsg
*/
int
-db_open_database(void *jcr, B_DB *mdb)
+db_open_database(JCR *jcr, B_DB *mdb)
{
int errstat;
mdb->db_name, /* database name */
mdb->db_port, /* default port */
mdb->db_socket, /* default = socket */
- 0); /* flags = none */
+ CLIENT_FOUND_ROWS); /* flags */
- /* If no connect, try once more incase it is a timing problem */
+ /* If no connect, try once more in case it is a timing problem */
if (mdb->db == NULL) {
mdb->db = mysql_real_connect(
&(mdb->mysql), /* db */
mdb->db_name, /* database name */
mdb->db_port, /* default port */
mdb->db_socket, /* default = socket */
- 0); /* flags = none */
+ CLIENT_FOUND_ROWS); /* flags */
}
Dmsg0(50, "mysql_real_connect done\n");
if (!check_tables_version(jcr, mdb)) {
V(mutex);
+ db_close_database(jcr, mdb);
return 0;
}
+#ifdef HAVE_TREAD_SAFE_MYSQL
+ my_thread_init();
+#endif
+
mdb->connected = TRUE;
V(mutex);
return 1;
}
void
-db_close_database(void *jcr, B_DB *mdb)
+db_close_database(JCR *jcr, B_DB *mdb)
{
P(mutex);
mdb->ref_count--;
+#ifdef HAVE_TREAD_SAFE_MYSQL
+ my_thread_end();
+#endif
if (mdb->ref_count == 0) {
qdchain(&mdb->bq);
if (mdb->connected && mdb->db) {
mysql_server_end();
#endif
}
-/* pthread_mutex_destroy(&mdb->mutex); */
rwl_destroy(&mdb->lock);
free_pool_memory(mdb->errmsg);
free_pool_memory(mdb->cmd);
* For MySQL, NULL causes the auto-increment value
* to be updated.
*/
-int db_next_index(void *jcr, B_DB *mdb, char *table, char *index)
+int db_next_index(JCR *jcr, B_DB *mdb, char *table, char *index)
{
strcpy(index, "NULL");
return 1;
* Escape strings so that MySQL is happy
*
* NOTE! len is the length of the old string. Your new
- * string must be long enough (max 2*old) to hold
+ * string must be long enough (max 2*old+1) to hold
* the escaped output.
*/
void
mysql_escape_string(snew, old, len);
#ifdef DO_IT_MYSELF
+
+/* Should use mysql_real_escape_string ! */
+unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length);
+
char *n, *o;
n = snew;
send(ctx, "\n");
}
+/*
+ * If full_list is set, we list vertically, otherwise, we
+ * list on one line horizontally.
+ */
void
-list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx)
+list_result(B_DB *mdb, DB_LIST_HANDLER *send, void *ctx, e_list_type type)
{
SQL_FIELD *field;
- SQL_ROW row;
- unsigned int i, col_len;
+ SQL_ROW row;
+ unsigned int i, col_len, max_len = 0;
char buf[2000], ewc[30];
if (mdb->result == NULL) {
sql_field_seek(mdb, 0);
for (i = 0; i < sql_num_fields(mdb); i++) {
field = sql_fetch_field(mdb);
- if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */
- field->max_length += (field->max_length - 1) / 3;
- }
col_len = strlen(field->name);
- if (col_len < field->max_length)
- col_len = field->max_length;
- if (col_len < 4 && !IS_NOT_NULL(field->flags))
- col_len = 4; /* 4 = length of the word "NULL" */
- field->max_length = col_len; /* reset column info */
+ if (type == VERT_LIST) {
+ if (col_len > max_len) {
+ max_len = col_len;
+ }
+ } else {
+ if (IS_NUM(field->type) && field->max_length > 0) { /* fixup for commas */
+ field->max_length += (field->max_length - 1) / 3;
+ }
+ if (col_len < field->max_length) {
+ col_len = field->max_length;
+ }
+ if (col_len < 4 && !IS_NOT_NULL(field->flags)) {
+ col_len = 4; /* 4 = length of the word "NULL" */
+ }
+ field->max_length = col_len; /* reset column info */
+ }
+ }
+
+ if (type == VERT_LIST) {
+ goto vertical_list;
}
list_dashes(mdb, send, ctx);
sql_field_seek(mdb, 0);
for (i = 0; i < sql_num_fields(mdb); i++) {
field = sql_fetch_field(mdb);
- sprintf(buf, " %-*s |", (int)field->max_length, field->name);
+ bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, field->name);
send(ctx, buf);
}
send(ctx, "\n");
for (i = 0; i < sql_num_fields(mdb); i++) {
field = sql_fetch_field(mdb);
if (row[i] == NULL) {
- sprintf(buf, " %-*s |", (int)field->max_length, "NULL");
+ bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, "NULL");
} else if (IS_NUM(field->type)) {
- sprintf(buf, " %*s |", (int)field->max_length,
+ bsnprintf(buf, sizeof(buf), " %*s |", (int)field->max_length,
add_commas(row[i], ewc));
} else {
- sprintf(buf, " %-*s |", (int)field->max_length, row[i]);
+ bsnprintf(buf, sizeof(buf), " %-*s |", (int)field->max_length, row[i]);
}
send(ctx, buf);
}
send(ctx, "\n");
}
list_dashes(mdb, send, ctx);
+ return;
+
+vertical_list:
+
+ while ((row = sql_fetch_row(mdb)) != NULL) {
+ sql_field_seek(mdb, 0);
+ for (i = 0; i < sql_num_fields(mdb); i++) {
+ field = sql_fetch_field(mdb);
+ if (row[i] == NULL) {
+ bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, "NULL");
+ } else if (IS_NUM(field->type)) {
+ bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name,
+ add_commas(row[i], ewc));
+ } else {
+ bsnprintf(buf, sizeof(buf), " %*s: %s\n", max_len, field->name, row[i]);
+ }
+ send(ctx, buf);
+ }
+ send(ctx, "\n");
+ }
+ return;
}