{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c0461204-5a0c-4e1e-9529-825b5f11d648",
   "metadata": {},
   "outputs": [],
   "source": [
    "from DATA225utils import make_connection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "23e4399e-da9b-46a7-9170-b9adf097db4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "conn = make_connection(config_file = 'month.ini')\n",
    "cursor = conn.cursor()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "3478f05c-9927-43ec-9590-255d26b1900c",
   "metadata": {},
   "outputs": [],
   "source": [
    "cursor.execute('DROP PROCEDURE IF EXISTS insert_date')\n",
    "cursor.execute('DROP PROCEDURE IF EXISTS while_proc')\n",
    "cursor.execute('DROP PROCEDURE IF EXISTS repeat_proc')\n",
    "cursor.execute('DROP PROCEDURE IF EXISTS loop_proc')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8c6b0132-9d98-4da9-8a73-86401eca5513",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "cursor.execute( \n",
    "    \"\"\"\n",
    "    CREATE PROCEDURE insert_date(IN method VARCHAR(16), IN full_date DATE, \n",
    "                                 IN day_of_week_name VARCHAR(9))\n",
    "    BEGIN\n",
    "        INSERT INTO dates(method, full_date, day_of_week_name,\n",
    "                          day_number, month_number, year_number)\n",
    "        VALUES (method, full_date, day_of_week_name,\n",
    "                EXTRACT(DAY   FROM full_date),\n",
    "                EXTRACT(MONTH FROM full_date),\n",
    "                EXTRACT(YEAR  FROM full_date));\n",
    "    END\n",
    "    \"\"\"\n",
    "              )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3c5ba6e0-5d9d-47e6-b503-920400470550",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "cursor.execute( \n",
    "    \"\"\"\n",
    "    CREATE PROCEDURE while_proc(IN starting_date DATE, \n",
    "                                IN starting_day_of_week INT)\n",
    "    BEGIN\n",
    "        DECLARE this_date        DATE DEFAULT starting_date;\n",
    "        DECLARE day_of_week      INT  DEFAULT starting_day_of_week;\n",
    "        DECLARE day_number       INT  DEFAULT 1;\n",
    "        DECLARE day_of_week_name VARCHAR(9);\n",
    "\n",
    "        WHILE day_number <= 31 DO\n",
    "            IF day_of_week = 0\n",
    "                THEN SET day_of_week_name = 'Sunday';\n",
    "            ELSEIF day_of_week = 1\n",
    "                THEN SET day_of_week_name = 'Monday';\n",
    "            ELSEIF day_of_week = 2\n",
    "                THEN SET day_of_week_name = 'Tuesday';\n",
    "            ELSEIF day_of_week = 3\n",
    "                THEN SET day_of_week_name = 'Wednesday';\n",
    "            ELSEIF day_of_week = 4\n",
    "                THEN SET day_of_week_name = 'Thursday';\n",
    "            ELSEIF day_of_week = 5\n",
    "                THEN SET day_of_week_name = 'Friday';\n",
    "            ELSE\n",
    "                SET day_of_week_name = 'Saturday';\n",
    "                SET day_of_week = -1;\n",
    "            END IF;\n",
    "\n",
    "            CALL insert_date('while', this_date, day_of_week_name);\n",
    "\n",
    "            SET day_number   = day_number  + 1;\n",
    "            SET day_of_week  = day_of_week + 1;\n",
    "            SET this_date    = DATE_ADD(this_date, INTERVAL 1 DAY);\n",
    "        END WHILE;\n",
    "    END\n",
    "    \"\"\"\n",
    "              )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5595e866-4322-4201-b1b9-1a85c4d3b0fb",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "cursor.execute( \n",
    "    \"\"\"\n",
    "    CREATE PROCEDURE repeat_proc(IN starting_date DATE, \n",
    "                                 IN starting_day_of_week INT)\n",
    "    BEGIN\n",
    "        DECLARE this_date        DATE DEFAULT starting_date;\n",
    "        DECLARE day_of_week      INT  DEFAULT starting_day_of_week;\n",
    "        DECLARE day_number       INT  DEFAULT 1;\n",
    "        DECLARE day_of_week_name VARCHAR(9);\n",
    "\n",
    "        REPEAT\n",
    "            IF day_of_week = 0\n",
    "                THEN SET day_of_week_name = 'Sunday';\n",
    "            ELSEIF day_of_week = 1\n",
    "                THEN SET day_of_week_name = 'Monday';\n",
    "            ELSEIF day_of_week = 2\n",
    "                THEN SET day_of_week_name = 'Tuesday';\n",
    "            ELSEIF day_of_week = 3\n",
    "                THEN SET day_of_week_name = 'Wednesday';\n",
    "            ELSEIF day_of_week = 4\n",
    "                THEN SET day_of_week_name = 'Thursday';\n",
    "            ELSEIF day_of_week = 5\n",
    "                THEN SET day_of_week_name = 'Friday';\n",
    "            ELSE\n",
    "                SET day_of_week_name = 'Saturday';\n",
    "                SET day_of_week = -1;\n",
    "            END IF;\n",
    "\n",
    "            CALL insert_date('repeat', this_date, day_of_week_name);\n",
    "\n",
    "            SET day_number   = day_number  + 1;\n",
    "            SET day_of_week  = day_of_week + 1;\n",
    "            SET this_date    = DATE_ADD(this_date, INTERVAL 1 DAY);\n",
    "        UNTIL day_number > 31\n",
    "        END REPEAT;\n",
    "    END\n",
    "    \"\"\"\n",
    "              )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "0b2a32b5-a14f-4976-b751-8770bda7e543",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "cursor.execute( \n",
    "    \"\"\"\n",
    "    CREATE PROCEDURE loop_proc(IN starting_date DATE, \n",
    "                               IN starting_day_of_week INT)\n",
    "    BEGIN\n",
    "        DECLARE this_date        DATE DEFAULT starting_date;\n",
    "        DECLARE day_of_week      INT  DEFAULT starting_day_of_week;\n",
    "        DECLARE day_number       INT  DEFAULT 1;\n",
    "        DECLARE day_of_week_name VARCHAR(9);\n",
    "\n",
    "        date_loop: LOOP\n",
    "            CASE day_of_week\n",
    "                WHEN 0 THEN SET day_of_week_name = 'Sunday';\n",
    "                WHEN 1 THEN SET day_of_week_name = 'Monday';\n",
    "                WHEN 2 THEN SET day_of_week_name = 'Tuesday';\n",
    "                WHEN 3 THEN SET day_of_week_name = 'Wednesday';\n",
    "                WHEN 4 THEN SET day_of_week_name = 'Thursday';\n",
    "                WHEN 5 THEN SET day_of_week_name = 'Friday';\n",
    "                ELSE\n",
    "                    SET day_of_week_name = 'Saturday';\n",
    "                    SET day_of_week = -1;\n",
    "            END CASE;\n",
    "\n",
    "            CALL insert_date('loop', this_date, day_of_week_name);\n",
    "\n",
    "            IF day_number = 31 THEN LEAVE date_loop; END IF;\n",
    "\n",
    "            SET day_number   = day_number  + 1;\n",
    "            SET day_of_week  = day_of_week + 1;\n",
    "            SET this_date    = DATE_ADD(this_date, INTERVAL 1 DAY);\n",
    "        END LOOP;\n",
    "    END   \n",
    "    \"\"\"\n",
    "              )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "a0533d8c-1642-4be4-b61a-ae26488ef7c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "cursor.close()\n",
    "conn.close()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
