MongoDB Tutorial 3: Create database

From The Uniform Server Wiki
Revision as of 13:19, 1 August 2010 by Ric (talk | contribs) (New page: {{Nav MongoDB Tutorial 3}} '''''Create a database and user''''' == Introduction == Most MySQL administrators will be familiar with creating a restricted user and assigning that user to a s...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

 

MongoDB Production Standalone
UniServer 6-Carbo.

Create a database and user

Introduction

Most MySQL administrators will be familiar with creating a restricted user and assigning that user to a specific database. MongDB does things slightly different when a database is first used that database is created on the fly. Selecting a non-existent database and assigning a user creates that database. If database and user exists and password is different the password will be updated.

On previous page I explained using a multi-purpose function that performs the above. This page covers making that function more accessible by adding a cosmetic windows interface.

Template

I have provided a windows temple for this tutorial topic save the following to a new file z_mongo\mongodb_1\control \window_create_database.inc.php.

<?php

//-- Constants ----------------------------------------------------------------

define('IDC_USER_NAME',        3010); // Text box New user name
define('IDC_USER_PASSWORD',    3020); // Text box New user password
define('IDC_USER_DATABASE',    3030); // Text box Database name
define('IDC_USER_CANCEL',      3040); // Button Reset to default
define('IDC_USER_CREATE',      3050); // Button Create new user
define('IDC_USER_HELP',        3060); // Help

define('IDC_USER_LISTBOX',     3070); // Database list box

// Common variables

$mongo_user_win;        // Window handle
$user_new_db;           // List of dbs

//=== Create function =========================================================
function create_database_window($parent){
  global $mongo_user_win;
  global $user_new_db;

//=== 1) Create main window ---------------------------------------------------

$mongo_user_win = wb_create_window($parent, ModalDialog, "MongoDB Create Databse assign user", WBC_CENTER, WBC_CENTER, 294, 284,
  WBC_INVISIBLE | WBC_NOTIFY | WBC_TOP, WBC_HEADERSEL);

//=== 2) Create controls for the main window ----------------------------------

wb_create_control($mongo_user_win, Frame, 'User details and db name', 5, 5, 275, 130, 0, 0, 0, 0);
wb_create_control($mongo_user_win, Label, 'User Name',            15, 25,   50, 15, 0, 0, 0, 0);
wb_create_control($mongo_user_win, EditBox, '',                   75, 25,  195, 20, IDC_USER_NAME, 0, 0, 0);
wb_create_control($mongo_user_win, Label, 'Password',             15, 50,   45, 15, 0, 0x00000000, 0, 0);
wb_create_control($mongo_user_win, EditBox, '',                   75, 50,  195, 20, IDC_USER_PASSWORD, 0, 0, 0);
wb_create_control($mongo_user_win, Label, 'Database',             15, 75,   45, 15, 0, 0x00000000, 0, 0);
wb_create_control($mongo_user_win, EditBox, '',                   75, 75,  195, 20, IDC_USER_DATABASE, 0, 0, 0);
wb_create_control($mongo_user_win, PushButton, 'Help',            15, 105,  50, 25, IDC_USER_HELP, 0, 0, 0);
wb_create_control($mongo_user_win, PushButton, 'Create Change',   75, 105, 115, 25, IDC_USER_CREATE, 0, 0, 0);
wb_create_control($mongo_user_win, PushButton, 'Cancel',         200, 105,  70, 25, IDC_USER_CANCEL, 0, 0, 0);

wb_create_control($mongo_user_win, Frame, 'Select a database', 5, 140, 275, 105, 0, 0x00000000, 0, 0);
$list = wb_create_control($mongo_user_win, ListView, 'Head1',  20, 155, 250, 85, IDC_USER_LISTBOX, 0x00100080, 0, 0);


//=== INIT ====================
//--- Set up listview ---

//=== END INIT ================   

//=== 3) Assign handler function to the main window  --------------------------
wb_set_handler($mongo_user_win, "process_mysql_user");
  wb_set_image($mongo_user_win, getcwd()."/images/utray.ico");  // Add logo   
  wb_set_visible($mongo_user_win, true);               // Show window         

//=== 5) Enter application loop -----------------------------------------------
//wb_main_loop();                                  

}//==================================================== End Create function ===

//=== 4) Handler Function -----------------------------------------------------
function process_mysql_user($window, $id, $ctrl=0, $lparam1=0, $lparam2=0){
  global $user_new_db;

  switch($id) { 

   case IDCLOSE:                          // Constant IDCLOSE (8) predefined 
    wb_destroy_window($window);           // Destroy the window
   break; 
  }
}
//==================================================== End Handler Function ===
?>
  • Template contains unique contatnts for the windows components. Some common variables are defined.
  • We are wrapping the pop-up windows in a function create_database_window($parent).
  • A modaldialouge window is created invisible this allows it to be populated with data before being displayed.
  • Components are added labels, buttons and edit boxes. Only new component is the list view.
  • A section is reserved to set-up list view(add titles etc)
  • Next section assigns a handler function and logo. With the window completed it is displayed.
  • There is no need to run function wb_main_loop() this window is a child.
  • Finally the template contains a handler function.

Top

Test

Edit file z_mongo\mongodb_1\control\mongo_db.php Add the following to the include section:

include_once "window_create_database.inc.php"; // Window create database and assign user

Change the following section as shown:

   //=== Display help info ====================================================
   case ID_HELP_BUTTON:          // Button 

      create_database_window($window);
//    create_port_change_window($window);
//    wb_exec('Notepad',INFO_TXT);

   break; 
   //================================================ END Display help info ===

Run

  • Run Run_mongo_db.bat
  • Click "Help and Information" button
  • Result shown on right

I mentioned it is cosmetic! Looks pretty with no functionality.

Note:

  • This pop-up requires no separate initialisation function.
  • List box can be populated when it is created.

Top

List view - List databases

Add yhe following code

//=== INIT ====================
//--- Set up listview ---

  // Set column titles and widths
  wb_set_text($list, array(
    array("List of Databases", 200),
  ));

  $user_new_db = list_dbs_auth();        // Get list of dbs

  // Create rows and columns
  wb_create_items($list,$user_new_db);   // Fill list

//--- End Set up listview ---

//=== END INIT ================ 
  • The dark header of list view is populated with a column title
  • Function wb_set_text requires an handle $list to the list. This is followed by an array of titles/widths only a single column in this case.
  • We obtain an array of databases and save to variable $user_new_db
  • This array is used to populate list view using function wb_create_items. It takes as parameters handle $list and the array of dbs

Top

Item Clicked

When an item is clicked we want that item to be displayed in the database edit text window.

  //=== Item selected from list ==============================================
  case IDC_USER_LISTBOX:                   // A row was selected from db list

  $sel = wb_get_selected($ctrl);               // Get selection
  $sel = $sel ? implode(", ", $sel) : "none";  // Set selected value 

  if($sel =="none"){
    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),""); // Reset Set DB
  }
  else{

    $selected_index = $sel;                 // Save Array index
    $contents = wb_get_text($ctrl);         // Get row selected Returns an array of arrays
    $first_array = $contents[0];            // Select first array (which is selected row)
    $db_selected_name = $first_array[0];    // Select first column (which is db)
    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),$db_selected_name);   // Set DB
  }
  break;
  //============================================== Item selected from list ===
  • Item in list view click this event is passed to the handler function
  • List view is detected by a case statement using IDC_USER_LISTBOX
  • Either an item or blank item was clicked first we obtain an handle
  • This is used to determine what was returned.
  • sel is either none or an index
  • If "none" set the database list box to blank
  • If it was an index save it for later use
  • Get select name and set edit box accordingly

Top

User name

Selecting a database we want to display the user assigned to it. Every database created will have a single user assigned.

Well that’s an assumption if more users have been assigned only the first will be displayed.

//=== Item selected from list ==============================================
  case IDC_USER_LISTBOX:                   // A row was selected from db list

  $sel = wb_get_selected($ctrl);               // Get selection
  $sel = $sel ? implode(", ", $sel) : "none";  // Set selected value 

  if($sel =="none"){
    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),""); // Reset Set DB
    wb_set_text(wb_get_control($window, IDC_USER_NAME),"");     // Reset User name
  }
  else{
    $selected_index = $sel;                 // Save Array index
    $contents = wb_get_text($ctrl);         // Get row selected Returns an array of arrays
    $first_array = $contents[0];            // Select first array (which is selected row)
    $db_selected_name = $first_array[0];    // Select first column (which is db)
    $db_selected_name = trim($db_selected_name); // Clean

    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),$db_selected_name); // Set DB

    $users_array = get_user_auth($db_selected_name); //Select db return user/s in array

    if(empty($users_array)){       // No users
      wb_set_text(wb_get_control($window, IDC_USER_NAME),"");              // Reset User name
    }
    else{                          // Selet first user and display
      wb_set_text(wb_get_control($window, IDC_USER_NAME),$users_array[0]); // Set User name
    }
  }
  break;
  //============================================== Item selected from list ===
  • When a user clicks a database its name is stored in variable $db_selected_name
  • This is used to obtain an array of users using function get_user_auth($db_selected_name)
  • Returned array is saved in variable $users_array
    • If empty reset user name edit box
    • Not empty pick first user from array and display in edit box.
  • End case

Top

Cancel

Cancel button is provided as a quick way to restore window to its initial state.

   //=== CANCEL ===============================================================
   // Restore defaults

   case  IDC_USER_CANCEL:                       

    //-- Reset text boxes
    wb_set_text(wb_get_control($window, IDC_USER_NAME),"");       // Clear name
    wb_set_text(wb_get_control($window, IDC_USER_PASSWORD),"");   // Clear password
    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),"");   // Clear DB


    //--- Reset selected list box
    $temp = $user_new_db;                                               // Save old array        
    wb_delete_items (wb_get_control($window, IDC_USER_LISTBOX),NULL);   // Delete all list view entries
    wb_create_items (wb_get_control($window, IDC_USER_LISTBOX),$temp);  // Add array

   break;
   //============================================================ END CANCEL ===
  • All edit boxes are cleared
  • List array is set to NULL clearing all list entries
  • Original array is restored

Top

Create database or update password

Button Create or Update reads the text fields and validates each one. On validation creates a new database or updates a user password. List of databases is refreshed.

  //=== CREATE DATABASE ASIGN USER ============================================
  case  IDC_USER_CREATE: 

  $name  = wb_get_text(wb_get_control($window, IDC_USER_NAME));   // Get name
  $pass  = wb_get_text(wb_get_control($window, IDC_USER_PASSWORD)); // Get pass
  $db    = wb_get_text(wb_get_control($window,  IDC_USER_DATABASE));// Get db

 // Validate - name alphanumeric
 if (!(preg_match("/^[A-Za-z0-9_]+$/", $name ))) {
  $str  = "";
  $str .= "If name is empty please enter a name\n";
  $str .= "Only alphanumeric characters allowed";
  wb_message_box($window, $str,"User Name", WBC_INFO); 
  break;
 }

 // Validate password - require six or more alphanumeric characters
 if (!(preg_match("/^[A-Za-z0-9_]{6,}$/", $pass))) {
  $str  = "";
  $str .= "If password is empty please enter a password\n";
  $str .= "Enter six or more alphanumeric characters\n";
  $str .= "Only alphanumeric characters allowed";
  wb_message_box($window, $str,"Password", WBC_INFO); 
   break;
 }

 // Validate - db name 
 if (!(preg_match("/^[A-Za-z0-9_]+$/", $db))) {
  $str  = "";
  $str .= "If name is empty please enter a name\n";
  $str .= "Only alphanumeric characters allowed";
  wb_message_box($window, $str,"DB Name", WBC_INFO); 
  break;
 }

 // Create database or update user password
 create_db_auth($db,$name,$pass); 

 // Refresh database list
 $user_new_db = list_dbs_auth();        // Get list of dbs
 $temp = $user_new_db;                                                    
 wb_delete_items (wb_get_control($window, IDC_USER_LISTBOX),NULL);   
 wb_create_items (wb_get_control($window, IDC_USER_LISTBOX),$temp);  

   break;
  //======================================= END CREATE DATABASE ASIGN USER ===
  • All three-text fields are read into variables $db,$name and $pass
  • Each is checked against a list of valid characters.
    • Note: You can add to this list of valid characters
    • Password is forced to have a minimum of six characters
  • With all three fields validated either a new database is created or user password updated.
  • List of databases is refreshed.

Top

Can script be run

At this stage we have not decided how to run this script. There are two options either from a drop down menu or using a button on main application.

Script requires MongoDB server to be running, we can prevent the script from being called by disabling a button. However this is not possible with a drop down menu hence we need to include a check and alert a user accordingly.

// Check server running
if(!mongodb_running()){
 $str  = "";
 $str .= "This item requires access to a running server.\n";
 $str .= "Please start MonGoDB server and run\n";
 $str .= "this item again.";
 wb_message_box(NULL, $str,"Server not running", WBC_INFO); 
 return; // Give up
}

Top

Complete Script

<?php

//-- Constants ----------------------------------------------------------------

define('IDC_USER_NAME',        3010); // Text box New user name
define('IDC_USER_PASSWORD',    3020); // Text box New user password
define('IDC_USER_DATABASE',    3030); // Text box Database name
define('IDC_USER_CANCEL',      3040); // Button Reset to default
define('IDC_USER_CREATE',      3050); // Button Create new user
define('IDC_USER_HELP',        3060); // Help


define('IDC_USER_LISTBOX',     3070); // Database list box

// Common variables

$mongo_user_win;        // Window handle
$user_new_db;           // List of dbs

//=== Create function =========================================================
function create_database_window($parent){
  global $mongo_user_win;
  global $user_new_db;

// Check server running
if(!mongodb_running()){
 $str  = "";
 $str .= "This item requires access to a running server.\n";
 $str .= "Please start MonGoDB server and run\n";
 $str .= "this item again.";
 wb_message_box(NULL, $str,"Server not running", WBC_INFO); 
 return; // Give up
}

//=== 1) Create main window ---------------------------------------------------

$mongo_user_win = wb_create_window($parent, ModalDialog, "MongoDB Create Databse assign user", WBC_CENTER, WBC_CENTER, 294, 284,
  WBC_INVISIBLE | WBC_NOTIFY | WBC_TOP, WBC_HEADERSEL);

//=== 2) Create controls for the main window ----------------------------------

wb_create_control($mongo_user_win, Frame, 'User details and db name', 5, 5, 275, 130, 0, 0, 0, 0);
wb_create_control($mongo_user_win, Label, 'User Name',             15, 25,   50, 15, 0, 0, 0, 0);
wb_create_control($mongo_user_win, EditBox, '',                    75, 25,  195, 20, IDC_USER_NAME, 0, 0, 0);
wb_create_control($mongo_user_win, Label, 'Password',              15, 50,   45, 15, 0, 0x00000000, 0, 0);
wb_create_control($mongo_user_win, EditBox, '',                    75, 50,  195, 20, IDC_USER_PASSWORD, 0, 0, 0);
wb_create_control($mongo_user_win, Label, 'Database',              15, 75,   45, 15, 0, 0x00000000, 0, 0);
wb_create_control($mongo_user_win, EditBox, '',                    75, 75,  195, 20, IDC_USER_DATABASE, 0, 0, 0);
wb_create_control($mongo_user_win, PushButton, 'Help',             15, 105,  50, 25, IDC_USER_HELP, 0, 0, 0);
wb_create_control($mongo_user_win, PushButton, 'Create or Change', 75, 105, 115, 25, IDC_USER_CREATE, 0, 0, 0);
wb_create_control($mongo_user_win, PushButton, 'Cancel',          200, 105,  70, 25, IDC_USER_CANCEL, 0, 0, 0);

wb_create_control($mongo_user_win, Frame, 'Select a database', 5, 140, 275, 105, 0, 0x00000000, 0, 0);
$list = wb_create_control($mongo_user_win, ListView, 'Head1',  20, 155, 250, 85, IDC_USER_LISTBOX, 0x00100080, 0, 0);


//=== INIT ====================
//--- Set up listview ---

  // Set column titles and widths
  wb_set_text($list, array(
    array("List of Databases", 200),
  ));

  $user_new_db = list_dbs_auth();        // Get list of dbs

  // Create rows and columns
  wb_create_items($list,$user_new_db);   // Fill list

//--- End Set up listview ---

//=== END INIT ================   

//=== 3) Assign handler function to the main window  --------------------------
wb_set_handler($mongo_user_win, "process_mysql_user");
  wb_set_image($mongo_user_win, getcwd()."/images/utray.ico");  // Add logo   
  wb_set_visible($mongo_user_win, true);               // Show window         

//=== 5) Enter application loop -----------------------------------------------
//wb_main_loop();                                  

}//==================================================== End Create function ===

//=== 4) Handler Function -----------------------------------------------------
function process_mysql_user($window, $id, $ctrl=0, $lparam1=0, $lparam2=0){
  global $user_new_db;

  switch($id) { 

  //=== CREATE DATABASE ASIGN USER ============================================
  case  IDC_USER_CREATE: 

  $name  = wb_get_text(wb_get_control($window, IDC_USER_NAME));   // Get name
  $pass  = wb_get_text(wb_get_control($window, IDC_USER_PASSWORD)); // Get pass
  $db    = wb_get_text(wb_get_control($window,  IDC_USER_DATABASE));// Get db

 // Validate - name alphanumeric
 if (!(preg_match("/^[A-Za-z0-9_]+$/", $name ))) {
  $str  = "";
  $str .= "If name is empty please enter a name\n";
  $str .= "Only alphanumeric characters allowed";
  wb_message_box($window, $str,"User Name", WBC_INFO); 
  break;
 }

 // Validate password - require six or more alphanumeric characters
 if (!(preg_match("/^[A-Za-z0-9_]{6,}$/", $pass))) {
  $str  = "";
  $str .= "If password is empty please enter a password\n";
  $str .= "Enter six or more alphanumeric characters\n";
  $str .= "Only alphanumeric characters allowed";
  wb_message_box($window, $str,"Password", WBC_INFO); 
   break;
 }

 // Validate - db name 
 if (!(preg_match("/^[A-Za-z0-9_]+$/", $db))) {
  $str  = "";
  $str .= "If name is empty please enter a name\n";
  $str .= "Only alphanumeric characters allowed";
  wb_message_box($window, $str,"DB Name", WBC_INFO); 
  break;
 }

 // Create database or update user password
 create_db_auth($db,$name,$pass); 

 // Refresh database list
 $user_new_db = list_dbs_auth();        // Get list of dbs
 $temp = $user_new_db;                                               // Save array        
 wb_delete_items (wb_get_control($window, IDC_USER_LISTBOX),NULL);   // Delete all list view entries
 wb_create_items (wb_get_control($window, IDC_USER_LISTBOX),$temp);  // Add array

   break;
  //======================================= END CREATE DATABASE ASIGN USER ===


   //=== CANCEL ===============================================================
   // Restore defaults

   case  IDC_USER_CANCEL:                       

    //-- Reset text boxes
    wb_set_text(wb_get_control($window, IDC_USER_NAME),"");       // Clear name
    wb_set_text(wb_get_control($window, IDC_USER_PASSWORD),"");   // Clear password
    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),"");   // Clear DB


    //--- Reset selected list box
    $temp = $user_new_db;                                               // Save old array        
    wb_delete_items (wb_get_control($window, IDC_USER_LISTBOX),NULL);   // Delete all list view entries
    wb_create_items (wb_get_control($window, IDC_USER_LISTBOX),$temp);  // Add array

   break;
   //============================================================ END CANCEL ===

  //=== Item selected from list ==============================================
  case IDC_USER_LISTBOX:                   // A row was selected from db list

  $sel = wb_get_selected($ctrl);               // Get selection
  $sel = $sel ? implode(", ", $sel) : "none";  // Set selected value 

  if($sel =="none"){
    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),""); // Reset Set DB
    wb_set_text(wb_get_control($window, IDC_USER_NAME),"");     // Reset User name
  }
  else{
    $selected_index = $sel;                 // Save Array index
    $contents = wb_get_text($ctrl);         // Get row selected Returns an array of arrays
    $first_array = $contents[0];            // Select first array (which is selected row)
    $db_selected_name = $first_array[0];    // Select first column (which is db)
    $db_selected_name = trim($db_selected_name); // Clean

    wb_set_text(wb_get_control($window, IDC_USER_DATABASE),$db_selected_name); // Set DB

    $users_array = get_user_auth($db_selected_name); //Select db return user/s in array

    if(empty($users_array)){       // No users
      wb_set_text(wb_get_control($window, IDC_USER_NAME),"");              // Reset User name
    }
    else{                          // Selet first user and display
      wb_set_text(wb_get_control($window, IDC_USER_NAME),$users_array[0]); // Set User name
    }
  }
  break;
  //============================================== Item selected from list ===


   case IDCLOSE:                          // Constant IDCLOSE (8) predefined 
    wb_destroy_window($window);           // Destroy the window
   break; 
  }
}
//==================================================== End Handler Function ===
?>

Top

Summary

That completes this pop-up we can now create databses and update user passwords.

Next page covers deleting a database Drop database

Top