]> CyberLeo.Net >> Repos - Github/YOURLS.git/blob - includes/functions-install.php
1.4-alpha massive commit:
[Github/YOURLS.git] / includes / functions-install.php
1 <?php\r
2 \r
3 // Check if YOURLS is installed\r
4 function yourls_is_installed() {\r
5         static $is_installed = false;\r
6         if (!$is_installed) {\r
7                 global $ydb;\r
8                 $is_installed = $ydb->get_var('SELECT next_id FROM '.YOURLS_DB_TABLE_NEXTDEC);\r
9         }\r
10         return (bool)$is_installed;\r
11 }\r
12 \r
13 // Check if mod_rewrite is enabled\r
14 function yourls_check_mod_rewrite() {\r
15         return yourls_apache_mod_loaded('mod_rewrite');\r
16 }\r
17 \r
18 // Check if extension cURL is enabled\r
19 function yourls_check_curl() {\r
20         return function_exists('curl_init');\r
21 }\r
22 \r
23 // Check if extension BC Math is enabled\r
24 function yourls_check_bcmath() {\r
25         return function_exists('bccomp');\r
26 }\r
27 \r
28 // Check if server has MySQL 4.1+\r
29 function yourls_check_database_version() {\r
30         global $ydb;\r
31         return ( version_compare( '4.1', $ydb->mysql_version() ) <= 0 );\r
32 }\r
33 \r
34 // Check if PHP > 4.3\r
35 function yourls_check_php_version() {\r
36         return ( version_compare( '4.3', phpversion() ) <= 0 );\r
37 }\r
38 \r
39 // Check if server is an Apache\r
40 function yourls_is_apache() {\r
41         return (\r
42            strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false\r
43         || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false\r
44         );\r
45 }\r
46 \r
47 // Check if module exists in Apache config. Input string eg 'mod_rewrite', return true or $default\r
48 function yourls_apache_mod_loaded($mod, $default = false) {\r
49         if ( !yourls_is_apache() )\r
50                 return false;\r
51 \r
52         if ( function_exists('apache_get_modules') ) {\r
53                 $mods = apache_get_modules();\r
54                 if ( in_array($mod, $mods) )\r
55                         return true;\r
56         } elseif ( function_exists('phpinfo') ) {\r
57                         ob_start();\r
58                         phpinfo(8);\r
59                         $phpinfo = ob_get_clean();\r
60                         if ( false !== strpos($phpinfo, $mod) )\r
61                                 return true;\r
62         }\r
63         return $default;\r
64 }\r
65 \r
66 // Create .htaccess. Returns boolean\r
67 function yourls_create_htaccess() {\r
68         $host = parse_url( YOURLS_SITE );\r
69         $path = ( isset( $host['path'] ) ? $host['path'] : '' );\r
70 \r
71         $content = array(\r
72                 '<IfModule mod_rewrite.c>',\r
73                 'RewriteEngine On',\r
74                 'RewriteBase '.$path.'/',\r
75                 'RewriteCond %{REQUEST_FILENAME} !-f',\r
76                 'RewriteCond %{REQUEST_FILENAME} !-d',\r
77                 'RewriteRule ^([0-9A-Za-z]+)/?$ '.$path.'/yourls-go.php?id=$1 [L]',\r
78                 '</IfModule>',\r
79         );\r
80         \r
81         $filename = dirname(dirname(__FILE__)).'/.htaccess';\r
82         \r
83         return ( yourls_insert_with_markers( $filename, 'YOURLS', $content ) );\r
84 }\r
85 \r
86 // Inserts $insertion (text in an array of lines) into $filename (.htaccess) between BEGIN/END $marker block. Returns bool. Stolen from WP\r
87 function yourls_insert_with_markers( $filename, $marker, $insertion ) {\r
88         if (!file_exists( $filename ) || is_writeable( $filename ) ) {\r
89                 if (!file_exists( $filename ) ) {\r
90                         $markerdata = '';\r
91                 } else {\r
92                         $markerdata = explode( "\n", implode( '', file( $filename ) ) );\r
93                 }\r
94 \r
95                 if ( !$f = @fopen( $filename, 'w' ) )\r
96                         return false;\r
97 \r
98                 $foundit = false;\r
99                 if ( $markerdata ) {\r
100                         $state = true;\r
101                         foreach ( $markerdata as $n => $markerline ) {\r
102                                 if (strpos($markerline, '# BEGIN ' . $marker) !== false)\r
103                                         $state = false;\r
104                                 if ( $state ) {\r
105                                         if ( $n + 1 < count( $markerdata ) )\r
106                                                 fwrite( $f, "{$markerline}\n" );\r
107                                         else\r
108                                                 fwrite( $f, "{$markerline}" );\r
109                                 }\r
110                                 if (strpos($markerline, '# END ' . $marker) !== false) {\r
111                                         fwrite( $f, "# BEGIN {$marker}\n" );\r
112                                         if ( is_array( $insertion ))\r
113                                                 foreach ( $insertion as $insertline )\r
114                                                         fwrite( $f, "{$insertline}\n" );\r
115                                         fwrite( $f, "# END {$marker}\n" );\r
116                                         $state = true;\r
117                                         $foundit = true;\r
118                                 }\r
119                         }\r
120                 }\r
121                 if (!$foundit) {\r
122                         fwrite( $f, "\n# BEGIN {$marker}\n" );\r
123                         foreach ( $insertion as $insertline )\r
124                                 fwrite( $f, "{$insertline}\n" );\r
125                         fwrite( $f, "# END {$marker}\n" );\r
126                 }\r
127                 fclose( $f );\r
128                 return true;\r
129         } else {\r
130                 return false;\r
131         }\r
132 }\r
133 \r
134 // Create MySQL tables. Return array( 'success' => array of success strings, 'errors' => array of error strings )\r
135 function yourls_create_sql_tables() {\r
136         global $ydb;\r
137         \r
138         $error_msg = array();\r
139         $success_msg = array();\r
140 \r
141         // Create Table Query\r
142         $create_tables = array();\r
143         $create_tables[YOURLS_DB_TABLE_URL] =\r
144                 'CREATE TABLE IF NOT EXISTS `'.YOURLS_DB_TABLE_URL.'` ('.\r
145                 '`keyword` varchar(200) NOT NULL,'.\r
146                 '`url` VARCHAR(200) NOT NULL,'.\r
147                 '`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,'.\r
148                 '`ip` VARCHAR(41) NOT NULL,'.\r
149                 '`clicks` INT(10) UNSIGNED NOT NULL,'.\r
150                 'PRIMARY KEY  (`keyword`)'.\r
151                 ') ENGINE=MyISAM DEFAULT CHARSET=utf8 ;';\r
152 \r
153         $create_tables[YOURLS_DB_TABLE_OPTIONS] = \r
154                 'CREATE TABLE IF NOT EXISTS `'.YOURLS_DB_TABLE_OPTIONS.'` ('.\r
155                 '`option_id` bigint(20) unsigned NOT NULL auto_increment,'.\r
156                 '`option_name` varchar(64) NOT NULL default "",'.\r
157                 '`option_value` longtext NOT NULL,'.\r
158                 'PRIMARY KEY  (`option_id`,`option_name`),'.\r
159                 'KEY `option_name` (`option_name`)'.\r
160                 ') ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;';\r
161                 \r
162         $create_tables[YOURLS_DB_TABLE_LOG] = \r
163                 'CREATE TABLE IF NOT EXISTS `'.YOURLS_DB_TABLE_LOG.'` ('.\r
164                 '`click_id` int(11) NOT NULL auto_increment,'.\r
165                 '`click_time` datetime NOT NULL,'.\r
166                 '`shorturl` varchar(200) NOT NULL,'.\r
167                 '`referrer` varchar(200) NOT NULL,'.\r
168                 '`user_agent` varchar(255) NOT NULL,'.\r
169                 '`ip_address` varchar(41) NOT NULL,'.\r
170                 '`country_code` char(2) NOT NULL,'.\r
171                 'PRIMARY KEY  (`click_id`),'.\r
172                 'KEY `shorturl` (`shorturl`,`referrer`,`country_code`)'.\r
173                 ') ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;';\r
174 \r
175 \r
176         // Insert Initial Records\r
177         $insert_queries = array();\r
178         $insert_queries[] = 'INSERT INTO '.YOURLS_DB_TABLE_OPTIONS.' VALUES (1, "next_id", 1)';\r
179         $insert_queries[] = 'INSERT INTO '.YOURLS_DB_TABLE_OPTIONS.' VALUES (2, "version", '.YOURLS_VERSION.')';\r
180         $insert_queries[] = 'INSERT INTO '.YOURLS_DB_TABLE_OPTIONS.' VALUES (3, "db_version", '.YOURLS_DB_VERSION.')';\r
181 \r
182         $create_table_count = 0;\r
183         $insert_query_count = 0;\r
184         \r
185         //$ydb->show_errors = false;\r
186         \r
187         // Create tables\r
188         foreach ( $create_tables as $table_name => $table_query ) {\r
189                 $ydb->query($table_query);\r
190                 $create_success = $ydb->query("SHOW TABLES LIKE '$table_name'");\r
191                 if($create_success) {\r
192                         $create_table_count++;\r
193                         $success_msg[] = "Table '$table_name' created."; \r
194                 } else {\r
195                         $error_msg[] = "Error creating table '$table_name'."; \r
196                 }\r
197         }\r
198         \r
199         // Insert data into tables\r
200         foreach ( $insert_queries as $insert_query ) {\r
201                 $insert_success = $ydb->query( $insert_query );\r
202                 if( $insert_success ) {\r
203                         $insert_query_count++;\r
204                         $success_msg[] = 'Query '.$insert_query_count.'/'.sizeof($insert_queries).' executed successfully.'; \r
205                 } else {\r
206                         $error_msg[] = 'Error executing '.$insert_query_count.'/'.sizeof($insert_queries).'.'; \r
207                 }\r
208         }\r
209         \r
210         // Check results of operations\r
211         if ( sizeof($create_tables) == $create_table_count && sizeof($insert_queries) == $insert_query_count ) {\r
212                 $success_msg[] = 'YOURLS tables successfully created.';\r
213         } else {\r
214                 $error_msg[] = "Error creating YOURLS tables."; \r
215         }\r
216 \r
217         return array( 'success' => $success_msg, 'error' => $error_msg );\r
218 }\r
219 ?>\r