From 6073a08a6dc398b04174fae198d6101f0106fef4 Mon Sep 17 00:00:00 2001 From: xodivorce Date: Thu, 29 Aug 2024 19:05:53 +0530 Subject: [PATCH] v1.0.1 --- .DS_Store | Bin 0 -> 6148 bytes .htaccess | 6 + assets/.DS_Store | Bin 0 -> 6148 bytes assets/css/footer.css | 48 +++++ assets/css/header.css | 55 +++++ assets/css/home.css | 203 +++++++++++++++++++ assets/images/.DS_Store | Bin 0 -> 6148 bytes assets/images/copy.png | Bin 0 -> 8794 bytes assets/images/delete.png | Bin 0 -> 8868 bytes assets/images/url.png | Bin 0 -> 7755 bytes assets/images/url.svg | 34 ++++ assets/js/header.js | 0 assets/js/home.js | 69 +++++++ footer.php | 18 ++ header.php | 16 ++ home.php | 50 +++++ index.php | 104 ++++++++++ php/config.php | 20 ++ php/delete.php | 15 ++ php/url-controll.php | 23 +++ script.js | 38 ++++ style.css | 255 +++++++++++++++++++++++ unzipper.php | 422 +++++++++++++++++++++++++++++++++++++++ url.sql | 60 ++++++ 24 files changed, 1436 insertions(+) create mode 100644 .DS_Store create mode 100644 .htaccess create mode 100644 assets/.DS_Store create mode 100644 assets/css/footer.css create mode 100644 assets/css/header.css create mode 100644 assets/css/home.css create mode 100644 assets/images/.DS_Store create mode 100644 assets/images/copy.png create mode 100644 assets/images/delete.png create mode 100644 assets/images/url.png create mode 100644 assets/images/url.svg create mode 100644 assets/js/header.js create mode 100644 assets/js/home.js create mode 100644 footer.php create mode 100644 header.php create mode 100644 home.php create mode 100644 index.php create mode 100644 php/config.php create mode 100644 php/delete.php create mode 100644 php/url-controll.php create mode 100644 script.js create mode 100644 style.css create mode 100644 unzipper.php create mode 100644 url.sql diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ce63371e5bc9b1fc9adc0639333c623217f681df GIT binary patch literal 6148 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

JLcUBcqE-D1z-F3l&6mEV+UDSYwZWS` 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 P=`f%ut143|W%ltud#nY0 literal 0 HcmV?d00001 diff --git a/assets/images/url.svg b/assets/images/url.svg new file mode 100644 index 00000000..8140f6d8 --- /dev/null +++ b/assets/images/url.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/js/header.js b/assets/js/header.js new file mode 100644 index 00000000..e69de29b diff --git a/assets/js/home.js b/assets/js/home.js new file mode 100644 index 00000000..41977676 --- /dev/null +++ b/assets/js/home.js @@ -0,0 +1,69 @@ +const form = document.querySelector(".shorten-form"), + urlInput = document.querySelector("#url-input"), + shortenBtn = document.querySelector("#shorten-btn"), + linksList = document.querySelector("#links-list"); + +shortenBtn.onclick = () => { + let xhr = new XMLHttpRequest(); + xhr.open("POST", "php/url-controll.php", true); + xhr.onload = () => { + if (xhr.readyState == 4 && xhr.status == 200) { + let data = xhr.response; + if (data.length <= 5) { + let domain = "localhost/url/"; + let shortenURL = domain + data; + + let newRow = ` +

  • + + + + +
  • + `; + linksList.insertAdjacentHTML('afterbegin', newRow); + urlInput.value = ""; // Clear the input field + location.reload(); // Reload the page after shortening + } else { + alert(data); + } + } + }; + let formData = new FormData(); + formData.append("full_url", urlInput.value); + xhr.send(formData); +}; + +// Handle copy button clicks +document.addEventListener('click', function(e) { + if (e.target.closest('.copy-btn')) { + const linkInfo = e.target.closest('li').querySelector('.short-link').textContent; + navigator.clipboard.writeText(linkInfo).catch(err => { + console.error('Failed to copy text: ', err); + }); + } + + // Handle delete button clicks + document.querySelectorAll(".delete-btn").forEach((deleteBtn) => { + deleteBtn.addEventListener("click", function () { + const linkItem = this.closest("li"); + const shortenURL = linkItem.querySelector(".short-link").textContent; + + let xhr = new XMLHttpRequest(); + xhr.open("GET", `php/delete.php?id=${shortenURL.split('/').pop()}`, true); + xhr.onload = () => { + if (xhr.readyState == 4 && xhr.status == 200) { + if (xhr.responseText === "success") { + linkItem.remove(); + } else { + alert("Failed to delete the URL."); + } + } + }; + xhr.send(); + }); + }); +}); diff --git a/footer.php b/footer.php new file mode 100644 index 00000000..4e53967a --- /dev/null +++ b/footer.php @@ -0,0 +1,18 @@ + +
    + +
    + + diff --git a/header.php b/header.php new file mode 100644 index 00000000..dad454bf --- /dev/null +++ b/header.php @@ -0,0 +1,16 @@ + +
    + + +
    + diff --git a/home.php b/home.php new file mode 100644 index 00000000..5a0e6793 --- /dev/null +++ b/home.php @@ -0,0 +1,50 @@ + + + + + + + Xeorl - Shorten your links + + + + + + +
    +
    +

    Open source inits.

    +

    Lovingly hand-crafted.

    +

    Premium link shortening for use in web, iOS, Android, and
    + desktop apps. Supported for urls. Completely open source, MIT
    + licensed and built by xodivorce.

    +
    + + +
    + +
    +
    + + + + diff --git a/index.php b/index.php new file mode 100644 index 00000000..c9d21341 --- /dev/null +++ b/index.php @@ -0,0 +1,104 @@ + $val) { + $u = mysqli_real_escape_string($conn, $key); + $new_url = str_replace('/', '', $u); + } + + // Query the database for the full URL associated with the shortened URL + $sql = mysqli_query($conn, "SELECT full_url FROM url WHERE shorten_url = '{$new_url}'"); + if (mysqli_num_rows($sql) > 0) { + // Increment the click count for the shortened URL + $sql2 = mysqli_query($conn, "UPDATE url SET clicks = clicks + 1 WHERE shorten_url = '{$new_url}'"); + if ($sql2) { + // Fetch the full URL and redirect to it + $full_url = mysqli_fetch_assoc($sql); + header("Location:" . $full_url['full_url']); + exit(); // Stop further script execution after redirection + } + } +} +?> + + + + + + + Xeorl - Shorten your links + + + + + + +
    +
    +

    Open source inits.

    +

    Lovingly hand-crafted.

    +

    Premium link shortening for use in web, iOS, Android, and
    desktop apps. Supported for urls. Completely open source, MIT
    licensed and built by xodivorce.

    +
    + + +
    + +
    +
    + + + + diff --git a/php/config.php b/php/config.php new file mode 100644 index 00000000..8261334f --- /dev/null +++ b/php/config.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/php/delete.php b/php/delete.php new file mode 100644 index 00000000..bcd64238 --- /dev/null +++ b/php/delete.php @@ -0,0 +1,15 @@ + diff --git a/php/url-controll.php b/php/url-controll.php new file mode 100644 index 00000000..33a31309 --- /dev/null +++ b/php/url-controll.php @@ -0,0 +1,23 @@ + 0){ + echo "Something went wrong. Please generate again!"; + }else{ + $sql2 = mysqli_query($conn, "INSERT INTO url (full_url, shorten_url, clicks) + VALUES ('{$full_url}', '{$ran_url}', '0')"); + if($sql2){ + $sql3 = mysqli_query($conn, "SELECT shorten_url FROM url WHERE shorten_url = '{$ran_url}'"); + if(mysqli_num_rows($sql3) > 0){ + $shorten_url = mysqli_fetch_assoc($sql3); + echo $shorten_url['shorten_url']; + } + } + } + }else{ + echo "$full_url - This is not a valid URL!"; + } +?> \ No newline at end of file diff --git a/script.js b/script.js new file mode 100644 index 00000000..50daa7d2 --- /dev/null +++ b/script.js @@ -0,0 +1,38 @@ +const form = document.querySelector(".wrapper form"), + fullURL = form.querySelector("input"), + shortenBtn = form.querySelector("form button"), + urlsArea = document.querySelector(".urls-area"); + +form.onsubmit = (e) => { + e.preventDefault(); +}; + +shortenBtn.onclick = () => { + let xhr = new XMLHttpRequest(); + xhr.open("POST", "php/url-controll.php", true); + xhr.onload = () => { + if (xhr.readyState == 4 && xhr.status == 200) { + let data = xhr.response; + if (data.length <= 5) { + // Example of setting the shortened URL directly to the list + let domain = "localhost/url/"; + let shortenURL = domain + data; + + // Create a new row for the URL and append it to the list + let newRow = ` +
    +
  • ${shortenURL}
  • +
  • ${fullURL.value}
  • +
  • 0
  • +
  • Delete
  • +
    + `; + urlsArea.insertAdjacentHTML('afterbegin', newRow); + } else { + alert(data); + } + } + }; + let formData = new FormData(form); + xhr.send(formData); +}; diff --git a/style.css b/style.css new file mode 100644 index 00000000..3886dcd2 --- /dev/null +++ b/style.css @@ -0,0 +1,255 @@ +@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + text-decoration: none; + font-family: 'Poppins', sans-serif; +} +body{ + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; + background: #20B2AA; + padding: 0 10px; +} +.wrapper{ + background: #fff; + padding: 20px; + width: 800px; + border-radius: 5px; + box-shadow: 0px 5px 10px rgba(0,0,0,0.1); +} +::selection{ + background: rgba(23,162,184,0.3); +} +.wrapper form{ + height: 50px; + width: 100%; + display: flex; + position: relative; + align-items: center; +} +form .url-icon{ + position: absolute; + width: 50px; + text-align: center; + font-size: 23px; + color: #c4c4c4; + pointer-events: none; +} +form input:valid ~ .url-icon{ + color: #20B2AA; +} +form input{ + height: 100%; + width: 100%; + outline: none; + padding: 0 120px 0 45px; + font-size: 20px; + caret-color: #20B2AA; + border: 2px solid #ddd; + border-radius: 5px; + transition: all 0.1s ease; +} +form input:valid{ + border-color: #20B2AA; +} +form input::placeholder{ + color: #c4c4c4; +} +form input:focus::placeholder{ + color: #d9d9d9; +} +form button{ + position: absolute; + right: 6px; + padding: 5px 15px; + font-size: 18px; + border-radius: 5px; + border: none; + outline: none; + background: #20B2AA; + color: #fff; + cursor: pointer; + transition: all 0.3s ease; +} +form button:hover{ + background: #1fada6; +} +.wrapper form button{ + opacity: 0; + pointer-events: none; +} +.wrapper form input:valid ~ button{ + opacity: 1; + pointer-events: auto; +} +.wrapper a{ + color: #000; +} + +.wrapper .statistics{ + margin: 20px 0; + display: flex; + padding-right: 5px; + align-items: center; + justify-content: space-between; +} +.statistics span{ + font-size: 17px; +} +.statistics span span{ + font-weight: 500; +} +.statistics a:hover{ + color: #20B2AA; +} + +.wrapper .urls-area{ + border: 1px solid #ddd; + border-radius: 5px; + margin-bottom: 5px; + max-height: 400px; + overflow-y: scroll; +} +.urls-area::-webkit-scrollbar{ + width: 0px; +} +.urls-area :is(.title, .data){ + display: flex; + width: 100%; + justify-content: space-between; +} +.urls-area li{ + width: 100%; + list-style: none; + border-right: 1px solid #ddd; +} +.urls-area li:last-child{ + border-right: 0px; +} +.urls-area .title li{ + text-align: center; + background: #f2f2f2; + padding: 10px 0; +} +.urls-area .data li{ + padding: 8px 10px; + display: flex; + align-items: center; + justify-content: center; + word-break: break-all; +} +.urls-area .data li:last-child a{ + height: 100%; + width: 100%; + display: flex; + align-items: center; + justify-content: center; +} +.urls-area .data li a:hover{ + color: #20B2AA; + text-decoration: underline; +} +.urls-area .data li:last-child a:hover{ + text-decoration: none; +} +.urls-area .data:nth-child(odd){ + background: #f2f2f2; +} +.urls-area li:nth-child(1){ + max-width: 30%; +} +.urls-area li:nth-child(2){ + max-width: 45%; +} +.urls-area li:nth-child(3){ + max-width: 11%; +} +.urls-area li:nth-child(4){ + max-width: 14%; +} + +.blur-effect{ + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + backdrop-filter: blur(2px); + background: rgba(0,0,0,0.01); + display: none; +} +.popup-box{ + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) scale(0.9); + background: #fff; + padding: 25px; + max-width: 480px; + width: 100%; + border-radius: 5px; + box-shadow: 0px 5px 10px rgba(0,0,0,0.1); + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: all 0.3s ease; +} +.popup-box.show{ + opacity: 1; + pointer-events: auto; + visibility: visible; + transform: translate(-50%, -50%) scale(1); +} +.popup-box .info-box{ + color: #0f5753; + background: #bef4f1; + border: 1px solid #7de8e3; + padding: 10px; + text-align: center; + font-size: 17px; + border-radius: 5px; +} +.popup-box .info-box.error{ + color: #721c24; + background: #f8d7da; + border-color: #f5c6cb; +} +.popup-box form{ + margin-top: 10px; + position: relative; +} +.popup-box form label{ + font-size: 18px; +} +.popup-box form .copy-icon{ + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-100%); + font-size: 20px; + cursor: pointer; +} +.copy-icon:hover{ + color: #20B2AA; +} +.popup-box form input{ + height: 45px; + padding: 0 35px 0 15px; + margin-top: 3px; + border: 1px solid #ccc; +} +.popup-box form input:focus{ + border-color: #20B2AA; +} +.popup-box form button{ + width: 100%; + height: 45px; + position: relative; + right: 0; + font-size: 20px; + margin-top: 10px; +} \ No newline at end of file diff --git a/unzipper.php b/unzipper.php new file mode 100644 index 00000000..b7b1bbc1 --- /dev/null +++ b/unzipper.php @@ -0,0 +1,422 @@ +prepareExtraction($archive, $destination); +} + +if (isset($_POST['dozip'])) { + $zippath = !empty($_POST['zippath']) ? strip_tags($_POST['zippath']) : '.'; + // Resulting zipfile e.g. zipper--2016-07-23--11-55.zip. + $zipfile = 'zipper-' . date("Y-m-d--H-i") . '.zip'; + Zipper::zipDir($zippath, $zipfile); +} + +$timeend = microtime(TRUE); +$time = round($timeend - $timestart, 4); + +/** + * Class Unzipper + */ +class Unzipper { + public $localdir = '.'; + public $zipfiles = array(); + + public function __construct() { + // Read directory and pick .zip, .rar and .gz files. + if ($dh = opendir($this->localdir)) { + while (($file = readdir($dh)) !== FALSE) { + if (pathinfo($file, PATHINFO_EXTENSION) === 'zip' + || pathinfo($file, PATHINFO_EXTENSION) === 'gz' + || pathinfo($file, PATHINFO_EXTENSION) === 'rar' + ) { + $this->zipfiles[] = $file; + } + } + closedir($dh); + + if (!empty($this->zipfiles)) { + $GLOBALS['status'] = array('info' => '.zip or .gz or .rar files found, ready for extraction'); + } + else { + $GLOBALS['status'] = array('info' => 'No .zip or .gz or rar files found. So only zipping functionality available.'); + } + } + } + + /** + * Prepare and check zipfile for extraction. + * + * @param string $archive + * The archive name including file extension. E.g. my_archive.zip. + * @param string $destination + * The relative destination path where to extract files. + */ + public function prepareExtraction($archive, $destination = '') { + // Determine paths. + if (empty($destination)) { + $extpath = $this->localdir; + } + else { + $extpath = $this->localdir . '/' . $destination; + // Todo: move this to extraction function. + if (!is_dir($extpath)) { + mkdir($extpath); + } + } + // Only local existing archives are allowed to be extracted. + if (in_array($archive, $this->zipfiles)) { + self::extract($archive, $extpath); + } + } + + /** + * Checks file extension and calls suitable extractor functions. + * + * @param string $archive + * The archive name including file extension. E.g. my_archive.zip. + * @param string $destination + * The relative destination path where to extract files. + */ + public static function extract($archive, $destination) { + $ext = pathinfo($archive, PATHINFO_EXTENSION); + switch ($ext) { + case 'zip': + self::extractZipArchive($archive, $destination); + break; + case 'gz': + self::extractGzipFile($archive, $destination); + break; + case 'rar': + self::extractRarArchive($archive, $destination); + break; + } + + } + + /** + * Decompress/extract a zip archive using ZipArchive. + * + * @param $archive + * @param $destination + */ + public static function extractZipArchive($archive, $destination) { + // Check if webserver supports unzipping. + if (!class_exists('ZipArchive')) { + $GLOBALS['status'] = array('error' => 'Error: Your PHP version does not support unzip functionality.'); + return; + } + + $zip = new ZipArchive; + + // Check if archive is readable. + if ($zip->open($archive) === TRUE) { + // Check if destination is writable + if (is_writeable($destination . '/')) { + $zip->extractTo($destination); + $zip->close(); + $GLOBALS['status'] = array('success' => 'Files unzipped successfully'); + } + else { + $GLOBALS['status'] = array('error' => 'Error: Directory not writeable by webserver.'); + } + } + else { + $GLOBALS['status'] = array('error' => 'Error: Cannot read .zip archive.'); + } + } + + /** + * Decompress a .gz File. + * + * @param string $archive + * The archive name including file extension. E.g. my_archive.zip. + * @param string $destination + * The relative destination path where to extract files. + */ + public static function extractGzipFile($archive, $destination) { + // Check if zlib is enabled + if (!function_exists('gzopen')) { + $GLOBALS['status'] = array('error' => 'Error: Your PHP has no zlib support enabled.'); + return; + } + + $filename = pathinfo($archive, PATHINFO_FILENAME); + $gzipped = gzopen($archive, "rb"); + $file = fopen($destination . '/' . $filename, "w"); + + while ($string = gzread($gzipped, 4096)) { + fwrite($file, $string, strlen($string)); + } + gzclose($gzipped); + fclose($file); + + // Check if file was extracted. + if (file_exists($destination . '/' . $filename)) { + $GLOBALS['status'] = array('success' => 'File unzipped successfully.'); + + // If we had a tar.gz file, let's extract that tar file. + if (pathinfo($destination . '/' . $filename, PATHINFO_EXTENSION) == 'tar') { + $phar = new PharData($destination . '/' . $filename); + if ($phar->extractTo($destination)) { + $GLOBALS['status'] = array('success' => 'Extracted tar.gz archive successfully.'); + // Delete .tar. + unlink($destination . '/' . $filename); + } + } + } + else { + $GLOBALS['status'] = array('error' => 'Error unzipping file.'); + } + + } + + /** + * Decompress/extract a Rar archive using RarArchive. + * + * @param string $archive + * The archive name including file extension. E.g. my_archive.zip. + * @param string $destination + * The relative destination path where to extract files. + */ + public static function extractRarArchive($archive, $destination) { + // Check if webserver supports unzipping. + if (!class_exists('RarArchive')) { + $GLOBALS['status'] = array('error' => 'Error: Your PHP version does not support .rar archive functionality. How to install RarArchive'); + return; + } + // Check if archive is readable. + if ($rar = RarArchive::open($archive)) { + // Check if destination is writable + if (is_writeable($destination . '/')) { + $entries = $rar->getEntries(); + foreach ($entries as $entry) { + $entry->extract($destination); + } + $rar->close(); + $GLOBALS['status'] = array('success' => 'Files extracted successfully.'); + } + else { + $GLOBALS['status'] = array('error' => 'Error: Directory not writeable by webserver.'); + } + } + else { + $GLOBALS['status'] = array('error' => 'Error: Cannot read .rar archive.'); + } + } + +} + +/** + * Class Zipper + * + * Copied and slightly modified from http://at2.php.net/manual/en/class.ziparchive.php#110719 + * @author umbalaconmeogia + */ +class Zipper { + /** + * Add files and sub-directories in a folder to zip file. + * + * @param string $folder + * Path to folder that should be zipped. + * + * @param ZipArchive $zipFile + * Zipfile where files end up. + * + * @param int $exclusiveLength + * Number of text to be exclusived from the file path. + */ + private static function folderToZip($folder, &$zipFile, $exclusiveLength) { + $handle = opendir($folder); + + while (FALSE !== $f = readdir($handle)) { + // Check for local/parent path or zipping file itself and skip. + if ($f != '.' && $f != '..' && $f != basename(__FILE__)) { + $filePath = "$folder/$f"; + // Remove prefix from file path before add to zip. + $localPath = substr($filePath, $exclusiveLength); + + if (is_file($filePath)) { + $zipFile->addFile($filePath, $localPath); + } + elseif (is_dir($filePath)) { + // Add sub-directory. + $zipFile->addEmptyDir($localPath); + self::folderToZip($filePath, $zipFile, $exclusiveLength); + } + } + } + closedir($handle); + } + + /** + * Zip a folder (including itself). + * + * Usage: + * Zipper::zipDir('path/to/sourceDir', 'path/to/out.zip'); + * + * @param string $sourcePath + * Relative path of directory to be zipped. + * + * @param string $outZipPath + * Relative path of the resulting output zip file. + */ + public static function zipDir($sourcePath, $outZipPath) { + $pathInfo = pathinfo($sourcePath); + $parentPath = $pathInfo['dirname']; + $dirName = $pathInfo['basename']; + + $z = new ZipArchive(); + $z->open($outZipPath, ZipArchive::CREATE); + $z->addEmptyDir($dirName); + if ($sourcePath == $dirName) { + self::folderToZip($sourcePath, $z, 0); + } + else { + self::folderToZip($sourcePath, $z, strlen("$parentPath/")); + } + $z->close(); + + $GLOBALS['status'] = array('success' => 'Successfully created archive ' . $outZipPath); + } +} +?> + + + + + File Unzipper + Zipper + + + + +

    + Status:
    + Processing Time: seconds +

    +
    +
    +

    Archive Unzipper

    + + + + +

    Enter extraction path without leading or trailing slashes (e.g. "mypath"). If left empty current directory will be used.

    + +
    + +
    +

    Archive Zipper

    + + +

    Enter path to be zipped without leading or trailing slashes (e.g. "zippath"). If left empty current directory will be used.

    + +
    +
    +

    Unzipper version:

    + + diff --git a/url.sql b/url.sql new file mode 100644 index 00000000..f5897987 --- /dev/null +++ b/url.sql @@ -0,0 +1,60 @@ +-- phpMyAdmin SQL Dump +-- version 5.0.4 +-- https://www.phpmyadmin.net/ +-- +-- Host: 127.0.0.1 +-- Generation Time: Mar 18, 2021 at 10:27 AM +-- Server version: 10.4.17-MariaDB +-- PHP Version: 7.3.26 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Database: `urlshortener` +-- + +-- -------------------------------------------------------- + +-- +-- Table structure for table `url` +-- + +CREATE TABLE `url` ( + `id` int(11) NOT NULL, + `shorten_url` varchar(200) NOT NULL, + `full_url` varchar(1000) NOT NULL, + `clicks` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Indexes for dumped tables +-- + +-- +-- Indexes for table `url` +-- +ALTER TABLE `url` + ADD PRIMARY KEY (`id`); + +-- +-- AUTO_INCREMENT for dumped tables +-- + +-- +-- AUTO_INCREMENT for table `url` +-- +ALTER TABLE `url` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=53; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;