示例#1
0
int
main (int argc, char *argv[])
{
  int rc = 0;
  uint8_t db_type = PATTS_DBCONN_MYSQL;
  char *host = NULL, *user = NULL, *passwd = NULL, *database = NULL;
  char *port = "0";

  struct option longopts[] =
    {
      {"database", required_argument, 0, 'd'},
      {"help",     no_argument,       0, 'e'},
      {"host",     required_argument, 0, 'h'},
      {"port",     required_argument, 0, 'p'},
      {"user",     required_argument, 0, 'u'},
      {"version",  no_argument,       0, 'v'},
      {0, 0, 0, 0}
    };

  if (argc > 1)
    {
      int c;
      int longindex;
      long temp_port;
      while ((c = getopt_long (argc, argv, "d:h:p:u:v", longopts, &longindex))
	     != -1)
	{
	  switch (c)
	    {
	    case 'd':
	      database = optarg;
	      break;

	    case 'e':
	      puts (USAGE_INFO);
	      return 0;

	    case 'h':
	      host = optarg;
	      break;

	    case 'p':
	      c = sscanf (optarg, "%ld", &temp_port);
	      if (c != 1)
		{
		  fprintf (stderr, "patts-upg: %s is not a valid number\n",
			   optarg);
		  return 2;
		}

	      if (temp_port < 0 || temp_port > 65535)
		{
		  fprintf (stderr, "patts-upg: %s is not a valid port\n",
			   optarg);
		  return 2;
		}

	      port = optarg;
	      break;

	    case 'u':
	      user = optarg;
	      break;

	    case 'v':
	      printf (VERSION_INFO, patts_get_library_version ());
	      return 0;

	    case '?':
	      return 1;
	    };
	}
    }

  bool free_host = false, free_user = false, free_pw = false, free_db = false;
  char *check;

  if (!host)
    {
      host = malloc (128 * sizeof (char));
      if (!host)
	{
	  fprintf (stderr, "patts-upg: Out of memory\n");
	  rc = PATTS_MEMORYERROR;
	  goto end;
	}

      free_host = true;
      printf ("Server (default: localhost): ");
      check = fgets (host, 128, stdin);
      if (!check)
	{
	  rc = PATTS_OVERFLOW;
	  goto end;
	}

      trim (host);
      if (strlen (host) == 0)
	strcpy (host, "localhost");
    }

  if (!user)
    {
      user = malloc (17 * sizeof (char));
      if (!user)
	{
	  fprintf (stderr, "patts-upg: Out of memory\n");
	  rc = PATTS_MEMORYERROR;
	  goto end;
	}

      free_user = true;
      printf ("User (default: root): ");
      check = fgets (user, 17, stdin);
      if (!check)
	{
	  rc = PATTS_OVERFLOW;
	  goto end;
	}

      trim (user);
      if (strlen (user) == 0)
	strcpy (user, "root");
    }

  passwd = patts_malloc (PASS_MAX * sizeof (char));
  if (!passwd)
    {
      fprintf (stderr, "patts-upg: Out of memory\n");
      rc = PATTS_MEMORYERROR;
      goto end;
    }

  free_pw = true;
  check = getpass ("Password (will not echo): ");
  if (!check)
    {
      rc = PATTS_OVERFLOW;
      goto end;
    }

  size_t plen = strlen (check);
  if (plen >= PASS_MAX)
    {
      rc = PATTS_OVERFLOW;
      goto end;
    }

  for (size_t i = 0; i <= plen; ++i)
    {
      passwd[i] = check[i];
      check[i] = 0xDF;
    }

  if (!database)
    {
      database = malloc (128 * sizeof (char));
      if (!database)
	{
	  fprintf (stderr, "patts-upg: Out of memory\n");
	  rc = PATTS_MEMORYERROR;
	  goto end;
	}

      free_db = true;
      printf ("Database (default: patts): ");
      check = fgets (database, 128, stdin);
      if (!check)
	{
	  rc = PATTS_OVERFLOW;
	  goto end;
	}

      trim (database);
      if (strlen (check) == 0)
	strcpy (database, "patts");
    }

  sqon_init ();

  rc = patts_upgrade_db (db_type, host, user, passwd, database, port);
  if (rc)
    {
      if (PATTS_UNEXPECTED == rc)
	{
	  fprintf (stderr, "patts-upg: An unexpected error occurred. This\n"
		   "can happen if the database has a later version\n"
		   "than is supported by your version of libpatts.\n\n");
	}
      else
	{
	  fprintf (stderr, "patts-upg: Error %d occurred.\n\n", rc);
	}

      fprintf (stderr, "patts-upg: Your libpatts version is \"%s\".\n"
	       "Contact Delwink support for assistance.\n",
	       patts_get_library_version ());
      goto end;
    }

  puts ("patts-upg: Database upgrade completed successfully!");

 end:
  if (free_host)
    free (host);
  if (free_user)
    free (user);
  if (free_pw)
    patts_free (passwd);
  if (free_db)
    free (database);

  return !!rc;
}
示例#2
0
int
patts_init (uint8_t db_type, const char *host, const char *user,
	    const char *passwd, const char *database, const char *port)
{
  int rc = 0;
  const char *fmt = "SELECT isAdmin FROM User WHERE dbUser='******'";
  char *query, *user_info, *esc_user;
  const char *isAdmin;
  json_t *list, *user_cols;
  size_t qlen = 1;

  if (strlen (user) >= 8)
    return PATTS_OVERFLOW;

  strcpy (user_id, user);

  sqon_init ();

  PATTSDB = sqon_new_connection (db_type, host, user, passwd, database, port);

  rc = sqon_escape (patts_get_db (), user, &esc_user, false);
  if (rc)
    return rc;

  qlen += strlen (fmt) - 2;
  qlen += strlen (esc_user);

  query = sqon_malloc (qlen * sizeof (char));
  if (NULL == query)
    {
      sqon_free (esc_user);
      return PATTS_MEMORYERROR;
    }

  snprintf (query, qlen, fmt, esc_user);

  rc = sqon_query (patts_get_db (), query, &user_info, NULL);
  sqon_free (query);
  sqon_free (esc_user);

  if (rc)
    return rc;

  list = json_loads (user_info, 0, NULL);
  sqon_free (user_info);

  if (NULL == list)
    return PATTS_LOADERROR;
  if (0 == json_array_size (list))
    return PATTS_NOSUCHUSER;

  user_cols = json_array_get (list, 0);

  isAdmin = json_string_value (json_object_get (user_cols, "isAdmin"));

  if (!strcmp (isAdmin, "\001") || !strcmp (isAdmin, "1"))
    HAVE_ADMIN = true;
  else if (!strcmp (isAdmin, "") || !strcmp (isAdmin, "0"))
    HAVE_ADMIN = false;
  else
    rc = PATTS_UNEXPECTED;

  json_decref (list);

  return rc;
}