-
Notifications
You must be signed in to change notification settings - Fork 0
/
Urlshortener.cpp
106 lines (89 loc) · 2.13 KB
/
Urlshortener.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <string>
#include <iostream>
#include <sys/time.h>
#include <cstdlib>
#include <ctime>
#include "UrlShortener.h"
#include "DBManager.h"
UrlShortener::UrlShortener()
{
m_pDBManager = CreateDBManager();
m_pDBManager->Init();
}
UrlShortener::~UrlShortener()
{
if( m_pDBManager )
{
m_pDBManager->Close();
delete m_pDBManager;
m_pDBManager = NULL;
}
}
static const char alphanum[] =
"0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
char genRandom()
{
return alphanum[rand() % (sizeof(alphanum) - 1)];
}
std::string UrlShortener::GenerateRandomString()
{
std::string result;
srand(time(0));
for(unsigned int i = 0; i < 5; ++i)
{
result += genRandom();
}
return result;
}
#define MAX_TRIES 10
UrlMapping UrlShortener::AddNewUrlMapping( std::string& longUrl )
{
UrlMapping newMapping;
newMapping.SetLongUrl( longUrl );
UrlMapping existingMapping;
if( !m_pDBManager->GetShortUrlMapping( longUrl, &existingMapping ) )
{
std::string shortUrl;
int tries = 0;
do
{
// Generate a random string for the short URL. Make sure we have
// not inserted the same random string before.
shortUrl = GenerateRandomString();
tries++;
if( tries == MAX_TRIES )
{
throw;
}
}while( m_pDBManager->GetLongUrlMapping( shortUrl, &existingMapping ));
newMapping.SetShortUrl(shortUrl);
if( !m_pDBManager->AddUrlMapping(&newMapping) )
throw;
return newMapping;
}
return existingMapping;
}
UrlMapping UrlShortener::GetLongUrlMapping( std::string& shortUrl )
{
UrlMapping existingMapping;
if( !m_pDBManager->GetLongUrlMapping( shortUrl, &existingMapping ) )
{
throw URLNotFoundException( shortUrl );
}
return existingMapping;
}
UrlMapping UrlShortener::GetShortUrlMapping( std::string& longUrl )
{
UrlMapping existingMapping;
if( !m_pDBManager->GetShortUrlMapping( longUrl, &existingMapping ) )
{
throw URLNotFoundException( longUrl );
}
return existingMapping;
}
std::vector<UrlMapping> UrlShortener::GetAllMappings()
{
return m_pDBManager->ListAllMappings();
}